diff --git a/CLAUDE.md b/CLAUDE.md index d6dcb37..d82303c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,7 +13,7 @@ macOS experimental; Linux unsupported. ## Distribution and Updates -- **Microsoft Store** (in certification) — automatic updates after approval. +- **Microsoft Store** (live) — automatic updates through the Store. - **GitHub MSIX** — advanced users, unsigned, requires Developer Mode for sideloading. - **Legacy Setup.exe** — manual recovery only. - The app detects updates via GitHub API (opens browser). It never downloads or runs installers. diff --git a/PRIVACY.md b/PRIVACY.md index 900ed33..46f32ee 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -5,7 +5,7 @@ **Effective date:** June 18, 2026 See the rendered policy at: -**[https://sparshsam.github.io/pdfreader-by-sparsh/privacy/](https://sparshsam.github.io/pdfreader-by-sparsh/privacy/)** +**[https://sparshsam.github.io/openreader/privacy/](https://sparshsam.github.io/openreader/privacy/)** --- @@ -33,4 +33,4 @@ No third-party analytics or tracking SDKs are embedded. The only external servic ## Contact -Open an issue on the [GitHub repository](https://github.com/sparshsam/pdfreader-by-sparsh). +Open an issue on the [GitHub repository](https://github.com/sparshsam/openreader). diff --git a/README.md b/README.md index 138e727..26fc06b 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,10 @@

- Latest release + Latest release License - CI - Microsoft Store + CI + Microsoft Store Windows

@@ -34,13 +34,13 @@ Use OpenReader directly, from scripts, or through AI agents. ### Microsoft Store (Recommended) -The Store submission is in certification. Once approved, install with one click — automatic updates included. +OpenReader is **live in the Microsoft Store**. -*Store link will appear here after certification.* +**Recommended:** Install [OpenReader by Sparsh on Microsoft Store](https://apps.microsoft.com/detail/9MXDVW2645LL). ### GitHub Releases (Advanced Users) -MSIX packages are available on the [Releases page](https://github.com/sparshsam/pdfreader-by-sparsh/releases). +For advanced users, MSIX packages remain available on the [GitHub Releases page](https://github.com/sparshsam/openreader/releases). | Platform | Package | Notes | |---|---|---| @@ -55,7 +55,7 @@ MSIX packages are available on the [Releases page](https://github.com/sparshsam/ | Platform | Status | |---|---| | Windows 10/11 | Supported | -| Microsoft Store | In certification — recommended after approval | +| Microsoft Store | Live in Microsoft Store | | GitHub MSIX | Advanced users | | macOS Apple Silicon | Experimental | | macOS Intel | Experimental | @@ -237,8 +237,8 @@ dist\OpenReader\ macOS packaged builds are **experimental**. To run from source: ```bash -git clone https://github.com/sparshsam/pdfreader-by-sparsh.git -cd pdfreader-by-sparsh +git clone https://github.com/sparshsam/openreader.git +cd openreader python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt diff --git a/RELEASE.md b/RELEASE.md index 886a1d8..9811c74 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -56,7 +56,7 @@ no separate code-signing certificate is needed. The app's Help → Check for Updates: -1. Calls `https://api.github.com/repos/sparshsam/pdfreader-by-sparsh/releases/latest` +1. Calls `https://api.github.com/repos/sparshsam/openreader/releases/latest` 2. Reads `tag_name` and compares against `__version__` 3. If a newer version exists, shows a dialog with release notes 4. User clicks "Open Releases Page" → browser opens GitHub Releases @@ -83,21 +83,22 @@ After publishing a tag: You can inspect the latest release assets with: ```bash -gh release view --repo sparshsam/pdfreader-by-sparsh --json tagName,assets +gh release view --repo sparshsam/openreader --json tagName,assets ``` Or via the same API used by the app: ```bash -curl https://api.github.com/repos/sparshsam/pdfreader-by-sparsh/releases/latest +curl https://api.github.com/repos/sparshsam/openreader/releases/latest ``` ## MSIX Signing The MSIX package is unsigned for GitHub Release builds. -1. **Microsoft Store** — Submission is in certification. The Store signs the - package automatically with its Store identity. +1. **Microsoft Store** — Live at + [apps.microsoft.com/detail/9MXDVW2645LL](https://apps.microsoft.com/detail/9MXDVW2645LL). + The Store signs the package automatically with its Store identity. 2. **Sideloading** — Unsigned MSIX from GitHub Releases requires Windows Developer Mode. Local test-signing scripts are in `packaging/msix/`. 3. **No self-procured code-signing cert** — The Store handles production signing. diff --git a/SUPPORT.md b/SUPPORT.md index ea88ae0..186b6af 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -44,7 +44,7 @@ If you are using OpenReader v1.0.0 or v1.0.1 on Windows and see this error when **One-time manual recovery** — you need to install v1.0.3 manually, then the updater will work from then on: -1. **Download the installer** from the [v1.0.3 release page](https://github.com/sparshsam/pdfreader-by-sparsh/releases/tag/v1.0.3) — use `OpenReader-Setup.exe`. +1. **Download the installer** from the [v1.0.3 release page](https://github.com/sparshsam/openreader/releases/tag/v1.0.3) — use `OpenReader-Setup.exe`. 2. **Close OpenReader** if it is running (File → Quit, or close the window). 3. **Right-click the installer** and choose **Run as Administrator**. 4. **Install over the existing version** — use the same install location (`C:\Program Files\OpenReader` by default). diff --git a/docs/macos.md b/docs/macos.md index 2ff43c5..8ca61f3 100644 --- a/docs/macos.md +++ b/docs/macos.md @@ -30,8 +30,8 @@ Requirements: Clone and build: ```bash -git clone https://github.com/sparshsam/pdfreader-by-sparsh.git -cd pdfreader-by-sparsh +git clone https://github.com/sparshsam/openreader.git +cd openreader chmod +x scripts/build_macos.sh ./scripts/build_macos.sh ``` diff --git a/docs/privacy/index.html b/docs/privacy/index.html index 5e06340..4e06d47 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -36,7 +36,7 @@

