mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-22 12:11:27 -07:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
e2a7597b4f
|
|||
|
2e59c21078
|
|||
|
7b5ab3294d
|
|||
|
2bbf38f987
|
106
.github/workflows/release.yml
vendored
106
.github/workflows/release.yml
vendored
@@ -10,7 +10,6 @@ concurrency:
|
|||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
actions: read
|
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -220,26 +219,6 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-bun-
|
${{ runner.os }}-bun-
|
||||||
|
|
||||||
- name: Validate Windows signing secrets
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
missing=0
|
|
||||||
for name in SIGNPATH_API_TOKEN SIGNPATH_ORGANIZATION_ID SIGNPATH_PROJECT_SLUG SIGNPATH_SIGNING_POLICY_SLUG; do
|
|
||||||
if [ -z "${!name}" ]; then
|
|
||||||
echo "Missing required secret: $name"
|
|
||||||
missing=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ "$missing" -ne 0 ]; then
|
|
||||||
echo "Set the SignPath Windows signing secrets and rerun."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
SIGNPATH_API_TOKEN: ${{ secrets.SIGNPATH_API_TOKEN }}
|
|
||||||
SIGNPATH_ORGANIZATION_ID: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
|
|
||||||
SIGNPATH_PROJECT_SLUG: ${{ secrets.SIGNPATH_PROJECT_SLUG }}
|
|
||||||
SIGNPATH_SIGNING_POLICY_SLUG: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }}
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: bun install --frozen-lockfile
|
run: bun install --frozen-lockfile
|
||||||
|
|
||||||
@@ -251,96 +230,17 @@ jobs:
|
|||||||
bun run build
|
bun run build
|
||||||
|
|
||||||
- name: Build unsigned Windows artifacts
|
- name: Build unsigned Windows artifacts
|
||||||
run: bun run build:win
|
run: bun run build:win:unsigned
|
||||||
|
|
||||||
- name: Upload unsigned Windows artifact for SignPath
|
- name: Upload Windows artifacts
|
||||||
id: upload-unsigned-windows-artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: unsigned-windows
|
name: windows
|
||||||
path: |
|
path: |
|
||||||
release/*.exe
|
release/*.exe
|
||||||
release/*.zip
|
release/*.zip
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Submit Windows signing request (attempt 1)
|
|
||||||
id: signpath-sign-attempt-1
|
|
||||||
continue-on-error: true
|
|
||||||
uses: signpath/github-action-submit-signing-request@v2
|
|
||||||
with:
|
|
||||||
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
|
|
||||||
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
|
|
||||||
project-slug: ${{ secrets.SIGNPATH_PROJECT_SLUG }}
|
|
||||||
signing-policy-slug: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }}
|
|
||||||
github-artifact-id: ${{ steps.upload-unsigned-windows-artifact.outputs.artifact-id }}
|
|
||||||
wait-for-completion: true
|
|
||||||
output-artifact-directory: signed-windows-attempt-1
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Submit Windows signing request (attempt 2)
|
|
||||||
id: signpath-sign-attempt-2
|
|
||||||
if: steps.signpath-sign-attempt-1.outcome == 'failure'
|
|
||||||
continue-on-error: true
|
|
||||||
uses: signpath/github-action-submit-signing-request@v2
|
|
||||||
with:
|
|
||||||
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
|
|
||||||
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
|
|
||||||
project-slug: ${{ secrets.SIGNPATH_PROJECT_SLUG }}
|
|
||||||
signing-policy-slug: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }}
|
|
||||||
github-artifact-id: ${{ steps.upload-unsigned-windows-artifact.outputs.artifact-id }}
|
|
||||||
wait-for-completion: true
|
|
||||||
output-artifact-directory: signed-windows-attempt-2
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Submit Windows signing request (attempt 3)
|
|
||||||
id: signpath-sign-attempt-3
|
|
||||||
if: steps.signpath-sign-attempt-1.outcome == 'failure' && steps.signpath-sign-attempt-2.outcome == 'failure'
|
|
||||||
continue-on-error: true
|
|
||||||
uses: signpath/github-action-submit-signing-request@v2
|
|
||||||
with:
|
|
||||||
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
|
|
||||||
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
|
|
||||||
project-slug: ${{ secrets.SIGNPATH_PROJECT_SLUG }}
|
|
||||||
signing-policy-slug: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }}
|
|
||||||
github-artifact-id: ${{ steps.upload-unsigned-windows-artifact.outputs.artifact-id }}
|
|
||||||
wait-for-completion: true
|
|
||||||
output-artifact-directory: signed-windows-attempt-3
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Fail when all SignPath signing attempts fail
|
|
||||||
if: steps.signpath-sign-attempt-1.outcome == 'failure' && steps.signpath-sign-attempt-2.outcome == 'failure' && steps.signpath-sign-attempt-3.outcome == 'failure'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "All SignPath signing attempts failed; rerun the workflow when SignPath is healthy."
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
- name: Upload signed Windows artifacts (attempt 1)
|
|
||||||
if: steps.signpath-sign-attempt-1.outcome == 'success'
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows
|
|
||||||
path: |
|
|
||||||
signed-windows-attempt-1/*.exe
|
|
||||||
signed-windows-attempt-1/*.zip
|
|
||||||
|
|
||||||
- name: Upload signed Windows artifacts (attempt 2)
|
|
||||||
if: steps.signpath-sign-attempt-2.outcome == 'success'
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows
|
|
||||||
path: |
|
|
||||||
signed-windows-attempt-2/*.exe
|
|
||||||
signed-windows-attempt-2/*.zip
|
|
||||||
|
|
||||||
- name: Upload signed Windows artifacts (attempt 3)
|
|
||||||
if: steps.signpath-sign-attempt-3.outcome == 'success'
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows
|
|
||||||
path: |
|
|
||||||
signed-windows-attempt-3/*.exe
|
|
||||||
signed-windows-attempt-3/*.zip
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs: [build-linux, build-macos, build-windows]
|
needs: [build-linux, build-macos, build-windows]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -37,3 +37,4 @@ tests/*
|
|||||||
.worktrees/
|
.worktrees/
|
||||||
.codex/*
|
.codex/*
|
||||||
.agents/*
|
.agents/*
|
||||||
|
favicon.png
|
||||||
|
|||||||
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,5 +1,16 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v0.5.3 (2026-03-09)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Release: Publish unsigned Windows `.exe` and `.zip` artifacts directly from release CI instead of routing them through SignPath.
|
||||||
|
- Release: Added `bun run build:win:unsigned` for explicit local unsigned Windows packaging.
|
||||||
|
|
||||||
|
## v0.5.2 (2026-03-09)
|
||||||
|
|
||||||
|
### Internal
|
||||||
|
- Release: Pinned the Windows SignPath submission workflow to an explicit artifact-configuration slug instead of relying on the SignPath project's default configuration.
|
||||||
|
|
||||||
## v0.5.1 (2026-03-09)
|
## v0.5.1 (2026-03-09)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -20,8 +20,6 @@
|
|||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
Initial packaged Windows support is now available alongside the existing Linux and macOS builds.
|
|
||||||
|
|
||||||
## What it does
|
## What it does
|
||||||
|
|
||||||
SubMiner is an Electron overlay that sits on top of mpv. It turns your video player into a full sentence-mining workstation:
|
SubMiner is an Electron overlay that sits on top of mpv. It turns your video player into a full sentence-mining workstation:
|
||||||
@@ -71,7 +69,7 @@ SubMiner.AppImage
|
|||||||
|
|
||||||
On macOS, launch `SubMiner.app`. On Windows, launch `SubMiner.exe` from the Start menu or install directory.
|
On macOS, launch `SubMiner.app`. On Windows, launch `SubMiner.exe` from the Start menu or install directory.
|
||||||
|
|
||||||
On first launch, SubMiner now:
|
On first launch, SubMiner:
|
||||||
|
|
||||||
- starts in the tray/background
|
- starts in the tray/background
|
||||||
- creates the default config directory and `config.jsonc`
|
- creates the default config directory and `config.jsonc`
|
||||||
@@ -114,17 +112,6 @@ Windows builds use native window tracking and do not require the Linux composito
|
|||||||
|
|
||||||
For full guides on configuration, Anki, Jellyfin, and more, see [docs.subminer.moe](https://docs.subminer.moe).
|
For full guides on configuration, Anki, Jellyfin, and more, see [docs.subminer.moe](https://docs.subminer.moe).
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
- Run `bun run test` or `bun run test:fast` for the default fast lane: config/core coverage plus representative entry/runtime, Anki integration, and main runtime checks.
|
|
||||||
- Run `bun run test:full` for the maintained test surface: Bun-compatible `src/**` coverage, Bun-compatible launcher unit coverage, and the maintained dist compatibility slice for `ipc`, `anki-jimaku-ipc`, `overlay-manager`, `config-validation`, `startup-config`, and runtime registry coverage.
|
|
||||||
- Run `bun run test:node:compat` directly when you only need that dist compatibility slice. The command name is legacy; it now runs under Bun.
|
|
||||||
- Run `bun run test:env` for environment-specific verification: launcher smoke/plugin checks plus the SQLite-backed immersion tracker lane.
|
|
||||||
- Run `bun run test:immersion:sqlite` when you specifically need the dist SQLite persistence coverage.
|
|
||||||
- Run `bun run test:subtitle` for the maintained `alass`/`ffsubsync` subtitle surface.
|
|
||||||
|
|
||||||
The Bun-managed discovery lanes intentionally exclude a small set of suites from the source-file discovery pass and keep them in the maintained dist compatibility slice instead: Electron-focused tests in `src/core/services/ipc.test.ts`, `src/core/services/anki-jimaku-ipc.test.ts`, and `src/core/services/overlay-manager.test.ts`, plus runtime/config tests in `src/main/config-validation.test.ts`, `src/main/runtime/startup-config.test.ts`, and `src/main/runtime/registry.test.ts`. `bun run test:node:compat` keeps those suites in the standard workflow instead of leaving them untracked.
|
|
||||||
|
|
||||||
## Acknowledgments
|
## Acknowledgments
|
||||||
|
|
||||||
Built on the shoulders of [GameSentenceMiner](https://github.com/bpwhelan/GameSentenceMiner), [Renji's Texthooker Page](https://github.com/Renji-XD/texthooker-ui), [mpvacious](https://github.com/Ajatt-Tools/mpvacious), [Anacreon-Script](https://github.com/friedrich-de/Anacreon-Script), and [Bee's Character Dictionary](https://github.com/bee-san/Japanese_Character_Name_Dictionary). Subtitles powered by [Jimaku.cc](https://jimaku.cc). Dictionary lookups via [Yomitan](https://github.com/yomidevs/yomitan).
|
Built on the shoulders of [GameSentenceMiner](https://github.com/bpwhelan/GameSentenceMiner), [Renji's Texthooker Page](https://github.com/Renji-XD/texthooker-ui), [mpvacious](https://github.com/Ajatt-Tools/mpvacious), [Anacreon-Script](https://github.com/friedrich-de/Anacreon-Script), and [Bee's Character Dictionary](https://github.com/bee-san/Japanese_Character_Name_Dictionary). Subtitles powered by [Jimaku.cc](https://jimaku.cc). Dictionary lookups via [Yomitan](https://github.com/yomidevs/yomitan).
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
---
|
||||||
|
id: TASK-136
|
||||||
|
title: Pin SignPath artifact configuration in release workflow
|
||||||
|
status: Done
|
||||||
|
assignee:
|
||||||
|
- codex
|
||||||
|
created_date: '2026-03-08 20:41'
|
||||||
|
updated_date: '2026-03-08 20:58'
|
||||||
|
labels:
|
||||||
|
- ci
|
||||||
|
- release
|
||||||
|
- windows
|
||||||
|
- signing
|
||||||
|
dependencies:
|
||||||
|
- TASK-134
|
||||||
|
references:
|
||||||
|
- .github/workflows/release.yml
|
||||||
|
- build/signpath-windows-artifact-config.xml
|
||||||
|
- src/release-workflow.test.ts
|
||||||
|
priority: high
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
The Windows release workflow currently relies on the default SignPath artifact configuration configured in the SignPath UI. Pin the workflow to an explicit artifact-configuration slug so the checked-in signing configuration and CI behavior stay deterministic across future SignPath project changes.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [ ] #1 The Windows release workflow validates a dedicated SignPath artifact-configuration secret/input.
|
||||||
|
- [ ] #2 Every SignPath submission attempt passes `artifact-configuration-slug`.
|
||||||
|
- [ ] #3 Regression coverage fails if the explicit SignPath artifact-configuration binding is removed.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Implementation Plan
|
||||||
|
|
||||||
|
<!-- SECTION:PLAN:BEGIN -->
|
||||||
|
1. Add a failing workflow regression test for the explicit SignPath artifact-configuration slug.
|
||||||
|
2. Patch the Windows signing secret validation and SignPath action inputs to require the slug.
|
||||||
|
3. Run targeted release-workflow verification plus the standard fast lane.
|
||||||
|
4. Cut a new patch release so the tag-triggered release workflow runs with the pinned SignPath configuration.
|
||||||
|
<!-- SECTION:PLAN:END -->
|
||||||
|
|
||||||
|
## Implementation Notes
|
||||||
|
|
||||||
|
<!-- SECTION:NOTES:BEGIN -->
|
||||||
|
Added regression coverage in `src/release-workflow.test.ts` for an explicit SignPath artifact-configuration slug so the release workflow test now fails if the slug validation or action input is removed.
|
||||||
|
|
||||||
|
Patched `.github/workflows/release.yml` so Windows signing now requires `SIGNPATH_ARTIFACT_CONFIGURATION_SLUG` during secret validation and passes `artifact-configuration-slug: ${{ secrets.SIGNPATH_ARTIFACT_CONFIGURATION_SLUG }}` on every SignPath submission attempt.
|
||||||
|
|
||||||
|
Verification: `bun test src/release-workflow.test.ts`, `bun run typecheck`, `bun run test:fast`.
|
||||||
|
<!-- SECTION:NOTES:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
The release workflow is now pinned to an explicit SignPath artifact configuration instead of relying on whichever SignPath artifact config is marked default in the UI. Windows signing secret validation fails fast if `SIGNPATH_ARTIFACT_CONFIGURATION_SLUG` is missing, and every SignPath submission attempt now includes the pinned slug.
|
||||||
|
|
||||||
|
Validation: `bun test src/release-workflow.test.ts`, `bun run typecheck`, `bun run test:fast`.
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
id: TASK-137
|
||||||
|
title: Cut patch release v0.5.2 for SignPath artifact config pinning
|
||||||
|
status: Done
|
||||||
|
assignee:
|
||||||
|
- codex
|
||||||
|
created_date: '2026-03-08 20:44'
|
||||||
|
updated_date: '2026-03-08 20:58'
|
||||||
|
labels:
|
||||||
|
- release
|
||||||
|
- patch
|
||||||
|
dependencies:
|
||||||
|
- TASK-136
|
||||||
|
references:
|
||||||
|
- package.json
|
||||||
|
- CHANGELOG.md
|
||||||
|
- release/release-notes.md
|
||||||
|
priority: high
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
Publish a patch release from the SignPath artifact-configuration pinning change by bumping the app version, generating the committed changelog artifacts for the new version, and pushing a new `v0.5.2` tag.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [ ] #1 Repository version metadata is updated to `0.5.2`.
|
||||||
|
- [ ] #2 `CHANGELOG.md` and `release/release-notes.md` contain the committed `v0.5.2` section and consumed fragments are removed.
|
||||||
|
- [ ] #3 New `v0.5.2` commit and tag are pushed to `origin`.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Implementation Plan
|
||||||
|
|
||||||
|
<!-- SECTION:PLAN:BEGIN -->
|
||||||
|
1. Add the release fragment for the SignPath configuration pinning change.
|
||||||
|
2. Bump `package.json` to `0.5.2` and run the changelog builder.
|
||||||
|
3. Run changelog/typecheck/test verification.
|
||||||
|
4. Commit the release-prep change set, create `v0.5.2`, and push commit plus tag.
|
||||||
|
<!-- SECTION:PLAN:END -->
|
||||||
|
|
||||||
|
## Implementation Notes
|
||||||
|
|
||||||
|
<!-- SECTION:NOTES:BEGIN -->
|
||||||
|
Bumped `package.json` from `0.5.1` to `0.5.2`, ran `bun run changelog:build`, and committed the generated release artifacts. That prepended the `v0.5.2` section to `CHANGELOG.md`, regenerated `release/release-notes.md`, and removed the consumed `changes/signpath-artifact-config-pin.md` fragment.
|
||||||
|
|
||||||
|
Verification before tagging: `bun run changelog:lint`, `bun run changelog:check --version 0.5.2`, `bun run typecheck`, and `bun run test:fast`.
|
||||||
|
<!-- SECTION:NOTES:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
Prepared patch release `v0.5.2` so the explicit SignPath artifact-configuration pin ships on a fresh release tag. Version metadata, committed changelog artifacts, and release notes are aligned with the new patch version.
|
||||||
|
|
||||||
|
Validation: `bun run changelog:lint`, `bun run changelog:check --version 0.5.2`, `bun run typecheck`, `bun run test:fast`.
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
id: TASK-138
|
||||||
|
title: Publish unsigned Windows release artifacts and add local unsigned build script
|
||||||
|
status: Done
|
||||||
|
assignee:
|
||||||
|
- codex
|
||||||
|
created_date: '2026-03-09 00:00'
|
||||||
|
updated_date: '2026-03-09 00:00'
|
||||||
|
labels:
|
||||||
|
- release
|
||||||
|
- windows
|
||||||
|
dependencies: []
|
||||||
|
references:
|
||||||
|
- .github/workflows/release.yml
|
||||||
|
- package.json
|
||||||
|
- src/release-workflow.test.ts
|
||||||
|
priority: high
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
Stop the tag-driven release workflow from depending on SignPath and publish unsigned Windows `.exe` and `.zip` artifacts directly. Add an explicit local `build:win:unsigned` script without changing the existing `build:win` command.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [x] #1 Windows release CI builds unsigned artifacts without requiring SignPath secrets.
|
||||||
|
- [x] #2 The Windows release job uploads `release/*.exe` and `release/*.zip` directly as the `windows` artifact.
|
||||||
|
- [x] #3 The repo exposes a local `build:win:unsigned` script for explicit unsigned Windows packaging.
|
||||||
|
- [x] #4 Regression coverage fails if the workflow reintroduces SignPath submission or drops the unsigned script.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Implementation Plan
|
||||||
|
|
||||||
|
<!-- SECTION:PLAN:BEGIN -->
|
||||||
|
1. Update workflow regression tests to assert unsigned Windows release behavior and the new local script.
|
||||||
|
2. Patch `package.json` to add `build:win:unsigned`.
|
||||||
|
3. Patch `.github/workflows/release.yml` to build unsigned Windows artifacts and upload them directly.
|
||||||
|
4. Add the release changelog fragment and run focused verification.
|
||||||
|
<!-- SECTION:PLAN:END -->
|
||||||
|
|
||||||
|
## Implementation Notes
|
||||||
|
|
||||||
|
<!-- SECTION:NOTES:BEGIN -->
|
||||||
|
Removed the Windows SignPath secret validation and submission steps from `.github/workflows/release.yml`. The Windows release job now runs `bun run build:win:unsigned` and uploads `release/*.exe` and `release/*.zip` directly as the `windows` artifact consumed by the release job.
|
||||||
|
|
||||||
|
Added `scripts/build-win-unsigned.mjs` plus the `build:win:unsigned` package script. The wrapper clears Windows code-signing environment variables and disables identity auto-discovery before invoking `electron-builder`, so release CI stays unsigned even if signing credentials are configured elsewhere.
|
||||||
|
|
||||||
|
Updated `src/release-workflow.test.ts` to assert the unsigned workflow contract and added the release changelog fragment in `changes/unsigned-windows-release-builds.md`.
|
||||||
|
<!-- SECTION:NOTES:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
Windows release CI now publishes unsigned artifacts directly and no longer depends on SignPath. Local developers also have an explicit `bun run build:win:unsigned` path for unsigned packaging without changing the existing `build:win` command.
|
||||||
|
|
||||||
|
Verification:
|
||||||
|
- `bun test src/release-workflow.test.ts`
|
||||||
|
- `bun run typecheck`
|
||||||
|
- `node --check scripts/build-win-unsigned.mjs`
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
id: TASK-139
|
||||||
|
title: Cut patch release v0.5.3 for unsigned Windows release builds
|
||||||
|
status: Done
|
||||||
|
assignee:
|
||||||
|
- codex
|
||||||
|
created_date: '2026-03-09 00:00'
|
||||||
|
updated_date: '2026-03-09 00:00'
|
||||||
|
labels:
|
||||||
|
- release
|
||||||
|
- patch
|
||||||
|
dependencies:
|
||||||
|
- TASK-138
|
||||||
|
references:
|
||||||
|
- package.json
|
||||||
|
- CHANGELOG.md
|
||||||
|
- release/release-notes.md
|
||||||
|
priority: high
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
Publish a patch release from the unsigned Windows release-build change by bumping the app version, generating committed changelog artifacts for `v0.5.3`, and pushing the release-prep commit.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [x] #1 Repository version metadata is updated to `0.5.3`.
|
||||||
|
- [x] #2 `CHANGELOG.md` and `release/release-notes.md` contain the committed `v0.5.3` section and consumed fragments are removed.
|
||||||
|
- [x] #3 New `v0.5.3` release-prep commit is pushed to `origin/main`.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Implementation Plan
|
||||||
|
|
||||||
|
<!-- SECTION:PLAN:BEGIN -->
|
||||||
|
1. Bump `package.json` from `0.5.2` to `0.5.3`.
|
||||||
|
2. Run `bun run changelog:build` so committed changelog artifacts match the new patch version.
|
||||||
|
3. Run changelog/typecheck/test verification.
|
||||||
|
4. Commit the release-prep change set and push `main`.
|
||||||
|
<!-- SECTION:PLAN:END -->
|
||||||
|
|
||||||
|
## Implementation Notes
|
||||||
|
|
||||||
|
<!-- SECTION:NOTES:BEGIN -->
|
||||||
|
Bumped `package.json` from `0.5.2` to `0.5.3`, ran `bun run changelog:build`, and committed the generated release artifacts. That prepended the `v0.5.3` section to `CHANGELOG.md`, regenerated `release/release-notes.md`, and removed the consumed `changes/unsigned-windows-release-builds.md` fragment.
|
||||||
|
|
||||||
|
Verification before push: `bun run changelog:lint`, `bun run changelog:check --version 0.5.3`, `bun run typecheck`, and `bun run test:fast`.
|
||||||
|
<!-- SECTION:NOTES:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
Prepared patch release `v0.5.3` so the unsigned Windows release-build change is captured in committed release metadata on `main`. Version metadata, changelog output, and release notes are aligned with the new patch version.
|
||||||
|
|
||||||
|
Validation: `bun run changelog:lint`, `bun run changelog:check --version 0.5.3`, `bun run typecheck`, `bun run test:fast`.
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
77
docs/plans/2026-03-09-unsigned-windows-release-builds.md
Normal file
77
docs/plans/2026-03-09-unsigned-windows-release-builds.md
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Unsigned Windows Release Builds Implementation Plan
|
||||||
|
|
||||||
|
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
||||||
|
|
||||||
|
**Goal:** Publish unsigned Windows release artifacts in GitHub Actions while adding an explicit local `build:win:unsigned` script.
|
||||||
|
|
||||||
|
**Architecture:** Keep Windows packaging on `electron-builder`, but stop the release workflow from routing artifacts through SignPath. The Windows release job will build unsigned artifacts and upload them directly under the existing `windows` artifact name so the downstream release job stays stable. Local developer behavior remains unchanged except for a new explicit unsigned build script.
|
||||||
|
|
||||||
|
**Tech Stack:** GitHub Actions, Bun, Electron Builder, Node test runner
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: Track the workflow contract change
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: `backlog/tasks/task-138 - Publish-unsigned-Windows-release-artifacts-and-add-local-unsigned-build-script.md`
|
||||||
|
- Create: `changes/unsigned-windows-release-builds.md`
|
||||||
|
|
||||||
|
**Step 1: Write the backlog task + changelog fragment**
|
||||||
|
|
||||||
|
Document the scope: unsigned Windows release CI, new local unsigned script, no SignPath dependency.
|
||||||
|
|
||||||
|
**Step 2: Review file formatting**
|
||||||
|
|
||||||
|
Run: `sed -n '1,220p' backlog/tasks/task-138\ -\ Publish-unsigned-Windows-release-artifacts-and-add-local-unsigned-build-script.md && sed -n '1,80p' changes/unsigned-windows-release-builds.md`
|
||||||
|
Expected: task metadata matches existing backlog files; changelog fragment matches `changes/README.md` format.
|
||||||
|
|
||||||
|
### Task 2: Write failing workflow regression tests
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `src/release-workflow.test.ts`
|
||||||
|
|
||||||
|
**Step 1: Write the failing test**
|
||||||
|
|
||||||
|
Replace SignPath-specific workflow assertions with assertions for:
|
||||||
|
- unsigned Windows artifacts built via `bun run build:win:unsigned`
|
||||||
|
- direct `windows` artifact upload from `release/*.exe` and `release/*.zip`
|
||||||
|
- no SignPath action references
|
||||||
|
- package scripts include `build:win:unsigned`
|
||||||
|
|
||||||
|
**Step 2: Run test to verify it fails**
|
||||||
|
|
||||||
|
Run: `bun test src/release-workflow.test.ts`
|
||||||
|
Expected: FAIL because the current workflow still validates SignPath secrets and submits signing requests.
|
||||||
|
|
||||||
|
### Task 3: Patch package scripts and release workflow
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `package.json`
|
||||||
|
- Modify: `.github/workflows/release.yml`
|
||||||
|
|
||||||
|
**Step 1: Write minimal implementation**
|
||||||
|
|
||||||
|
- add `build:win:unsigned` that clears Windows signing env and disables auto discovery before invoking `electron-builder --win nsis zip --publish never`
|
||||||
|
- change the Windows release job to remove SignPath secret validation/submission
|
||||||
|
- build Windows artifacts with `bun run build:win:unsigned`
|
||||||
|
- upload `release/*.exe` and `release/*.zip` directly as `windows`
|
||||||
|
|
||||||
|
**Step 2: Run tests to verify they pass**
|
||||||
|
|
||||||
|
Run: `bun test src/release-workflow.test.ts`
|
||||||
|
Expected: PASS
|
||||||
|
|
||||||
|
### Task 4: Run focused verification
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: none
|
||||||
|
|
||||||
|
**Step 1: Run focused checks**
|
||||||
|
|
||||||
|
Run: `bun test src/release-workflow.test.ts && bun run typecheck`
|
||||||
|
Expected: all green
|
||||||
|
|
||||||
|
**Step 2: Spot-check diff**
|
||||||
|
|
||||||
|
Run: `git --no-pager diff -- .github/workflows/release.yml package.json src/release-workflow.test.ts changes/unsigned-windows-release-builds.md backlog/tasks/task-138\ -\ Publish-unsigned-Windows-release-artifacts-and-add-local-unsigned-build-script.md docs/plans/2026-03-09-unsigned-windows-release-builds.md`
|
||||||
|
Expected: only scoped unsigned-Windows workflow/script/docs changes
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "subminer",
|
"name": "subminer",
|
||||||
"version": "0.5.1",
|
"version": "0.5.3",
|
||||||
"description": "All-in-one sentence mining overlay with AnkiConnect and dictionary integration",
|
"description": "All-in-one sentence mining overlay with AnkiConnect and dictionary integration",
|
||||||
"packageManager": "bun@1.3.5",
|
"packageManager": "bun@1.3.5",
|
||||||
"main": "dist/main-entry.js",
|
"main": "dist/main-entry.js",
|
||||||
@@ -60,7 +60,8 @@
|
|||||||
"build:mac": "bun run build && electron-builder --mac dmg zip --publish never",
|
"build:mac": "bun run build && electron-builder --mac dmg zip --publish never",
|
||||||
"build:mac:unsigned": "bun run build && env -u APPLE_ID -u APPLE_APP_SPECIFIC_PASSWORD -u APPLE_TEAM_ID -u CSC_LINK -u CSC_KEY_PASSWORD CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac dmg zip --publish never",
|
"build:mac:unsigned": "bun run build && env -u APPLE_ID -u APPLE_APP_SPECIFIC_PASSWORD -u APPLE_TEAM_ID -u CSC_LINK -u CSC_KEY_PASSWORD CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac dmg zip --publish never",
|
||||||
"build:mac:zip": "bun run build && electron-builder --mac zip --publish never",
|
"build:mac:zip": "bun run build && electron-builder --mac zip --publish never",
|
||||||
"build:win": "bun run build && electron-builder --win nsis zip --publish never"
|
"build:win": "bun run build && electron-builder --win nsis zip --publish never",
|
||||||
|
"build:win:unsigned": "bun run build && node scripts/build-win-unsigned.mjs"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"anki",
|
"anki",
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
## Highlights
|
## Highlights
|
||||||
### Changed
|
### Changed
|
||||||
- Launcher: Removed the YouTube subtitle generation mode switch so YouTube playback always preloads subtitles before mpv starts.
|
- Release: Publish unsigned Windows `.exe` and `.zip` artifacts directly from release CI instead of routing them through SignPath.
|
||||||
|
- Release: Added `bun run build:win:unsigned` for explicit local unsigned Windows packaging.
|
||||||
### Fixed
|
|
||||||
- Launcher: Hardened YouTube AI subtitle fixing so fenced SRT output and text-only one-cue-per-block responses can still be applied without losing original cue timing.
|
|
||||||
- Launcher: Skipped AniSkip lookup during URL playback and YouTube subtitle-preload playback, limiting AniSkip to local file targets where it can actually resolve anime metadata.
|
|
||||||
- Launcher: Keep the background SubMiner process running after a launcher-managed mpv session exits so the next mpv instance can reconnect without restarting the app.
|
|
||||||
- Launcher: Reuse prior tokenization readiness after the background app is already warm so reopening a video does not pause again waiting for duplicate warmup completion.
|
|
||||||
- Windows: Acquire the app single-instance lock earlier so Windows overlay/video launches reuse the running background SubMiner process instead of booting a second full app and repeating startup warmups.
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
|||||||
30
scripts/build-win-unsigned.mjs
Normal file
30
scripts/build-win-unsigned.mjs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { spawnSync } from 'node:child_process';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
|
const env = { ...process.env };
|
||||||
|
|
||||||
|
for (const name of [
|
||||||
|
'CSC_LINK',
|
||||||
|
'CSC_KEY_PASSWORD',
|
||||||
|
'WIN_CSC_LINK',
|
||||||
|
'WIN_CSC_KEY_PASSWORD',
|
||||||
|
'CSC_NAME',
|
||||||
|
'WIN_CSC_NAME',
|
||||||
|
]) {
|
||||||
|
delete env[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
env.CSC_IDENTITY_AUTO_DISCOVERY = 'false';
|
||||||
|
|
||||||
|
const electronBuilderCli = fileURLToPath(new URL('../node_modules/electron-builder/out/cli/cli.js', import.meta.url));
|
||||||
|
|
||||||
|
const result = spawnSync(process.execPath, [electronBuilderCli, '--win', 'nsis', 'zip', '--publish', 'never'], {
|
||||||
|
stdio: 'inherit',
|
||||||
|
env,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.error) {
|
||||||
|
throw result.error;
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit(result.status ?? 1);
|
||||||
@@ -38,13 +38,16 @@ test('release package scripts disable implicit electron-builder publishing', ()
|
|||||||
assert.match(packageJson.scripts['build:appimage'] ?? '', /--publish never/);
|
assert.match(packageJson.scripts['build:appimage'] ?? '', /--publish never/);
|
||||||
assert.match(packageJson.scripts['build:mac'] ?? '', /--publish never/);
|
assert.match(packageJson.scripts['build:mac'] ?? '', /--publish never/);
|
||||||
assert.match(packageJson.scripts['build:win'] ?? '', /--publish never/);
|
assert.match(packageJson.scripts['build:win'] ?? '', /--publish never/);
|
||||||
|
assert.match(packageJson.scripts['build:win:unsigned'] ?? '', /build-win-unsigned\.mjs/);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('windows release workflow retries SignPath submission and fails only after exhausting attempts', () => {
|
test('windows release workflow publishes unsigned artifacts directly without SignPath', () => {
|
||||||
assert.match(releaseWorkflow, /Submit Windows signing request \(attempt 1\)/);
|
assert.match(releaseWorkflow, /Build unsigned Windows artifacts/);
|
||||||
assert.match(releaseWorkflow, /Submit Windows signing request \(attempt 2\)/);
|
assert.match(releaseWorkflow, /run: bun run build:win:unsigned/);
|
||||||
assert.match(releaseWorkflow, /Submit Windows signing request \(attempt 3\)/);
|
assert.match(releaseWorkflow, /name: windows/);
|
||||||
assert.match(releaseWorkflow, /All SignPath signing attempts failed; rerun the workflow when SignPath is healthy\./);
|
assert.match(releaseWorkflow, /path: \|\n\s+release\/\*\.exe\n\s+release\/\*\.zip/);
|
||||||
|
assert.ok(!releaseWorkflow.includes('signpath/github-action-submit-signing-request'));
|
||||||
|
assert.ok(!releaseWorkflow.includes('SIGNPATH_'));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Makefile routes Windows install-plugin setup through bun and documents Windows builds', () => {
|
test('Makefile routes Windows install-plugin setup through bun and documents Windows builds', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user