19 Commits

Author SHA1 Message Date
81daf79492 chore: add changelog fragment for subtitle sidebar changes 2026-03-21 23:33:33 -07:00
5763650036 chore: regenerate release config example artifacts 2026-03-21 23:11:21 -07:00
5ea064a446 fix: align subtitle sidebar state and behavior updates 2026-03-21 22:24:42 -07:00
4c6e4b9f0b chore: prepare v0.8.0 release metadata and changelog 2026-03-21 22:24:39 -07:00
a9ad268393 fix(scripts): harden patch-modernz handling 2026-03-21 21:15:41 -07:00
87f7b87b5a fix(deps): refresh electron-builder lockfile 2026-03-21 21:08:02 -07:00
36e5a07b92 fix: add modernz patch helper 2026-03-21 21:07:18 -07:00
45d183d02d fix(subtitle-sidebar): address CodeRabbit follow-ups 2026-03-21 20:49:44 -07:00
a42fe599cb fix: pin electron-builder and adjust release files patterns 2026-03-21 20:47:30 -07:00
76b5ab68ba Add subtitle sidebar startup auto-open and resume jump
- Add `subtitleSidebar.autoOpen` with startup-only open behavior
- Jump to the first resolved active cue on initial resume position
- Clear parsed cues when subtitle prefetch init fails
2026-03-21 19:58:37 -07:00
0c3ec7a567 fix(subtitle-sidebar): address latest CodeRabbit review 2026-03-21 19:58:37 -07:00
01c171629a ci: resolve security audit vulnerabilities in electron-builder dependencies 2026-03-21 19:58:37 -07:00
09b112f25f ci: trigger rerun 2026-03-21 19:58:37 -07:00
3df5d4d6a2 fix(ci): export asCssColor and subtitle sidebar autoOpen typing 2026-03-21 19:58:37 -07:00
bbdd98cbff fix(renderer): sync embedded sidebar mouse passthrough 2026-03-21 19:34:00 -07:00
b049cf388d fix(subtitle-sidebar): address latest CodeRabbit review 2026-03-21 16:28:30 -07:00
de111dbf8d fix(subtitle-sidebar): address CodeRabbit review 2026-03-21 10:15:06 -07:00
ea86f4e504 feat(subtitle-sidebar): add sidebar runtime and modal plumbing 2026-03-20 23:00:26 -07:00
bb54898747 feat(subtitle-sidebar): add sidebar config surface 2026-03-20 23:00:16 -07:00
2 changed files with 1 additions and 60 deletions

View File

@@ -95,43 +95,6 @@ test('writeChangelogArtifacts ignores README, groups fragments by type, writes r
}
});
test('writeChangelogArtifacts skips changelog prepend when release section already exists', async () => {
const { writeChangelogArtifacts } = await loadModule();
const workspace = createWorkspace('write-artifacts-existing-version');
const projectRoot = path.join(workspace, 'SubMiner');
const existingChangelog = [
'# Changelog',
'',
'## v0.4.1 (2026-03-07)',
'### Added',
'- Existing release bullet.',
'',
].join('\n');
fs.mkdirSync(projectRoot, { recursive: true });
fs.mkdirSync(path.join(projectRoot, 'changes'), { recursive: true });
fs.writeFileSync(path.join(projectRoot, 'CHANGELOG.md'), existingChangelog, 'utf8');
fs.writeFileSync(path.join(projectRoot, 'changes', '001.md'), ['type: added', 'area: overlay', '', '- Stale release fragment.'].join('\n'), 'utf8');
try {
const result = writeChangelogArtifacts({
cwd: projectRoot,
version: '0.4.1',
date: '2026-03-08',
});
assert.deepEqual(result.deletedFragmentPaths, [path.join(projectRoot, 'changes', '001.md')]);
assert.equal(fs.existsSync(path.join(projectRoot, 'changes', '001.md')), false);
const changelog = fs.readFileSync(path.join(projectRoot, 'CHANGELOG.md'), 'utf8');
assert.equal(changelog, existingChangelog);
const releaseNotes = fs.readFileSync(path.join(projectRoot, 'release', 'release-notes.md'), 'utf8');
assert.match(releaseNotes, /## Highlights\n### Added\n- Existing release bullet\./);
} finally {
fs.rmSync(workspace, { recursive: true, force: true });
}
});
test('verifyChangelogReadyForRelease ignores README but rejects pending fragments and missing version sections', async () => {
const { verifyChangelogReadyForRelease } = await loadModule();
const workspace = createWorkspace('verify-release');

View File

@@ -341,34 +341,12 @@ export function writeChangelogArtifacts(options?: ChangelogOptions): {
const version = resolveVersion(options ?? {});
const date = resolveDate(options?.date);
const fragments = readChangeFragments(cwd, options?.deps);
const releaseSection = buildReleaseSection(version, date, fragments);
const existingChangelogPath = path.join(cwd, 'CHANGELOG.md');
const existingChangelog = existsSync(existingChangelogPath)
? readFileSync(existingChangelogPath, 'utf8')
: '';
const outputPaths = resolveChangelogOutputPaths({ cwd });
const existingReleaseSection = extractReleaseSectionBody(existingChangelog, version);
if (existingReleaseSection !== null) {
log(`Existing section found for v${version}; skipping changelog prepend.`);
for (const fragment of fragments) {
rmSync(fragment.path);
log(`Removed ${fragment.path}`);
}
const releaseNotesPath = writeReleaseNotesFile(
cwd,
existingReleaseSection,
options?.deps,
);
log(`Generated ${releaseNotesPath}`);
return {
deletedFragmentPaths: fragments.map((fragment) => fragment.path),
outputPaths,
releaseNotesPath,
};
}
const releaseSection = buildReleaseSection(version, date, fragments);
const nextChangelog = prependReleaseSection(existingChangelog, releaseSection, version);
for (const outputPath of outputPaths) {