Network Access

OpenReader makes a single optional network request:

@@ -67,10 +67,10 @@

Changes to This Policy

Contact

For questions about this privacy policy: open an issue on the -GitHub repository.

+GitHub repository.

diff --git a/docs/store-submission-checklist.md b/docs/store-submission-checklist.md index 9fee256..8adee98 100644 --- a/docs/store-submission-checklist.md +++ b/docs/store-submission-checklist.md @@ -3,8 +3,8 @@ **Target version:** v1.2.2 stable (MSIX version `1.2.2.0`) **Store ID:** `9MXDVW2645LL` **PFN:** `SparshSam.OpenReader_yh0byntbzd2qw` -**Status:** 🔜 In certification -**Privacy policy URL:** https://sparshsam.github.io/pdfreader-by-sparsh/privacy/ +**Status:** ✅ [Live in Microsoft Store](https://apps.microsoft.com/detail/9MXDVW2645LL) +**Privacy policy URL:** https://sparshsam.github.io/openreader/privacy/ **Upload artifact:** `OpenReader.msix` from v1.2.2 GitHub Release (built by release.yml workflow) --- @@ -92,7 +92,7 @@ Start-Process "OpenReader" | App Store icons | `assets\icon-*.png` (44, 71, 150, 310x150, 620x300) | Must match manifest declarations | | Screenshots (at least 1) | Capture from running app | 1366×768 or 1920×1080 PNG recommended | | Description text | See README overview section | 1–3 paragraphs, no HTML | -| Privacy policy URL | `https://sparshsam.github.io/pdfreader-by-sparsh/privacy/` | Published via GitHub Pages from repo `docs/` directory | +| Privacy policy URL | `https://sparshsam.github.io/openreader/privacy/` | Published via GitHub Pages from repo `docs/` directory | | Age rating questionnaire | Complete in Partner Center | Desktop app category | ### 2.2 Store Listing Details @@ -246,13 +246,13 @@ Write-Host "Publisher check: $($matches.Count -gt 0 ? 'PASS' : 'FAIL')" ## 6. Post-Submission Tasks -- [x] Publish privacy policy URL (published at `https://sparshsam.github.io/pdfreader-by-sparsh/privacy/`) -- [ ] Prepare Winget manifest for `SparshSam.OpenReader` — see [winget-preparation.md](winget-preparation.md) -- [ ] Monitor Partner Center certification report -- [ ] After acceptance: test Store install on clean Windows VM -- [ ] After acceptance: test Store upgrade over existing sideloaded installation -- [ ] Update `README.md` to reflect Store availability -- [ ] Update `docs/windows-distribution.md` with Store channel details +- [x] Publish privacy policy URL (published at `https://sparshsam.github.io/openreader/privacy/`) +- [x] Prepare Winget manifest for `SparshSam.OpenReader` — see [winget-preparation.md](winget-preparation.md) +- [x] Complete Partner Center certification +- [ ] Test Store install on clean Windows VM +- [ ] Test Store upgrade over existing sideloaded installation +- [x] Update `README.md` to reflect Store availability +- [x] Update `docs/windows-distribution.md` with Store channel details --- diff --git a/docs/updater-architecture.md b/docs/updater-architecture.md index 5dc0eb7..904297d 100644 --- a/docs/updater-architecture.md +++ b/docs/updater-architecture.md @@ -84,9 +84,9 @@ breaking upgrades. | Channel | Status | Update Mechanism | |---------|--------|-----------------| -| Microsoft Store | 🔜 In certification | Windows Update (automatic) | +| Microsoft Store | ✅ Live | Windows Update (automatic) | | GitHub Releases (MSIX) | ✅ Active | Manual download (unsigned — Developer Mode) | -| Winget | 🔜 Future | `winget install SparshSam.OpenReader` | +| Winget | 🟡 Manifest prepared | `winget install SparshSam.OpenReader` | | GitHub Releases (Setup.exe) | ⚠️ Legacy | Manual download only — no in-app updates | ## Components @@ -151,6 +151,6 @@ Once Store submission is active or App Installer is deployed: ## Future Work -- [x] Submit MSIX to Microsoft Store (in certification) +- [x] Publish MSIX in Microsoft Store - [ ] Deploy App Installer hosting infrastructure -- [ ] Submit Winget manifest +- [ ] Submit prepared Winget manifest diff --git a/docs/windows-distribution.md b/docs/windows-distribution.md index dfa0c22..a9cbf4a 100644 --- a/docs/windows-distribution.md +++ b/docs/windows-distribution.md @@ -1,7 +1,7 @@ # Windows Distribution Strategy **Version:** 1.2.0+ -**Status:** MSIX/App Installer migration — Store reserved +**Status:** Live in Microsoft Store; Winget manifest prepared ## Overview @@ -9,7 +9,7 @@ OpenReader has migrated from Inno Setup self-updating to **MSIX** — Microsoft' modern packaging format — with multiple distribution channels. The app no longer downloads or runs installers from within itself; Windows handles updates. -The Microsoft Store submission is currently in certification. +OpenReader is [live in the Microsoft Store](https://apps.microsoft.com/detail/9MXDVW2645LL). ## ⚠️ Frozen Identity (MSIX / Microsoft Store) @@ -60,8 +60,7 @@ CI auto-extracts from Git tag and pads to 4 parts: `${tag}.0` **Store ID:** `9MXDVW2645LL` -OpenReader is currently in Microsoft Store certification. Once approved, users can search for "OpenReader" -or install directly via: +Users can search for "OpenReader" in the Microsoft Store or install directly via: ``` ms-windows-store://pdp/?productid=9MXDVW2645LL @@ -95,9 +94,9 @@ is active. **Legacy Setup.exe:** Retained for manual recovery. No longer supports in-app update triggering. Requires admin rights (UAC). -### Discovery: Winget (Future) +### Discovery: Winget -**Planned package identifier:** `SparshSam.OpenReader` +**Package identifier:** `SparshSam.OpenReader` Once submitted to the [winget-pkgs](https://github.com/microsoft/winget-pkgs) community repository: @@ -107,11 +106,11 @@ winget install SparshSam.OpenReader ``` **Winget readiness checklist:** -- [ ] GitHub Releases must have predictable asset naming (done — `OpenReader.msix`) -- [ ] Release workflow produces consistent artifacts (done) -- [ ] Winget manifest: `manifests/s/SparshSam/OpenReader/1.2.0.0.yaml` -- [ ] Automated PR via winget release workflow (future) -- [ ] Update process: new release → winget bot auto-PR +- [x] Predictable release asset naming (`OpenReader-Setup.exe`) +- [x] Consistent release workflow +- [x] Multi-file manifest prepared under `packaging/winget/manifests/` +- [ ] Validate install and uninstall on Windows +- [ ] Submit the manifest PR to `microsoft/winget-pkgs` ## MSIX Packaging @@ -169,15 +168,15 @@ An OV or EV code-signing certificate enables sideloading without Developer Mode: 1. **v1.1.x users:** Install OpenReader MSIX alongside existing installation. User settings are in `%APPDATA%` (shared across versions). -2. **New users:** Prefer Microsoft Store when available; otherwise MSIX from - GitHub Releases (enable Developer Mode if unsigned). -3. **Future:** Store exclusively once Store submission is active. +2. **New users:** Prefer the Microsoft Store; advanced users may use the unsigned + GitHub MSIX with Developer Mode enabled. +3. **Winget users:** Use the Store product ID until the community manifest is merged. ## Open Items -- [ ] Submit MSIX to Microsoft Store +- [x] Publish MSIX in Microsoft Store - [ ] Procure code-signing certificate (if not using Store exclusively) - [ ] Implement App Installer hosting infrastructure -- [ ] Submit Winget manifest +- [ ] Submit prepared Winget manifest - [ ] Validate Store vs. sideload behavior - [ ] End-to-end update flow validation diff --git a/docs/winget-preparation.md b/docs/winget-preparation.md index 9072032..dd97701 100644 --- a/docs/winget-preparation.md +++ b/docs/winget-preparation.md @@ -1,91 +1,105 @@ -# Winget Support Preparation +# Winget Publication -**Status:** 🔜 Not yet published +**Community repository status:** 🟡 Manifest prepared; Windows validation and PR submission pending +**Microsoft Store status:** ✅ [Live in Microsoft Store](https://apps.microsoft.com/detail/9MXDVW2645LL) ## Package Identity | Field | Value | |---|---| -| Package identifier | `SparshSam.OpenReader` | +| Community package identifier | `SparshSam.OpenReader` | +| Microsoft Store product ID | `9MXDVW2645LL` | | Package family name | `SparshSam.OpenReader_yh0byntbzd2qw` | | Publisher | `Sparsh Sam` | -| License | AGPL-3.0 | -| Installer type | MSIX | +| License | AGPL-3.0-only | +| Community installer type | Inno Setup | -## Requirements +The Microsoft Store and Winget community repository are separate sources. The Store +listing can be installed directly with: -Before submitting to [winget-pkgs](https://github.com/microsoft/winget-pkgs): +```powershell +winget install --id 9MXDVW2645LL --source msstore +``` + +The `winget-pkgs` schema does not support a Store listing as an installer. The +community manifest therefore uses the versioned `OpenReader-Setup.exe` release +asset and exposes the stable `SparshSam.OpenReader` identifier: + +```powershell +winget install --id SparshSam.OpenReader --exact +``` -- [x] GitHub Releases must have predictable asset naming (done — `OpenReader.msix`) -- [x] Release workflow produces consistent artifacts (done) -- [ ] **Microsoft Store certification is approved** (blocking — wait for Store approval) -- [ ] Stable release validation passes a Store-signed installation cycle -- [ ] Winget manifest is prepared (see below) -- [ ] Automated PR via winget release workflow is considered +The GitHub `OpenReader.msix` is deliberately not used by the community manifest: +v1.2.2 is unsigned and cannot install on a normal Windows configuration. Store +certification does not add a signature to the separately published GitHub asset. -## Manifest Structure +## Prepared Manifest + +The submit-ready multi-file manifest is tracked at: ```text -manifests/ - s/ - SparshSam/ - OpenReader/ - 1.2.2.0.yaml +packaging/winget/manifests/ + s/SparshSam/OpenReader/1.2.2/ + SparshSam.OpenReader.yaml + SparshSam.OpenReader.installer.yaml + SparshSam.OpenReader.locale.en-US.yaml ``` -### Manifest Template (prepare, do not submit) - -```yaml -PackageIdentifier: SparshSam.OpenReader -PackageVersion: 1.2.2.0 -PackageLocale: en-US -Publisher: Sparsh Sam -PublisherUrl: https://github.com/sparshsam -PublisherSupportUrl: https://github.com/sparshsam/pdfreader-by-sparsh/issues -Author: Sparsh Sam -PackageName: OpenReader -PackageUrl: https://github.com/sparshsam/pdfreader-by-sparsh -License: AGPL-3.0 -LicenseUrl: https://github.com/sparshsam/pdfreader-by-sparsh/blob/main/LICENSE -ShortDescription: Privacy-first, local-only PDF utility. -Moniker: openreader -Tags: - - pdf - - reader - - privacy - - local-first -InstallerType: msix -Installers: - - Architecture: x64 - InstallerUrl: https://github.com/sparshsam/pdfreader-by-sparsh/releases/download/v1.2.2/OpenReader.msix - InstallerSha256: [REPLACE WITH ACTUAL SHA256] -PackageFamilyName: SparshSam.OpenReader_yh0byntbzd2qw -ManifestType: singleton -ManifestVersion: 1.0.0 -``` +Verified release metadata: + +| Field | Value | +|---|---| +| Release | `v1.2.2` | +| Published | 2026-06-18 | +| Asset | `OpenReader-Setup.exe` | +| SHA-256 | `2FC3EC8D7439B21379FBB82A7E4E4F5B15B8E32E678B98DDFC9A1743EED359B2` | +| Inno product code | `{D3A7F9E1-4B2C-4A8F-9E6D-1C5B3A7F9E01}_is1` | + +## Validation and Submission + +Complete these steps on Windows after the GitHub repository rename is live: -## Release Checklist Addition +```powershell +# Confirm no package or open PR already uses the identifier. +winget search --id SparshSam.OpenReader --exact -Add this step to `RELEASE.md` after the existing validation checklist: +# Validate schema and semantics. +winget validate --manifest .\packaging\winget\manifests\s\SparshSam\OpenReader\1.2.2 + +# Test an unattended install from the local manifest. +winget settings --enable LocalManifestFiles +winget install --manifest .\packaging\winget\manifests\s\SparshSam\OpenReader\1.2.2 --silent + +# Submit with winget-create after its GitHub authentication step. +wingetcreate submit .\packaging\winget\manifests\s\SparshSam\OpenReader\1.2.2 +``` -> - [ ] After Store approval and stable release validation, prepare Winget manifest update: -> 1. Fork [winget-pkgs](https://github.com/microsoft/winget-pkgs) -> 2. Create `manifests/s/SparshSam/OpenReader//` -> 3. Copy manifest template with updated version + SHA256 -> 4. Submit PR +Before submission, verify that installation succeeds in Windows Sandbox, OpenReader +launches, version `1.2.2` is shown, `winget list --id SparshSam.OpenReader --exact` +correlates the installed package, and uninstall succeeds. -## Versioning +## Release Checklist -Winget uses the MSIX 4-part version string (e.g. `1.2.2.0`), which matches the version -in `AppxManifest.xml`. Each new release requires a new manifest directory. +- [x] Stable release asset naming (`OpenReader-Setup.exe`) +- [x] Stable release workflow +- [x] Microsoft Store certification approved +- [x] Multi-file Winget 1.12 manifest prepared +- [x] Release hashes independently verified +- [ ] Repository renamed and new release URL confirmed +- [ ] Local manifest validated with Winget on Windows +- [ ] Silent install, launch, detection, upgrade, and uninstall tested in Windows Sandbox +- [ ] Manifest submitted to `microsoft/winget-pkgs` +- [ ] Submission PR merged and `winget install --id SparshSam.OpenReader --exact` verified -## Update Flow +## Future Releases -After initial submission, the winget bot automatically detects new releases and -opens PRs to update the manifest. No manual submission is needed for subsequent releases. +Winget package versions follow the semantic GitHub release version (`1.2.2`), not +the four-part internal MSIX version (`1.2.2.0`). For each stable release: -## Notes +1. Publish and test `OpenReader-Setup.exe`. +2. Run `wingetcreate update SparshSam.OpenReader -u `. +3. Validate the generated manifest in Windows Sandbox. +4. Submit one package-version PR to `microsoft/winget-pkgs`. -- Do not submit Winget until Store certification is approved. -- Do not submit Winget before validating a Store-signed installation cycle. -- The SHA256 hash in the manifest must match the MSIX attached to the GitHub Release. +Do not assume that Winget will automatically open update PRs. Configure a separate +release automation only after the first community manifest is merged. diff --git a/installer/setup.iss b/installer/setup.iss index f00ebce..a467f53 100644 --- a/installer/setup.iss +++ b/installer/setup.iss @@ -8,7 +8,7 @@ #endif #define MyAppVersion AppVersion #define MyAppPublisher "Sparsh Sam" -#define MyAppURL "https://github.com/sparshsam/pdfreader-by-sparsh" +#define MyAppURL "https://github.com/sparshsam/openreader" #define MyAppExeName "OpenReader.exe" [Setup] diff --git a/main.py b/main.py index 4cb83c4..46173e8 100644 --- a/main.py +++ b/main.py @@ -51,7 +51,7 @@ __version__ = "1.2.2" -GITHUB_REPO = "sparshsam/pdfreader-by-sparsh" +GITHUB_REPO = "sparshsam/openreader" IPC_SERVER_NAME = "OpenReader-IPC" RECENT_FILES_MAX = 10 SETTINGS_RECENT_KEY = "***" @@ -2827,6 +2827,17 @@ def _show_about(self): layout.addSpacing(4) # Links + store_link = QLabel( + "

