Compare commits

..

37 Commits

Author SHA1 Message Date
382cd1b3d7 update backlog and bump package version 2026-03-07 18:29:51 -08:00
2629274841 Harden renderer CSS selector parsing in stylesheet tests
- Split selector lists on top-level commas to handle `:is(...)` safely
- Normalize selector whitespace before matching extracted CSS rule blocks
- Replace brittle full-file regex checks with targeted hover/selection block assertions
- Add TASK-114 backlog record for CI fix on PR #15
2026-03-07 16:38:10 -08:00
6bd886be47 Fix subtitle-cycle OSD labels and harden quality gates
- Resolve J/Shift+J subtitle-cycle OSD text via track-list labels and property expansion
- Add mpv proxy OSD runtime + regression coverage across IPC/main/runtime paths
- Scope `make pretty` to maintained source files and add scoped Prettier script
- Align release workflow with cache/install order and explicit TypeScript check
- Clean up duplicate submodule entry and remove checked-in docs/plans artifacts
2026-03-07 16:27:40 -08:00
6ae1afd12e build: switch Yomitan to submodule-built artifact 2026-03-07 02:10:53 -08:00
8c3d810a54 fix(test): seed launcher smoke setup state 2026-03-07 01:50:31 -08:00
5d96f9d535 Add annotation websocket and texthooker startup config
- Add `texthooker.launchAtStartup` (default `true`) and wire startup behavior
- Add dedicated `annotationWebsocket` config/service path (default port `6678`) for texthooker annotations
- Regenerate config example/tests and update Yomitan patching/vendor assets
2026-03-07 01:41:08 -08:00
1d76e05cd3 fix(subtitle): tighten frequency token filtering 2026-03-07 01:28:37 -08:00
3dff6c2515 feat: add first-run setup flow 2026-03-07 00:57:09 -08:00
755c1175b0 fix(dictionary): add configurable collapsible section defaults 2026-03-06 23:46:24 -08:00
78cd99a2d0 fix: index AniList character aliases in dictionary 2026-03-06 22:02:04 -08:00
1fd3f0575b fix: prioritize SubMiner definitions in Yomitan 2026-03-06 22:01:20 -08:00
ca0eec568c fix: quiet default appimage startup 2026-03-06 21:17:47 -08:00
94abd0f372 Deduplicate voice actor image downloads per AniList person ID
- Avoid repeated downloads when multiple characters share the same voice actor
- Add coverage for shared voice actor image download behavior
2026-03-06 17:21:19 -08:00
4d60f64bea Gate subtitle name highlighting on character dictionary setting
- Disable `getNameMatchEnabled` when `anilist.characterDictionary.enabled` is false
- Wire character-dictionary enablement into main subtitle tokenization deps
- Add runtime deps test coverage and record task/plan docs
2026-03-06 17:13:56 -08:00
dbd6803623 chore: update acknowledgments and fix config quote style 2026-03-06 16:42:42 -08:00
5ff4cc21bd feat(dictionary): structured glossary with voice actors and collapsible sections
- Add voice actor data (Japanese VA) from AniList GraphQL query
- Redesign glossary entries as structured-content with role badges,
  collapsible Description/Character Information/Voiced-by sections
