Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt pytest Pillow
python -m pip install -r requirements.txt pytest pytest-qt Pillow
- name: Run Python tests
run: python -m pytest -ra -v
- name: Compile entry points
Expand Down
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,25 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).

## [Unreleased]

## [1.0.2] - 2026-10-07

ProfiPrompt 1.0.2
• Fehler beim Lesen der Bibliothek schützen vorhandene Daten und Exporte. Schreibfehler werden gemeldet, statt eine unbestätigte Datei als erfolgreich gespeichert zu behandeln.
• Entf und Rücktaste entfernen Board-Kacheln erst nach Ihrer Bestätigung; „Nein“ erhält die Kachel.
• Prompts, Versionsänderungen und Board-Verweise werden zuverlässiger gespeichert. Verwaiste Kacheln sowie Drag-and-drop-Probleme wurden behoben.
• Der Sprachwechsel aktualisiert nun mehr Bereiche direkt, einschließlich Tabellen und Boards.
• Kacheln können auf andere Boards verschoben oder dupliziert, Boards umbenannt und Kachelfarben individuell gewählt werden.
• Tastaturbedienung und Beschriftungen wurden verbessert. Über-Dialog und JSON-Export zeigen die aktuelle Version; Programmsymbole entsprechen dem Store-Symbol.

ProfiPrompt 1.0.2
• Library read errors preserve existing data and exports. Write failures are reported instead of treating an unconfirmed file as successfully saved.
• Delete and Backspace remove board tiles only after confirmation; choosing No keeps the tile.
• More reliable prompt/version persistence and board references. Fixed orphaned tiles and drag-and-drop issues.
• Language changes update more UI areas immediately, including tables and boards.
• Move or duplicate tiles to other boards, rename boards and choose individual tile colors.
• Improved keyboard controls and labels. About and JSON exports show the current version; application icons match the Store icon.


### Sprachwechsel für alle Bereiche, Kacheln auf andere Boards senden/duplizieren & Kachelfarben (2026-10-06)

- **Sprachwechsel live für die gesamte Oberfläche (`src/i18n.py`, alle Widgets):**
Expand Down
Binary file modified DesktopIcon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 23 additions & 45 deletions ProfiPrompt.spec
Original file line number Diff line number Diff line change
@@ -1,58 +1,36 @@
# -*- mode: python ; coding: utf-8 -*-
# PyInstaller spec file für ProfiPrompt
# Build: python -m PyInstaller ProfiPrompt.spec --clean --noconfirm

block_cipher = None
import json
import os
from pathlib import Path

root = Path.cwd()
a = Analysis(
['src/profiprompt.py'],
pathex=['src', '.'],
[str(root / "src" / "profiprompt.py")],
pathex=[str(root / "src"), str(root)],
binaries=[],
datas=[
('src/icons', 'icons'),
('locales', 'locales'),
('translator.py', '.'),
],
hiddenimports=[
'PySide6.QtWidgets',
'PySide6.QtGui',
'PySide6.QtCore',
'PySide6.QtPrintSupport',
(str(root / "pyproject.toml"), "."),
(str(root / "DesktopIcon.ico"), "."),
(str(root / "DesktopIcon.png"), "."),
(str(root / "locales"), "locales"),
*[(str(root / "src" / "icons" / filename), "icons")
for filename in ("clipboard-dark.png", "clipboard-light.png", "paperclip-dark.png", "paperclip-light.png")],
*[(str(root / filename), ".")
for filename in ("LICENSE", "NOTICE", "THIRD_PARTY_LICENSES.txt", "PRIVACY_POLICY.md")],
],
hiddenimports=["PySide6.QtPrintSupport"],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=['tkinter', 'matplotlib', 'numpy', 'scipy'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
excludes=json.loads(os.environ["PYINSTALLER_EXCLUDES"]),
noarchive=False,
optimize=0,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='ProfiPrompt',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
icon='src/icons/BCO.0bdc6366-1e3b-4548-ae52-db1ba790b9b1_umgewandelt.ico',
)

coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='ProfiPrompt',
pyz, a.scripts, [], exclude_binaries=True, name="ProfiPrompt",
debug=False, bootloader_ignore_signals=False, strip=False, upx=False,
console=False, disable_windowed_traceback=False,
icon=[str(root / "DesktopIcon.ico")],
)
coll = COLLECT(exe, a.binaries, a.datas, strip=False, upx=False, name="ProfiPrompt")
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ ProfiPrompt is purposefully engineered to serve 4 primary stakeholder personas a
| **Multi-Mode Clipboard Engine** | **YES (4 Config Modes)**| NO (Raw copy) | NO (Single copy) | Basic text paste |
| **Multi-Format Export (PDF/TXT/JSON)**| **YES (Integrated)** | Requires Plugins | Proprietary Export | NO |
| **Standalone Offline PWA Companion** | **YES (Included)** | NO | NO (Online only) | NO |
| **Atomic Writes & Auto-Recovery** | **YES (.bak shield)** | OS Dependent | Cloud Managed | Varies |
| **Atomic Writes & Manual JSON Backups** | **YES** | OS Dependent | Cloud Managed | Varies |
| **Zero Subscription / 100% Open MIT**| **YES (100% Free)** | Free / Paid Sync | Paid ($10-30/month) | Freemium / Paid |
| **Open Portable Schema Standard** | **YES (`v1.json`)** | Markdown only | Vendor Lock-in | Proprietary DB |