" + "Get OpenReader on Microsoft Store" + "

" + ) + store_link.setOpenExternalLinks(False) + store_link.linkActivated.connect(self._open_store_listing) + store_link.setAlignment(Qt.AlignCenter) + layout.addWidget(store_link) + links = QLabel( f"

" f"GitHub Repository" @@ -2861,6 +2872,13 @@ def _show_about(self): dlg.exec() + @staticmethod + def _open_store_listing(_link=None): + """Open the native Store listing, falling back to its web page.""" + store_uri = QUrl("ms-windows-store://pdp/?productid=9MXDVW2645LL") + if not QDesktopServices.openUrl(store_uri): + QDesktopServices.openUrl(QUrl("https://apps.microsoft.com/detail/9MXDVW2645LL")) + def _set_app_icon(self): """Set window icon from bundled .ico file with exhaustive fallback logging.""" icon_paths = [] diff --git a/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.installer.yaml b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.installer.yaml new file mode 100644 index 0000000..bacfcb6 --- /dev/null +++ b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.installer.yaml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.12.0.schema.json + +PackageIdentifier: SparshSam.OpenReader +PackageVersion: 1.2.2 +InstallerType: inno +Scope: machine +UpgradeBehavior: install +FileExtensions: + - pdf +ProductCode: '{D3A7F9E1-4B2C-4A8F-9E6D-1C5B3A7F9E01}_is1' +ReleaseDate: 2026-06-18 +Installers: + - Architecture: x64 + InstallerUrl: https://github.com/sparshsam/openreader/releases/download/v1.2.2/OpenReader-Setup.exe + InstallerSha256: 2FC3EC8D7439B21379FBB82A7E4E4F5B15B8E32E678B98DDFC9A1743EED359B2 +ManifestType: installer +ManifestVersion: 1.12.0 diff --git a/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.locale.en-US.yaml b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.locale.en-US.yaml new file mode 100644 index 0000000..8224259 --- /dev/null +++ b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.locale.en-US.yaml @@ -0,0 +1,24 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.12.0.schema.json + +PackageIdentifier: SparshSam.OpenReader +PackageVersion: 1.2.2 +PackageLocale: en-US +Publisher: Sparsh Sam +PublisherUrl: https://github.com/sparshsam +PublisherSupportUrl: https://github.com/sparshsam/openreader/issues +Author: Sparsh Sam +PackageName: OpenReader +PackageUrl: https://github.com/sparshsam/openreader +License: AGPL-3.0-only +LicenseUrl: https://github.com/sparshsam/openreader/blob/main/LICENSE +ShortDescription: A privacy-first, local-only PDF reader and utility for Windows. +Description: OpenReader reads, searches, copies, merges, splits, extracts, and compresses PDF files locally without uploading documents. +Moniker: openreader +Tags: + - local-first + - pdf + - pdf-reader + - privacy +ReleaseNotesUrl: https://github.com/sparshsam/openreader/releases/tag/v1.2.2 +ManifestType: defaultLocale +ManifestVersion: 1.12.0 diff --git a/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.yaml b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.yaml new file mode 100644 index 0000000..1c05bed --- /dev/null +++ b/packaging/winget/manifests/s/SparshSam/OpenReader/1.2.2/SparshSam.OpenReader.yaml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.12.0.schema.json + +PackageIdentifier: SparshSam.OpenReader +PackageVersion: 1.2.2 +DefaultLocale: en-US +ManifestType: version +ManifestVersion: 1.12.0 diff --git a/pdfreader_lib/mcp_server.py b/pdfreader_lib/mcp_server.py index 4f2ad0a..4950e7c 100644 --- a/pdfreader_lib/mcp_server.py +++ b/pdfreader_lib/mcp_server.py @@ -14,7 +14,7 @@ Agent configuration (Claude Code, Hermes, etc.): { "mcpServers": { - "pdfreader-by-sparsh": { + "openreader": { "command": "python", "args": ["-m", "pdfreader_lib.mcp_server"] } @@ -578,7 +578,7 @@ def _err(msg: str) -> list[TextContent]: async def serve_stdio() -> None: """Run the MCP server over stdio transport (standard for AI agents).""" - server = Server("pdfreader-by-sparsh") + server = Server("openreader") @server.list_tools() async def _list_tools() -> list[Tool]: @@ -756,7 +756,7 @@ async def serve_sse(host: str = "0.0.0.0", port: int = 8312) -> None: import uvicorn - server = Server("pdfreader-by-sparsh") + server = Server("openreader") @server.list_tools() async def _list_tools() -> list[Tool]: diff --git a/tests/test_reliability.py b/tests/test_reliability.py index 0eb8ed5..8448da8 100644 --- a/tests/test_reliability.py +++ b/tests/test_reliability.py @@ -62,7 +62,7 @@ def test_version_format(self): def test_github_repo_is_correct(self): import main as m - assert m.GITHUB_REPO == "sparshsam/pdfreader-by-sparsh" + assert m.GITHUB_REPO == "sparshsam/openreader" # --------------------------------------------------------------------------- @@ -146,6 +146,38 @@ def test_shortcuts_have_key_event_fallback_for_focused_widgets(self): assert "Qt.Key_0: self._fit_width_shortcut" in src +class TestAboutStoreLink: + """Verify the About dialog prefers the Store app with a web fallback.""" + + def test_store_link_uses_native_uri_when_available(self, monkeypatch): + import main as m + + opened = [] + monkeypatch.setattr(m.QDesktopServices, "openUrl", lambda url: opened.append(url.toString()) or True) + + m.PdfReaderWindow._open_store_listing() + + assert opened == ["ms-windows-store://pdp/?productid=9MXDVW2645LL"] + + def test_store_link_falls_back_to_web_listing(self, monkeypatch): + import main as m + + opened = [] + + def open_url(url): + opened.append(url.toString()) + return len(opened) > 1 + + monkeypatch.setattr(m.QDesktopServices, "openUrl", open_url) + + m.PdfReaderWindow._open_store_listing() + + assert opened == [ + "ms-windows-store://pdp/?productid=9MXDVW2645LL", + "https://apps.microsoft.com/detail/9MXDVW2645LL", + ] + + # --------------------------------------------------------------------------- # Open action signal handling # --------------------------------------------------------------------------- diff --git a/tools/test_updater_asset_flow.py b/tools/test_updater_asset_flow.py index 9135737..864b071 100644 --- a/tools/test_updater_asset_flow.py +++ b/tools/test_updater_asset_flow.py @@ -51,7 +51,7 @@ def test_classify_update_available(): """When remote is newer, outcome is update_available.""" body = json.dumps({ "tag_name": "v0.4.0", - "html_url": "https://github.com/sparshsam/pdfreader-by-sparsh/releases/tag/v0.4.0", + "html_url": "https://github.com/sparshsam/openreader/releases/tag/v0.4.0", "body": "Bug fixes.", }) r = PdfReaderWindow._classify_update_response(200, False, "", body, "0.3.3")