- Parse __Key:__ fields from AniList descriptions into structured info
- Download and embed voice actor images alongside character images
- Bump format version to 12
2026-03-06 16:41:58 -08:00
82bec02a36 feat(subtitles): highlight character-name tokens 2026-03-06 16:38:19 -08:00
c548044c61 docs(backlog): close TASK-87.4 2026-03-06 11:05:47 -08:00
39976c03f9 refactor: remove dead registry and pipeline modules 2026-03-06 11:04:17 -08:00
e659b5d8f4 refactor(runtime): remove dead symbols from composition roots 2026-03-06 10:56:20 -08:00
85bd6c6ec2 refactor: extract anki integration runtime 2026-03-06 09:30:15 -08:00
6fe6976dc9 test: relax launcher smoke timeout budget 2026-03-06 07:52:26 -08:00
e6150e9513 fix: update default frequency band colors 2026-03-06 07:51:58 -08:00
40521e769d update backlog 2026-03-06 01:35:30 -08:00
2f31227471 fix: preserve user dictionary ordering 2026-03-06 01:34:44 -08:00
69fd69c0b2 fix: log anime dictionary progress 2026-03-06 01:34:42 -08:00
746696b1a4 fix: improve yomitan subtitle name lookup 2026-03-06 01:28:58 -08:00
ebe9515486 build: expand typecheck coverage beyond src 2026-03-06 01:03:51 -08:00
8c2c950564 feat: merge AniList character dictionaries by recent usage 2026-03-06 01:01:31 -08:00
e2b51c6306 test: align standard commands with maintained test surface 2026-03-06 00:58:32 -08:00
f160ca6af8 test: add sqlite immersion verification lane 2026-03-06 00:25:24 -08:00
289486a5b1 test: add real subtitle verification lane 2026-03-06 00:08:54 -08:00
ac4fd60098 fix: pace AniList character dictionary requests 2026-03-05 23:57:38 -08:00
72b18110b5 fix: second instance start handling 2026-03-05 23:32:22 -08:00
c791887d5c fix(launcher): base64 encode aniskip payload 2026-03-05 23:24:09 -08:00
8570b262e4 fix: preserve pause state on next subtitle jump 2026-03-05 23:23:43 -08:00
33ded3c1bf feat: add AniList character dictionary sync 2026-03-05 23:23:43 -08:00
4 changed files with 6 additions and 80 deletions

View File

@@ -337,14 +337,15 @@ jobs:
EOF EOF
if gh release view "${{ steps.version.outputs.VERSION }}" >/dev/null 2>&1; then if gh release view "${{ steps.version.outputs.VERSION }}" >/dev/null 2>&1; then
# Do not pass the prerelease flag here; gh defaults to a normal release.
gh release edit "${{ steps.version.outputs.VERSION }}" \ gh release edit "${{ steps.version.outputs.VERSION }}" \
--title "${{ steps.version.outputs.VERSION }}" \ --title "${{ steps.version.outputs.VERSION }}" \
--notes-file release-body.md --notes-file release-body.md \
--prerelease false
else else
gh release create "${{ steps.version.outputs.VERSION }}" \ gh release create "${{ steps.version.outputs.VERSION }}" \
--title "${{ steps.version.outputs.VERSION }}" \ --title "${{ steps.version.outputs.VERSION }}" \
--notes-file release-body.md --notes-file release-body.md \
--prerelease false
fi fi
shopt -s nullglob shopt -s nullglob

View File

