diff --git a/.gitignore b/.gitignore index 4cc20fa..cc9f215 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,13 @@ 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 +*MARKETING-LOG.txt +*STATUS-LOG.txt +*_DAILY_CARE.md +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..2d4d036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,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/MARKETING-LOG.txt b/MARKETING-LOG.txt deleted file mode 100644 index 03770b6..0000000 --- a/MARKETING-LOG.txt +++ /dev/null @@ -1,136 +0,0 @@ -# MARKETING-LOG: SoftwareCenter -# Status: ACTIVE / PFAD B DISCOVERABILITY, VISUAL ARCHITECTURE & METADATA CERTIFIED -# Repository: file-bricks/SoftwareCenter -# Organization: file-bricks (Umbrella: open-bricks) -# Audit Date: 2026-09-14 -# Tested Baseline: 236 passed | 5 skipped | 100% green - -================================================================================ -1. TARGET PERSONAS & MARKET SEGMENTS -================================================================================ - -Persona 1: Desktop Power Users & Organization Curators -- Role: Professionals running dozens of specialized tools, scripts, documents, and workspace folders simultaneously. -- Core Pain: Cluttered Windows Desktop, convoluted Start Menu search latency, and lack of persistent multi-board categorization. -- Value Proposition: Lightweight, lightning-fast PySide6 shortcut board manager with instant category switching, custom icon assignments, notes, and drag-and-drop organization. - -Persona 2: Solo Software Developers, DevOps & System Engineers -- Role: Developers managing project-specific launchers, CLI utilities, portable apps, and virtual environment scripts. -- Core Pain: Mixing development toolchains into personal application menus; complex launcher apps with heavy background daemon overhead. -- Value Proposition: Multi-profile separation (SoftwareCenter vs LaunchBoards), working directory integrity preservation (_startfile_in_dir), headless profile maintenance, and instantaneous launching. - -Persona 3: Multi-PC Workstation Operators & Cloud-Sync Engineers -- Role: Users synchronizing configurations across multiple workstations (e.g. Workstation and Laptop) without exposing machine-specific secrets. -- Core Pain: Hardcoded file paths, absolute paths to non-existent drive letters, or secret leakages in desktop configuration files across different hosts. -- Value Proposition: Schema-validated portable profile export (softwarecenter-profile-v1.json) with strict secret scrubbing, non-destructive import merging, and drive-independent target verification. - -Persona 4: Privacy-Conscious & Zero-Telemetry Advocates -- Role: Security-conscious individuals and enterprise environments requiring zero outbound internet traffic. -- Core Pain: Commercial desktop organizers that phone home, require proprietary cloud accounts, or bundle background telemetry. -- Value Proposition: 100% offline local-first execution (INV-LOCAL-01), zero network egress, unprivileged non-elevation execution, and standard QSettings INI persistence. - -================================================================================ -2. HIGH-INTENT SEARCH TERM MATRIX -================================================================================ - -English High-Intent Search Phrases: -- 'SoftwareCenter Python desktop launcher' -- 'file-bricks SoftwareCenter' -- 'PySide6 desktop shortcut manager' -- 'open source application board manager Windows' -- 'local-first desktop organizer python' -- 'portable shortcut launcher without cloud account' -- 'SoftwareCenter vs LaunchBoards profile switcher' -- 'headless desktop profile organizer JSON' -- 'privacy friendly Windows app launcher' -- 'multi tab application shortcut dock' - -German High-Intent Search Phrases: -- 'SoftwareCenter Desktop Schnellstarter Python' -- 'file-bricks SoftwareCenter Anwendungsverwaltung' -- 'Lokaler Programmstarter mit Reitern und Kategorien' -- 'Desktop Verknüpfungs-Manager ohne Cloud-Zwang' -- 'Open Source App Launcher Deutsch Windows' -- 'SoftwareCenter portable Profile exportieren' -- 'Python PySide6 Desktop Verknüpfungen organisieren' -- 'Schnellstartleiste mit System-Tray Integration' -- 'Lokale Shortcut Verwaltung ohne Telemetrie' -- 'LaunchBoards Profil Umschaltung Windows' - -================================================================================ -3. COMPETITIVE COMPARISON MATRIX -================================================================================ - -| Capability / Feature | SoftwareCenter | Windows Start Menu | Stardock Fences | SyMenu | Launchy / Flow | -|-------------------------------------|:----------------:|:------------------:|:---------------:|:---------------:|:----------------:| -| Dedicated Category Boards / Tabs | YES (Dynamic) | NO (Flat list) | YES (On Desktop)| YES (Hierarchical)| NO (Search box)| -| Free & Open Source (MIT) | YES (100%) | BUNDLED (Closed) | NO (Commercial) | YES (Freeware) | YES (Open Source)| -| Multi-Profile Architecture | YES (Dual Identity)| NO | NO | PARTIAL | NO | -| Portable Redacted Profile Export | YES (v1 JSON) | NO | NO | PARTIAL | NO | -| Zero Telemetry / 100% Local-First | YES | NO (Bing / Cloud) | NO | YES | PARTIAL | -| Working Directory Preservation | YES (_startfile) | PARTIAL | PARTIAL | YES | PARTIAL | -| Headless Batch Catalog Management | YES (Scriptable) | NO | NO | NO | NO | -| Cross-Platform Smoke Certifications | YES (Linux/macOS)| NO (Win only) | NO (Win only) | NO (Win only) | PARTIAL | -| System Tray Quick Navigation | YES (Custom Menu)| NO | NO | YES | NO (Hotkey only) | -| Non-Elevated Invoker Security | YES (Strict) | SYSTEM/User | User/Admin | User | User | - -================================================================================ -4. GOVERNANCE & RUNTIME INVARIANTS -================================================================================ - -- INV-LOCAL-01: 100% Local-First & Zero-Egress — Execution, icon caching, and profile parsing execute strictly offline without external network calls. -- INV-SEC-02: Unprivileged Execution (Non-Elevation) — All launcher operations run under RunAsInvoker unprivileged user context. -- INV-PROFILE-03: Portable Profile Integrity — Profile export format (softwarecenter-profile-v1.json) strictly scrubs machine-local secrets and validates tab structures. -- INV-LAUNCH-04: Working Directory Correctness — Target files launched via _startfile_in_dir strictly set target parent directory as CWD, preventing relative path breakages. -- INV-DUAL-05: Multi-Identity Profile Switching — Complete visual and behavioral separation between SoftwareCenter and LaunchBoards profiles. -- INV-A11Y-06: Desktop Accessibility & Keyboard Navigation — Accessible names and keyboard tab traversal enforced across tab bars and item grids. -- INV-HYGIENE-07: Fail-Closed Conflict Guard — Multi-host synchronization conflict artifacts (*-WORKSTATION*, *-ASUS-GEI*, *.sync-conflict-*) are strictly excluded and ignored. -- INV-SLA-08: Vulnerability & Maintenance SLA — PEP 621 compliance, 48h security response commitment, and cross-platform continuous integration. -- INV-PARITY-09: Tier-2 Multi-Language & Documentation Parity — 6-language translation catalog parity (de, en, es, zh, ja, ru) with deterministic 4-stage fallback and tri-lingual docs. -- INV-ZEROCOPY-10: Permissive Licensing & Zero-Copyleft Containment — MIT application license, dynamically linked LGPL-3.0 PySide6, and standalone PyInstaller exception. - -================================================================================ -5. STRATEGIC DISCOVERABILITY ROADMAP -================================================================================ - -- Umbrella Integration: Linked across open-bricks master index and file-bricks portfolio (ProFiler, ExplorerPro, CloudLockFixer, WinStorePackager). -- LLM Machine Readability: Standard llms.txt entry certified with technical capabilities, boundary specifications, and profile JSON exchange contract. -- Microsoft Store Live Identity: Packaged for distribution via Microsoft Partner Center under verified publisher credentials. - -================================================================================ -6. AUDIT & HYGIENE HISTORY -================================================================================ - -- 2026-09-11 [Pfad A Technical Hygiene]: - * Multi-rule ruff lint configuration (E, F, W, I, UP, B, SIM, C4, RUF) certified 100% clean. - * Code hygiene: removed unused variables, modernized imports, and resolved implicit Optionals. - * GitHub Actions CI hardened with concurrency cancellation and 15-minute job timeouts. - * .gitignore hardened with multi-host conflict tokens and lock patterns. - * Created MARKETING-LOG.txt and synchronized metadata contracts across project. - -================================================================================ -7. RECENT MARKETING, BRANDING & ASSET UPDATES (2026-09-14) -================================================================================ - -- Pfad B Discoverability, Visual Architecture & Metadata Parity: - * Tri-lingual README architecture (README.md, README_de.md, README.es.md) updated with full 24-point Quick Navigation parity across English, German, and Spanish. - * Target Personas (Desktop Power Users, Solo Software Developers & DevOps, Multi-PC Workstation Operators, Privacy-Conscious Advocates) directly embedded into all three documentation hubs. - * 10-Dimension Comparative Matrix vs. Windows Start Menu, Stardock Fences, SyMenu, and Launchy / Flow Launcher embedded across all three READMEs. - * Created comprehensive THIRD_PARTY_LICENSES.md documenting SPDX license identifiers, dynamic linking compliance for PySide6 (LGPL-3.0), PyInstaller packaging exception, zero-egress privacy, and 10 runtime invariants (INV-LOCAL-01 to INV-ZEROCOPY-10). - * Synchronized badges: Pytest test counts, platforms, zero-egress, local-first privacy, and verified audit stencils. - * Updated llms.txt with Last-checked 2026-09-14, test count synchronisation, and cross-references to THIRD_PARTY_LICENSES.md. - * Updated pyproject.toml PEP 621 project URLs with 'Third-Party Licenses'. - * Expanded automated contract test suite in tests/test_metadata.py with assertions certifying personas, comparison matrix, license governance, and tri-lingual navigation anchor parity. - -================================================================================ -8. PFAD A TECHNICAL HYGIENE, CI WORKFLOWS & LOCK DEFENSE (2026-09-23) -================================================================================ - -- Pfad A Repository Hygiene & Governance: - * Resolved 7 ruff lint diagnostics (unused imports and import sorting in SoftwareCenter.py and tests/test_ui_accessibility.py); achieved 100% clean ruff check. - * Created canonical open-source NOTICE attribution file (Lukas Geiger, file-bricks, open-bricks umbrella). - * Hardened GitHub Actions workflows stale.yml (concurrency group, 10 min timeout) and welcome.yml (concurrency group, 5 min timeout). - * Hardened .gitignore with multi-host conflict tokens (*conflicted copy*, * (Kopie)*, *-ASUS*, *-LAPTOP*, *-Mac Studio*, *-MacBook*, *.rej, *.orig) and fail-closed lock defense (LOCK*.txt, LOCK.user.*, LOCK.until.*, LOCK.condition.*, .automation-lock, uv.lock, !package-lock.json). - * Hardened pyproject.toml with PEP 621 license-files, Notice URL, and pytest norecursedirs while strictly preserving version 1.2.0 per T-20260920-167562623. - * Synchronized tri-lingual READMEs (README.md, README_de.md, README.es.md), llms.txt, and THIRD_PARTY_LICENSES.md with NOTICE attribution and updated test suite count (260+ passed). - * Expanded tests/test_metadata.py with automated contracts certifying NOTICE attribution, CI lifecycle timeouts, and multi-host gitignore defense. 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/RUNTIME_DAILY_CARE.md b/RUNTIME_DAILY_CARE.md deleted file mode 100644 index f1fb38f..0000000 --- a/RUNTIME_DAILY_CARE.md +++ /dev/null @@ -1,203 +0,0 @@ -# Launcher catalog daily-care runtime - -This document defines the code-side contract for migrating -`softwarecenter.launchboards.daily-care` away from executable code stored in -OneDrive. It does not authorize or perform a scheduler, Windows Task, profile, -or registry mutation. - -## Boundary - -- Runtime code: a reviewed SoftwareCenter commit materialized below - `C:\_Local_DEV\runtime\SoftwareCenter\`. -- Synchronized inputs: `software_apps.json` and `DESKTOP-REGISTRY.txt`, passed - as exact command-line arguments. -- Local profile state: the two QSettings namespaces `SoftwareCenter` and - `LaunchBoards`. -- Backups: local Plan-D storage only, never the synchronized software root. -- Default: dry-run. The scheduler payload below intentionally omits `--apply`. - -The runtime never derives synchronized data paths from `__file__`, never -invokes a shell, and never copies catalog or registry data into the repository. - -## CLI contract - -```powershell -$python = Join-Path $env:LOCALAPPDATA 'Programs\Python\Python312\python.exe' -$oneDrive = Join-Path $env:USERPROFILE 'OneDrive' -$runtimeRoot = 'C:\_Local_DEV\runtime\SoftwareCenter\' -$script = Join-Path $runtimeRoot 'scripts\softwarecenter_sync.py' - -& $python $script ` - --catalog (Join-Path $oneDrive '.TOPICS\.SOFTWARE\_tools\software_apps.json') ` - --registry (Join-Path $oneDrive 'Desktop\DESKTOP-REGISTRY.txt') ` - --software-root (Join-Path $oneDrive '.TOPICS\.SOFTWARE') ` - --local-dev-root 'C:\_Local_DEV' -``` - -Exit codes: - -- `0`: valid dry-run or completed apply. -- `2`: missing/invalid input or a failed apply gate. -- `3`: write operation failed after a backup was created. - -An apply run additionally requires `--apply`. It aborts while either managed -GUI is running and creates a local `launcher-catalog-profile-backup-v2` before -the first profile or registry write. The backup contains both original -QSettings projections and the exact original registry text plus SHA-256. If a -write fails after the backup, the runtime prints its exact path and immediately -attempts to restore both profiles and the registry. An incomplete rollback is -reported explicitly and still exits `3`. The registry bytes are captured once -immediately before the write phase and reused unchanged for both backup and -rollback; if that final read is unavailable, the apply exits before any write. - -## Pinned runtime materialization - -Only use a reviewed commit that is reachable from the intended release branch. -The target directory must not already contain unrelated files. - -```powershell -$repo = 'C:\_Local_DEV\repos\SoftwareCenter' -$approvedCommit = '' -$releaseRef = 'origin/master' -$runtimeRoot = "C:\_Local_DEV\runtime\SoftwareCenter\$approvedCommit" -$archive = Join-Path $env:TEMP "softwarecenter-$approvedCommit.tar" - -git -C $repo cat-file -e "$approvedCommit^{commit}" -git -C $repo merge-base --is-ancestor $approvedCommit $releaseRef -if ($LASTEXITCODE -ne 0) { - throw "$approvedCommit is not reachable from $releaseRef" -} -if (Test-Path -LiteralPath $runtimeRoot) { - throw "Runtime target already exists: $runtimeRoot" -} -if (Test-Path -LiteralPath $archive) { - throw "Temporary archive already exists: $archive" -} -New-Item -ItemType Directory -Path $runtimeRoot -git -C $repo archive --format=tar --output=$archive $approvedCommit -tar -xf $archive -C $runtimeRoot -Remove-Item -LiteralPath $archive -git -C $repo show -s --format='%H' $approvedCommit -``` - -Record the commit, runtime path, interpreter path, input hashes, and dry-run -output in the native migration receipt. Do not use a mutable OneDrive worktree -or an unpinned conflict copy. - -## Proposed native scheduler migration - -`ellmos-scheduler` 0.1.0 has no in-place payload-update command. Preserve the -old job as a disabled rollback target and introduce a separately identifiable -candidate. Run these commands only after: - -1. the pinned runtime dry-run exits `0`; -2. current `jobs --json`, `status --json`, and recent runs are captured; -3. the existing job has a recent native success receipt or its degraded - baseline is explicitly recorded; -4. the SoftwareCenter and LaunchBoards processes are absent; -5. a byte-for-byte scheduler database backup exists outside OneDrive. - -```powershell -$db = Join-Path $env:LOCALAPPDATA 'ellmos\scheduler.db' -$python = Join-Path $env:LOCALAPPDATA 'Programs\Python\Python312\python.exe' -$oneDrive = Join-Path $env:USERPROFILE 'OneDrive' -$approvedCommit = '' -$runtimeRoot = "C:\_Local_DEV\runtime\SoftwareCenter\$approvedCommit" -$script = Join-Path $runtimeRoot 'scripts\softwarecenter_sync.py' - -$argv = @( - $python, - $script, - '--catalog', - (Join-Path $oneDrive '.TOPICS\.SOFTWARE\_tools\software_apps.json'), - '--registry', - (Join-Path $oneDrive 'Desktop\DESKTOP-REGISTRY.txt'), - '--software-root', - (Join-Path $oneDrive '.TOPICS\.SOFTWARE'), - '--local-dev-root', - 'C:\_Local_DEV' -) -$payload = @{ - argv = $argv - cwd = $runtimeRoot -} | ConvertTo-Json -Compress -$schedule = @{ - kind = 'daily' - time = '06:20' - timezone = 'Europe/Berlin' -} | ConvertTo-Json -Compress - -ellmos-scheduler --db $db jobs --json -ellmos-scheduler --db $db status --json -ellmos-scheduler --db $db add ` - --id softwarecenter.launchboards.daily-care.v4 ` - --schedule $schedule ` - --executor command ` - --payload $payload ` - --lease-seconds 300 ` - --timeout-seconds 120 -ellmos-scheduler --db $db jobs --json -ellmos-scheduler --db $db disable softwarecenter.launchboards.daily-care -ellmos-scheduler --db $db jobs --json -``` - -Adding the candidate before disabling the old job keeps the rollback target -available if candidate creation fails. If the final disable or its readback -fails, immediately disable the `.v4` candidate before leaving the system. - -The existing Windows Task continues to run one native scheduler tick; its -action does not need to point at this script. Do not alter that task unless its -own native readback proves a separate defect. - -The first candidate execution must be observed through native scheduler run -history. The receipt must prove: - -- `executor=command`; -- argv contains the pinned runtime and all four explicit paths; -- `cwd` is the pinned runtime, not OneDrive; -- exit code `0`; -- output says `DRY-RUN`; -- input files, QSettings profiles, and registry remain unchanged. - -## Rollback - -If the candidate must be rolled back before its first run: - -```powershell -$db = Join-Path $env:LOCALAPPDATA 'ellmos\scheduler.db' -ellmos-scheduler --db $db disable softwarecenter.launchboards.daily-care.v4 -ellmos-scheduler --db $db enable softwarecenter.launchboards.daily-care -ellmos-scheduler --db $db jobs --json -``` - -After any apply run, also restore the registry text and both profile snapshots -from the reported `launcher-catalog-profile-backup-v2` file. The explicit -restore gate uses the same exact runtime/input bindings: - -```powershell -$python = Join-Path $env:LOCALAPPDATA 'Programs\Python\Python312\python.exe' -$oneDrive = Join-Path $env:USERPROFILE 'OneDrive' -$runtimeRoot = 'C:\_Local_DEV\runtime\SoftwareCenter\' -$script = Join-Path $runtimeRoot 'scripts\softwarecenter_sync.py' -$backup = 'C:\_Local_DEV\launcher_catalog_backups\.json' - -& $python $script ` - --catalog (Join-Path $oneDrive '.TOPICS\.SOFTWARE\_tools\software_apps.json') ` - --registry (Join-Path $oneDrive 'Desktop\DESKTOP-REGISTRY.txt') ` - --software-root (Join-Path $oneDrive '.TOPICS\.SOFTWARE') ` - --local-dev-root 'C:\_Local_DEV' ` - --apply ` - --restore-backup $backup -``` - -The restore command validates the backup format, registry binding and SHA-256, -then snapshots the current state before restoring both QSettings profiles and -the registry. If the restore itself fails after its first write, it compensates -back to that pre-restore snapshot and reports whether the compensation was -complete. Verify the registry hash and QSettings readback afterwards. Never -overwrite a newer user edit without first comparing it to the backup and -obtaining the applicable decision. - -The candidate job, pinned runtime, and database backup remain in place until a -successful run and rollback rehearsal have both been recorded. Cleanup is a -separate, explicit operation. 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