Expand All @@ -137,7 +137,7 @@ flowchart TD

subgraph Storage["Local Data Persistence (.prompt_manager/)"]
JSONStore["Atomic JSON Storage (prompts.json, boards.json)"]
BackupStore["Automatic Backup Snapshots (*.bak)"]
BackupStore["Manual JSON Library Exports"]
end

subgraph ExportFormat["Portable Library Standard"]
Expand Down Expand Up @@ -185,7 +185,7 @@ ProfiPrompt enforces 10 strict operational invariants documented in [THIRD_PARTY
- **INV-ATOMIC-03:** Atomic File Persistence (tempfile + replace writes).
- **INV-SCHEMA-04:** Open Portable Schema (`profiprompt-library-v1.json`).
- **INV-UNPRIV-05:** Non-Elevation & RunAsInvoker (unprivileged user space).
- **INV-BACKUP-06:** Fail-Safe Backup & Recovery (automatic `.bak` preservation).
- **INV-BACKUP-06:** Manual JSON library backups; existing exports are preserved when library reads fail.
- **INV-COPY-07:** Local Clipboard Safety (memory-only sanitized clipboard access).
- **INV-PRINT-08:** Deterministic Multi-Format Rendering (Qt vector print engine).
- **INV-PWA-09:** Read-Only Companion Isolation (PWA companion runs sandboxed).
Expand Down Expand Up @@ -224,7 +224,7 @@ sequenceDiagram

Engineer->>UI: Create new prompt version (v1.1)
UI->>Engine: Validate parameters, tags & change notes
Engine->>Store: Atomic commit to prompts.json + .bak
Engine->>Store: Atomic commit to prompts.json
Store-->>UI: Persistence confirmed
Engineer->>UI: Select copy action (Markdown / Result / Body)
UI->>Clip: Prepare sanitized buffer
Expand Down Expand Up @@ -331,7 +331,7 @@ ProfiPrompt/
│ ├── profiprompt.py # Application entry point and main window
│ ├── prompt_dialog.py # Editor dialogs for prompts and version histories
│ ├── settings_manager.py # QSettings configuration manager
│ ├── storage.py # Atomic JSON persistence & .bak recovery
│ ├── storage.py # Atomic JSON persistence & read-error protection
│ ├── theme.py # Fusion Dark and Light theme palettes
│ └── translator.py # Live i18n translation engine
├── web_companion/ # Read-only Web/PWA companion
Expand Down
10 changes: 5 additions & 5 deletions README_de.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ ProfiPrompt adressiert 4 zentrale Anwendergruppen und Stakeholder-Personas:
| **Multimodale Clipboard-Engine** | **JA (4 Modi)** | NEIN (Reines Kopieren)| NEIN (Einfach) | Standard-Einfügen |
| **Multi-Format-Exporte (PDF/TXT/JSON)**| **JA (Integriert)** | Nur per Plugin | Proprietärer Export | NEIN |
| **Eigenständiger Offline-PWA-Begleiter**| **JA (Enthalten)** | NEIN | NEIN (Online-Zwang) | NEIN |
| **Atomare Speicherung & .bak-Schutz**| **JA (Sicher)** | Abhängig vom OS | Cloud-Datenbank | Variiert |
| **Atomare Speicherung & manuelle JSON-Sicherungen**| **JA** | Abhängig vom OS | Cloud-Datenbank | Variiert |
| **Keine Abokosten / 100% Open MIT** | **JA (100% Frei)** | Frei / Sync-Abo | Kostenpflichtig ($10-30/m)| Freemium / Abo |
| **Offener, portabler Standard (`v1.json`)**| **JA (Offen)** | Nur Markdown | Vendor-Lock-in | Proprietäre DB |

Expand All @@ -137,7 +137,7 @@ flowchart TD

subgraph Storage["Lokale Datenspeicherung (.prompt_manager/)"]
JSONStore["Atomarer JSON-Speicher (prompts.json, boards.json)"]
BackupStore["Automatische Backup-Snapshots (*.bak)"]
BackupStore["Manuelle JSON-Bibliotheksexporte"]
end

subgraph ExportFormat["Portabler Bibliotheksstandard"]
Expand Down Expand Up @@ -185,7 +185,7 @@ ProfiPrompt garantiert 10 strikte Architektur-Invarianten gemäß [THIRD_PARTY_L
- **INV-ATOMIC-03:** Atomare Dateispeicherung (Tempfile + Replace Schreibvorgänge).
- **INV-SCHEMA-04:** Offenes, portables Schema (`profiprompt-library-v1.json`).
- **INV-UNPRIV-05:** Keine Rechteausweitung & RunAsInvoker (ausschließlich unprivilegierter Benutzerraum).
- **INV-BACKUP-06:** Ausfallsichere Backups (.bak-Sicherheitskopien).
- **INV-BACKUP-06:** Manuelle JSON-Bibliothekssicherungen; vorhandene Exporte bleiben bei Lesefehlern erhalten.
- **INV-COPY-07:** Sichere lokale Zwischenablage (reiner RAM-Transfer ohne Protokollierung).
- **INV-PRINT-08:** Deterministisches Vektor-Rendering (Qt-Druckengine).
- **INV-PWA-09:** Isolierter PWA-Begleiter (rein lesender Sandbox-Betrieb).
Expand Down Expand Up @@ -224,7 +224,7 @@ sequenceDiagram

Engineer->>UI: Neue Prompt-Version anlegen (v1.1)
UI->>Engine: Parameter, Tags & Notizen validieren
Engine->>Store: Atomarer Schreibvorgang in prompts.json + .bak
Engine->>Store: Atomarer Schreibvorgang in prompts.json
Store-->>UI: Persistenz bestätigt
Engineer->>UI: Kopier-Modus wählen (Markdown / Ergebnis / Text)
UI->>Clip: Sanitisierten Puffer bereitstellen
Expand Down Expand Up @@ -331,7 +331,7 @@ ProfiPrompt/
│ ├── profiprompt.py # Haupteinstiegspunkt und Hauptfenster
│ ├── prompt_dialog.py # Editor für Prompts und Versionsverläufe
│ ├── settings_manager.py # QSettings-Konfigurationsmanager
│ ├── storage.py # Atomare JSON-Persistenz & .bak-Schutz
│ ├── storage.py # Atomare JSON-Persistenz & Schutz bei Lesefehlern
│ ├── theme.py # Fusion Dark- und Light-Themes
│ └── translator.py # Live i18n Übersetzungssystem
├── web_companion/ # Read-Only Web/PWA-Begleiter
Expand Down
10 changes: 5 additions & 5 deletions README_es.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ ProfiPrompt está diseñado específicamente para servir a 4 personas interesada
| **Motor de portapapeles multimodal** | **SÍ (4 modos configurables)**| NO (Copia básica) | NO (Copia única) | Pegado estándar |
| **Exportación multiformato (PDF/TXT/JSON)**| **SÍ (Integrada)** | Requiere plugins | Exportación propietaria | NO |
| **Compañero Web/PWA offline independiente**| **SÍ (Incluido)** | NO | NO (Solo online) | NO |
| **Escrituras atómicas y auto-recuperación**| **SÍ (Escudo .bak)** | Depende del SO | Base de datos en la nube | Variable |
| **Escrituras atómicas y copias JSON manuales**| **SÍ** | Depende del SO | Base de datos en la nube | Variable |
| **Sin suscripciones / 100% Código abierto MIT**| **SÍ (100% Libre)**| Libre / Sync de pago | De pago ($10-30/mes) | Freemium / De pago |
| **Estándar de esquema abierto (`v1.json`)**| **SÍ (Abierto)** | Solo Markdown | Bloqueo de proveedor | Base de datos propietaria |

Expand All @@ -137,7 +137,7 @@ flowchart TD

subgraph Storage["Persistencia local de datos (.prompt_manager/)"]
JSONStore["Almacenamiento atómico JSON (prompts.json, boards.json)"]
BackupStore["Instantáneas automáticas de respaldo (*.bak)"]
BackupStore["Exportaciones JSON manuales de la biblioteca"]
end

subgraph ExportFormat["Estándar de biblioteca portátil"]
Expand Down Expand Up @@ -185,7 +185,7 @@ ProfiPrompt aplica 10 invariantes operativas estrictas documentadas en [THIRD_PA
- **INV-ATOMIC-03:** Persistencia atómica de archivos (escrituras mediante tempfile + replace).
- **INV-SCHEMA-04:** Esquema abierto y portátil (`profiprompt-library-v1.json`).
- **INV-UNPRIV-05:** Sin elevación de privilegios y RunAsInvoker (espacio de usuario no privilegiado).
- **INV-BACKUP-06:** Copias de seguridad y recuperación a prueba de fallos (preservación automática `.bak`).
- **INV-BACKUP-06:** Copias JSON manuales; las exportaciones existentes se conservan si falla la lectura de la biblioteca.
- **INV-COPY-07:** Seguridad en el portapapeles local (acceso a memoria saneado sin registro externo).
- **INV-PRINT-08:** Renderizado multiformato determinista (motor vectorial de impresión de Qt).
- **INV-PWA-09:** Aislamiento del compañero de solo lectura (entorno sandboxed para la PWA).
Expand Down Expand Up @@ -224,7 +224,7 @@ sequenceDiagram

Engineer->>UI: Crear nueva versión de prompt (v1.1)
UI->>Engine: Validar parámetros, etiquetas y notas de cambio
Engine->>Store: Escritura atómica en prompts.json + .bak
Engine->>Store: Escritura atómica en prompts.json
Store-->>UI: Persistencia confirmada
Engineer->>UI: Seleccionar modo de copia (Markdown / Resultado / Texto)
UI->>Clip: Preparar búfer saneado
Expand Down Expand Up @@ -331,7 +331,7 @@ ProfiPrompt/
│ ├── profiprompt.py # Punto de entrada y ventana principal
│ ├── prompt_dialog.py # Diálogos de edición de prompts e historiales
│ ├── settings_manager.py # Gestor de configuraciones QSettings
│ ├── storage.py # Persistencia atómica JSON y respaldos .bak
│ ├── storage.py # Persistencia atómica JSON y protección ante errores de lectura
│ ├── theme.py # Paletas de temas Fusion Dark y Light
│ └── translator.py # Motor de traducción i18n dinámica
├── web_companion/ # Compañero Web/PWA de solo lectura
Expand Down
Binary file added assets/icon-master.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions build_exe.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
@echo off
chcp 65001 >nul
setlocal
cd /d "%~dp0"
python scripts\build_release.py
if errorlevel 1 exit /b 1
endlocal
80 changes: 38 additions & 42 deletions releases/windowsstore/BUILD.md
Original file line number Diff line number Diff line change
@@ -1,56 +1,52 @@
# ProfiPrompt - Windows Store Build-Anleitung
# ProfiPrompt – Windows Store Build-Anleitung

Stand: 2026-06-14
Stand: 2026-10-07

## Voraussetzungen
Die verbindlichen Einreichungsgates stehen in der .SOFTWARE-Pipeline unter
`_STORE/WINDOWS_STORE_BUGFIX_POLICY.md`, Abschnitt 7a.

1. Python 3.10+ mit PySide6
2. PyInstaller (`pip install pyinstaller`)
3. Windows App Certification Kit / Windows SDK
4. Aktuelles MSIX `releases\ProfiPrompt.msix`
5. Für echten Store-Lauf: Publisher-/Identity-Werte passend zu `store_package.json`
## Build

## Schritt 1: EXE bauen und Store-Artefakte prüfen
Ein isoliertes Python-Environment mit `requirements.txt`, PyInstaller und den
Testabhängigkeiten verwenden. `python` im PATH muss auf dieses Environment zeigen.
`build_exe.bat` ruft `scripts/build_release.py` auf: zuerst den zentralen
`build_exclude_scanner.py`, dann einen vollständigen Onedir-Build.

```bash
cd "C:\_Local_DEV\repos\ProfiPrompt"
build_exe.bat
python scripts/check_store_readiness.py
```powershell
python scripts/gen_store_icons.py
.\build_exe.bat
python "$env:OneDrive\.TOPICS\.SOFTWARE\_STORE\icon_consistency_check.py" .
& "$env:OneDrive\.TOPICS\.SOFTWARE\_STORE\msstore_build_msix.ps1" -ProjectRoot (Get-Location).Path -ExePath ".\dist\ProfiPrompt\ProfiPrompt.exe" -OutputMsix ".\releases\windowsstore\v1.0.2\ProfiPrompt.msix"
```

Der Preflight prüft `store_package.json`, `STORE_LISTING.md`,
`releases/windowsstore/store_settings.json`, die Store-Screenshot-Summary,
`releases\ProfiPrompt.msix` und vorhandene WACK-Reports.
Für `STORE_LISTING.md` validiert er zusätzlich beide Sprachabschnitte, die
Kurzbeschreibungen, Schlüsselwörter, Kategorien und die Ausrichtung zur
Store-Konfiguration.
Für bestehende Materialprüfungen kann dasselbe Paket zusätzlich unter
`releases/ProfiPrompt.msix` abgelegt werden. Beide Dateien müssen dieselbe SHA256 haben.

Ein lokales Testprotokoll für den aktuellen Paketstand wird so erzeugt:
## Tests und Paketprüfung

```bash
python scripts/check_store_readiness.py write-test-protocol
```

Das Protokoll liegt unter `releases\windowsstore\test_reports\`, enthält
MSIX-SHA256, Materialstatus und markiert fehlende WACK-XML ausdrücklich als
offenes Gate.

## Schritt 2: WACK-Testprotokoll erneuern
Die vollständige Pytest-Suite und der Übersetzungscheck müssen bestanden sein.
Das gebaute MSIX erneut mit `icon_consistency_check.py --package` prüfen.
Das Paket in einen frischen Ordner entpacken und **dessen EXE** mit
`--release-smoke <frischer Ausgabeordner>` starten. Screenshots müssen unter der
nativen Windows-Plattform entstehen; Runtime, Qt-Plug-ins und Versionsdaten
müssen vollständig sein.

1. `releases\ProfiPrompt.msix` im Windows App Certification Kit prüfen.
2. XML-Report unter `releases\windowsstore\test_reports\wack_YYYYMMDD_HHMMSS.xml` speichern.
3. Report lokal auswerten:
`python scripts/check_store_readiness.py write-test-protocol` schreibt einen
ergänzenden Materialbericht unter `releases/windowsstore/test_reports`.
Der ältere Readiness-Checker meldet einen fehlenden WACK-Report weiterhin als
Warnung. WACK ist nach der aktuellen zentralen Pipeline ein optionaler
Qualitätsnachweis und ersetzt kein Paketgate.

```bash
python scripts/check_store_readiness.py review-wack-report
```

## Schritt 3: Store Submission
## Einreichung

Vor dem Partner-Center-Upload noch einmal ausführen:
Eine Icon-Collage aus dem gebauten Paket erzeugen, auf den OneDrive-Desktop
legen und nach `.USR` kopieren. Erst das dokumentierte Sicht-OK des Users
erlaubt die Einreichung. Die Freigabe und alle Testnachweise müssen an die
SHA256 des tatsächlich hochgeladenen MSIX gebunden sein.

```bash
python scripts/check_store_readiness.py
```
Deutsch und Englisch vorbereitete Neuigkeiten gehören in das Feld
`baseListing.releaseNotes` der Store-Listings. Nach dem Update diese Felder
und den Einreichungsstatus über die Store-API zurücklesen.
Der Store signiert das Paket; lokal wird es dafür nicht signiert.

Preis: kostenlos
Preis: kostenlos.
6 changes: 4 additions & 2 deletions releases/windowsstore/store_settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publisher": "CN=52596601-BAB4-4F3F-B182-E8F3F273B202",
"publisher_display": "Geiger",
"identity_name": "Geiger.ProfiPrompt",
"version": "1.0.1.0",
"version": "1.0.2.0",
"exe_name": "ProfiPrompt",
"msix_name": "ProfiPrompt.msix",
"output_dir": "store_package",
Expand All @@ -12,7 +12,9 @@
"pfx_path": "",
"pfx_password": "",
"timestamp_url": "http://timestamp.digicert.com",
"license_files": ["../../LICENSE"],
"license_files": [
"../../LICENSE"
],
"enable_i18n": true,
"capabilities": "internetClient,runFullTrust",
"privacy_url": "https://github.com/file-bricks/ProfiPrompt/blob/master/PRIVACY_POLICY.md",
Expand Down
Loading
Loading