@@ -1,64 +0,0 @@
---
id: TASK-118
title: Fix GitHub release workflow publish step failure
status: Done
assignee:
- Codex
created_date: '2026-03-08 03:34'
updated_date: '2026-03-08 03:38'
labels:
- ci
- release
- github-actions
dependencies: []
references:
- /Users/sudacode/projects/japanese/SubMiner/.github/workflows/release.yml
- 'https://github.com/ksyasuda/SubMiner/actions/runs/22812335927'
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
The GitHub Actions Release workflow fails during the Publish Release step for tag releases because the gh CLI invocation passes invalid arguments when creating or editing the GitHub release. Restore successful release publication for tagged builds without changing unrelated release packaging behavior.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 Tagged Release workflow completes the Publish Release step without gh CLI argument errors.
- [x] #2 Release workflow still creates or updates the GitHub release as a non-prerelease for normal version tags.
- [x] #3 A regression check covers the publish command shape or workflow behavior that caused this failure.
- [x] #4 Any release workflow behavior change is documented in repository docs or workflow comments if needed.
<!-- AC:END -->
## Implementation Plan
<!-- SECTION:PLAN:BEGIN -->
1. Add a targeted regression test for .github/workflows/release.yml that fails if the publish step passes an argument to the gh --prerelease boolean flag or otherwise omits explicit non-prerelease behavior.
2. Run the targeted test to confirm the current workflow fails for the expected reason.
3. Patch the Publish Release step in .github/workflows/release.yml to remove the invalid gh CLI usage while preserving non-prerelease release creation/update behavior.
4. Re-run the targeted regression test and any relevant lightweight verification, then record results in task notes.
<!-- SECTION:PLAN:END -->
## Implementation Notes
<!-- SECTION:NOTES:BEGIN -->
Identified root cause from GitHub Actions run 22812335927: Publish Release failed with `accepts 1 arg(s), received 2` because the workflow passed a value to gh's boolean prerelease flag.
Added a workflow comment clarifying that omitting the prerelease flag keeps normal releases as non-prerelease releases.
Added src/release-workflow.test.ts and wired it into `bun run test:fast` so CI catches the invalid workflow shape before the next tag.
Verification: `bun test src/release-workflow.test.ts`, `bun run typecheck`, and `bun run test:fast` all passed locally.
Code-review pass found no issues; remaining caveat is that prerelease tag semantics are still not modeled for tags like `v1.0.0-beta.1`, which is outside this fix scope.
<!-- SECTION:NOTES:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Fixed the GitHub Actions release publish step so tagged releases no longer fail on invalid gh CLI usage. The workflow now omits the prerelease flag when creating or editing normal releases, which preserves existing non-prerelease behavior and avoids the `accepts 1 arg(s), received 2` failure seen in run 22812335927.
Added a small regression test that reads `.github/workflows/release.yml` and asserts the publish step does not set the prerelease flag, then included that test in `bun run test:fast` so the main verification lane catches this class of workflow regression before the next release.
Validation run locally: `bun test src/release-workflow.test.ts`, `bun run typecheck`, and `bun run test:fast`. Residual risk: prerelease-tag semantics remain unchanged for tags such as `v1.0.0-beta.1`; this fix is intentionally scoped to restoring normal tagged release publication.
<!-- SECTION:FINAL_SUMMARY:END -->

View File

@@ -1,6 +1,6 @@
{ {
"name": "subminer", "name": "subminer",
"version": "0.4.1", "version": "0.4.0",
"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",
@@ -43,7 +43,7 @@
"test:launcher": "bun run test:launcher:src", "test:launcher": "bun run test:launcher:src",
"test:core": "bun run test:core:src", "test:core": "bun run test:core:src",
"test:subtitle": "bun run test:subtitle:src", "test:subtitle": "bun run test:subtitle:src",
"test:fast": "bun run test:config:src && bun run test:core:src && bun test src/main-entry-runtime.test.ts src/anki-integration/anki-connect-proxy.test.ts src/release-workflow.test.ts && bun run tsc && node --experimental-sqlite --test dist/main/runtime/registry.test.js", "test:fast": "bun run test:config:src && bun run test:core:src && bun test src/main-entry-runtime.test.ts src/anki-integration/anki-connect-proxy.test.ts && bun run tsc && node --experimental-sqlite --test dist/main/runtime/registry.test.js",
"generate:config-example": "bun run build && bun dist/generate-config-example.js", "generate:config-example": "bun run build && bun dist/generate-config-example.js",
"start": "bun run build && electron . --start", "start": "bun run build && electron . --start",
"dev": "bun run build && electron . --start --dev", "dev": "bun run build && electron . --start --dev",

View File

@@ -1,11 +0,0 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
const releaseWorkflowPath = resolve(__dirname, '../.github/workflows/release.yml');
const releaseWorkflow = readFileSync(releaseWorkflowPath, 'utf8');
test('publish release leaves prerelease unset so gh creates a normal release', () => {
assert.ok(!releaseWorkflow.includes('--prerelease'));
});