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
6 changes: 3 additions & 3 deletions packages/core/src/changelogRefs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* issue/PR ref (with a hovercard) and treats a bare `@scope/pkg` / `@user` as a mention (a stray
* link that can ping/subscribe a real org or team on every release PR). Both render surfaces — the
* notes Markdown (`CHANGELOG.md`, GitHub release body) and the standing-PR body — share these two
* pure helpers so the treatment stays identical (#499).
* pure helpers so the treatment stays identical.
*/

/** How bare `#NNN` issue/PR refs in a changelog are rendered. */
Expand Down Expand Up @@ -125,7 +125,7 @@ const CODE_SPAN_OR_DESC_REF = /`[^`]*`|( ?)(?:\(#(\d+)\)|(?<![\\[/\w])#(\d+)\b)/

/**
* Neutralise bare `#N` issue/PR refs left inside an entry *description* — they come from the squash
* commit subject and GitHub otherwise auto-links them into verbose hovercards (#507). A ref that also
* commit subject and GitHub otherwise auto-links them into verbose hovercards. A ref that also
* appears in the appended `(PR … · closes …)` label (`appendedRefs`) is REMOVED as a duplicate; any
* other bare ref is rendered per `mode`: `escape` → `\#N`, `strip` → removed, `link` → a canonical
* `[#N](…/issues/N)` link (falls back to `escape` for a non-GitHub repo). Complements
Expand Down Expand Up @@ -154,6 +154,6 @@ export function neutralizeDescriptionRefs(
},
);
// `( ?)` eats the space *before* a ref, so a ref removed from the very start of the description
// (nothing before it to consume) leaves the following space behind — trim boundary residue (#507).
// (nothing before it to consume) leaves the following space behind — trim boundary residue.
return out.trim();
}
2 changes: 1 addition & 1 deletion packages/core/src/selectionRegion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export function rkSelMarker(packageName: string): string {
}

/**
* Identity marker for a stable row's channel toggle — "ship this package as a prerelease" (#521). A
* Identity marker for a stable row's channel toggle — "ship this package as a prerelease". A
* nested, interactive task item under an rk-sel row; its `[x]`/`[ ]` glyph carries the intent while
* this marker carries the package name. The symmetric twin of {@link rkGradMarker}. Machine-read,
* never the row's prose.
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export interface VersionChangelogEntry {
* version-groups engine for a lockstep carry — a group member bumped only to stay in sync, with
* no commits of its own. It is not derived from a real commit. The preview formatter treats a
* changelog whose entries are *all* synthetic as "no real changes" and collapses the package into
* the "Also bumped" list instead of rendering a full block of placeholder noise (#468).
* the "Also bumped" list instead of rendering a full block of placeholder noise.
*
* Only the groups engine sets it, and only on a clean empty extraction: an independently-released
* package (single/async strategy) or an extraction-error fallback keeps its visible block, since
Expand Down Expand Up @@ -61,7 +61,7 @@ export interface VersionPackageChangelog {
export type VersionAction = 'first-release' | 'graduated' | 'bumped';

/**
* The release channel a version sits on (#485). Derived per-package and purely from the resolved
* The release channel a version sits on. Derived per-package and purely from the resolved
* version: `'prerelease'` when the version carries a semver prerelease segment (`…-<preid>.N`), else
* `'stable'`. A standing PR with permanently-mixed maturity carries both at once — some `'stable'`
* packages, some `'prerelease'` — each advancing along its own line. #486 (per-package graduation)
Expand Down Expand Up @@ -129,7 +129,7 @@ export interface VersionPackageUpdate {
* Absent for a first release and whenever the baseline was unreachable / fell back to all-history
* (#339), so consumers derive the bump magnitude only when it is present. Optional for backwards
* compatibility: standing-PR manifests written before this field existed omit it (old PRs still
* open), so every consumer must tolerate its absence (render a dash / skip the delta). #520.
* open), so every consumer must tolerate its absence (render a dash / skip the delta).
*/
previousVersion?: string;
filePath: string;
Expand Down
2 changes: 1 addition & 1 deletion packages/core/test/unit/types.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest';
import { deriveReleaseChannel } from '../../src/types.js';

describe('deriveReleaseChannel (#485)', () => {
describe('deriveReleaseChannel', () => {
it('should classify clean semver as the stable channel', () => {
expect(deriveReleaseChannel('1.0.0')).toBe('stable');
expect(deriveReleaseChannel('10.2.0')).toBe('stable');
Expand Down
2 changes: 1 addition & 1 deletion packages/notes/src/core/pipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function generateCompareUrl(repoUrl: string, from: string, to: string, packageNa
// Sanitized package-specific tag: "<de-scoped-name>@[v]<version>" (e.g. "scope-pkg@v1.2.3").
// formatTag always strips the "@scope/", so the raw package name never appears literally and
// the isPackageSpecific check above can't match it. Keep the "<name>@" prefix and re-attach the
// new version, preserving a "v" only if the original tag had one (#338).
// new version, preserving a "v" only if the original tag had one.
fromVersion = from;
toVersion = `${from.slice(0, atPos + 1)}${from[atPos + 1] === 'v' ? 'v' : ''}${toClean}`;
} else if (dashVPos > 0 && from.charCodeAt(dashVPos + 2) >= 48 && from.charCodeAt(dashVPos + 2) <= 57) {
Expand Down
2 changes: 1 addition & 1 deletion packages/notes/src/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ export interface ChangelogConfig {
mode?: LocationMode;
file?: string;
templates?: TemplateConfig;
/** How bare `#NNN` issue/PR refs render in the changelog (#499). Default `'link'` when unset. */
/** How bare `#NNN` issue/PR refs render in the changelog. Default `'link'` when unset. */
refs?: ChangelogRefsMode;
}

Expand Down
2 changes: 1 addition & 1 deletion packages/notes/src/output/markdown.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ function formatEntry(entry: ChangelogEntry, opts?: EntryRefOptions): string {
// org/team on a release PR) — always neutralise it, regardless of the refs mode. The scope and
// lead-in are interpolated as bold prose too (a scoped package name like `@wdio/native-cdp-bridge`
// would mention `@wdio`), so escape all three, not just the description. Bare `#N` refs carried over
// from the commit subject are also neutralised / de-duped against the appended label (#507).
// from the commit subject are also neutralised / de-duped against the appended label.
const refsMode = opts?.refs ?? 'link';
const appendedRefs = [...(entry.issueIds ?? []), entry.prNumber];
const description = escapeChangelogMentions(
Expand Down
2 changes: 1 addition & 1 deletion packages/notes/test/integration/pipeline-config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ describe('Pipeline: mode both does not double-write root', () => {
);
});

it('should forward the configured refs mode to per-package monorepo changelogs (#503)', async () => {
it('should forward the configured refs mode to per-package monorepo changelogs', async () => {
const { writeMonorepoChangelogs } = await import('../../src/monorepo/aggregator.js');
const { runPipeline } = await import('../../src/core/pipeline.js');

Expand Down
6 changes: 3 additions & 3 deletions packages/notes/test/integration/pipeline.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ describe('Pipeline: version output → markdown', () => {
expect(markdown).toContain('### Added');
expect(markdown).toContain('- **api**: Add streaming support');
expect(markdown).toContain('### Fixed');
// Bare `#88` is rendered as a canonical Markdown link by default (link mode, #499).
// Bare `#88` is rendered as a canonical Markdown link by default (link mode).
expect(markdown).toContain('- Null pointer in parser ([#88](https://github.com/acme/my-lib/issues/88))');
expect(markdown).toContain('### Changed');
expect(markdown).toContain('- Simplify config loading');
Expand Down Expand Up @@ -165,7 +165,7 @@ describe('compareUrl: platform detection', () => {
);
});

it('should generate compare URL for sanitized "@v" package-specific tags (#338)', () => {
it('should generate compare URL for sanitized "@v" package-specific tags', () => {
// formatTag strips "@scope/" -> "scope-name", so a `${packageName}@v${version}` template
// yields "zubridge-electron@v3.0.0". The raw "@zubridge/electron" never appears in the tag,
// so the `to` ref must be derived from the tag's own prefix, not the package name.
Expand All @@ -183,7 +183,7 @@ describe('compareUrl: platform detection', () => {
);
});

it('should generate compare URL for sanitized "@v" tags across a prerelease escalation (#338)', () => {
it('should generate compare URL for sanitized "@v" tags across a prerelease escalation', () => {
const ctx = createTemplateContext({
packageName: '@zubridge/tauri',
version: '2.0.0-next.0',
Expand Down
2 changes: 1 addition & 1 deletion packages/notes/test/unit/output/markdown.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,7 @@ describe('formatVersion: non-LLM path', () => {
});

// ---------------------------------------------------------------------------
// formatVersion — issue refs + mention escaping (#499)
// formatVersion — issue refs + mention escaping
// ---------------------------------------------------------------------------

describe('formatVersion: issue refs', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/publish/src/stages/git-push.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ export async function pushPackageTag(tag: string, ctx: PipelineContext, setup?:

// Wrap raw exec failures as GIT_PUSH_ERROR so the failure report labels the stage `git-push`
// rather than `unknown` — mirrors runGitPushStage. Without this, a branch push rejected by a
// branch ruleset surfaced as "Stage unknown" (#429).
// branch ruleset surfaced as "Stage unknown".
try {
// Push the specific tag ref (carries the underlying commit with it)
await runGit(dryRun, `git push ${remote} refs/tags/${tag}`, () =>
Expand Down
2 changes: 1 addition & 1 deletion packages/publish/test/unit/stages/git-push.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ describe('pushPackageTag', () => {
expect(ctx.output.git.pushed).toBe(true);
});

it('should wrap a branch-push failure as GIT_PUSH_ERROR, not unknown (#429)', async () => {
it('should wrap a branch-push failure as GIT_PUSH_ERROR, not unknown', async () => {
// The branch push is rejected by a branch ruleset — a raw seam failure.
vi.spyOn(fakeGit, 'push').mockImplementation(async (opts) => {
if (opts.ref === 'main') {
Expand Down
2 changes: 1 addition & 1 deletion packages/publish/test/unit/utils/semver.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe('semver utils', () => {
expect(getDistTag('1.0.0', 'stable')).toBe('stable');
});

it('should resolve the dist-tag per package in a mixed (stable + prerelease) release (#485)', () => {
it('should resolve the dist-tag per package in a mixed (stable + prerelease) release', () => {
// A standing PR with permanently-mixed maturity publishes each package on its own channel.
// getDistTag is per-version, so the same run yields `latest` for the stable packages and the
// prerelease identifier for the `-next` ones with no extra wiring.
Expand Down
2 changes: 1 addition & 1 deletion packages/release/src/release.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ export async function runRelease(inputOptions: ReleaseOptions): Promise<ReleaseO
success('Release notes generated');
}

// Human-edited notes win per package (manual-mode draft dispatch, #319). Merged here so the
// Human-edited notes win per package (manual-mode draft dispatch). Merged here so the
// edits flow into both the publish step's release-body map and the returned releaseNotes.
if (options.editedNotes && Object.keys(options.editedNotes).length > 0) {
releaseNotes = mergeNotesRegions(releaseNotes ?? {}, options.editedNotes);
Expand Down
6 changes: 3 additions & 3 deletions packages/release/test/unit/changelog-region.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ describe('changelog-region', () => {
expect(footer).toContain('Show all changes (2 changes, de-duplicated)');
});

it('should de-dupe a bare #N in the description that also appears in the appended label (#507)', () => {
it('should de-dupe a bare #N in the description that also appears in the appended label', () => {
const footer = renderCombinedFooter(
output({
changelogs: [
Expand Down Expand Up @@ -165,7 +165,7 @@ describe('changelog-region', () => {
});
});

describe('issue refs + mention escaping (#499)', () => {
describe('issue refs + mention escaping', () => {
const repo = 'https://github.com/octocat/hello';

function output(over: Partial<VersionOutput>): VersionOutput {
Expand Down Expand Up @@ -335,7 +335,7 @@ describe('changelog-region', () => {
});
});

describe('scope demotion (#522)', () => {
describe('scope demotion', () => {
function output(over: Partial<VersionOutput>): VersionOutput {
return { dryRun: false, updates: [], changelogs: [], tags: [], ...over };
}
Expand Down
6 changes: 3 additions & 3 deletions packages/release/test/unit/label-definitions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,20 @@ describe('deriveLabelDefinitions', () => {
expect(releaseCount).toBe(1);
});

it('should seed a graduate:<package> label for each graduatable package (#486)', () => {
it('should seed a graduate:<package> label for each graduatable package', () => {
const defs = deriveLabelDefinitions(ciConfig(), ['@scope/a', '@scope/b']);
expect(names(defs)).toContain('graduate:@scope/a');
expect(names(defs)).toContain('graduate:@scope/b');
// The fixed whole-batch graduate label is still present and distinct.
expect(names(defs)).toContain('release:graduate');
});

it('should emit no per-package graduate labels when no graduatable packages are passed (#486)', () => {
it('should emit no per-package graduate labels when no graduatable packages are passed', () => {
const defs = deriveLabelDefinitions(ciConfig());
expect(names(defs).some((n) => n.startsWith('graduate:'))).toBe(false);
});

it('should honour a renamed graduatePackagePrefix when seeding per-package graduate labels (#486)', () => {
it('should honour a renamed graduatePackagePrefix when seeding per-package graduate labels', () => {
const config = ciConfig({
labels: { ...DEFAULT_LABELS_CONFIG, graduatePackagePrefix: 'promote/' },
} as Partial<CIConfig>);
Expand Down
2 changes: 1 addition & 1 deletion packages/release/test/unit/label-utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('composeBumpFromLabels', () => {
});
});

describe('per-package graduate labels (#486)', () => {
describe('per-package graduate labels', () => {
it('should build a graduate:<package> label from a package name', () => {
expect(graduatePackageLabel('@scope/pkg')).toBe('graduate:@scope/pkg');
});
Expand Down
6 changes: 3 additions & 3 deletions packages/release/test/unit/preview-format.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ describe('formatPreviewComment', () => {
expect(result).toContain('- Migrate to Vitest');
});

it('should render bare #NNN refs per the refs mode (#504)', () => {
it('should render bare #NNN refs per the refs mode', () => {
expect(formatPreviewComment(releaseOutput, { refs: 'escape' })).toContain(
'- Fix prerelease sorting (`semver`) (\\#42)',
);
Expand Down Expand Up @@ -258,7 +258,7 @@ describe('formatPreviewComment', () => {
expect(result).toContain('> - New dry-run flag (`cli`)');
});

it('should always neutralise @-mentions in preview descriptions (#504)', () => {
it('should always neutralise @-mentions in preview descriptions', () => {
const withMention = structuredClone(releaseOutput);
const firstChangelog = withMention.versionOutput.changelogs[0];
if (firstChangelog) {
Expand Down Expand Up @@ -974,7 +974,7 @@ describe('formatPreviewComment', () => {

// --- Synthetic version-bump entries (#468) ---

describe('synthetic version-bump entries (#468)', () => {
describe('synthetic version-bump entries', () => {
// A sync/lockstep carry: a bumped package with no commits of its own gets a fabricated
// `Update version to X` placeholder from the version engine. The preview must collapse these
// into the "Also bumped" list, not render full changelog blocks of placeholder noise.
Expand Down
2 changes: 1 addition & 1 deletion packages/release/test/unit/preview.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ describe('runPreview', () => {
});
});

describe('standing release PR skip (#424)', () => {
describe('standing release PR skip', () => {
afterEach(() => {
delete process.env.GITHUB_EVENT_PATH;
// clearAllMocks() (in beforeEach) clears calls but not return-value impls, so reset the fs
Expand Down
4 changes: 2 additions & 2 deletions packages/release/test/unit/release.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ describe('runRelease', () => {
});
});

describe('feeder-preview refresh (#459)', () => {
describe('feeder-preview refresh', () => {
it('should refresh feeder previews in-process after a successful release', async () => {
await runRelease(defaultOptions);
expect(mockRefreshFeederPreviews).toHaveBeenCalledWith(expect.objectContaining({ projectDir: '/test/project' }));
Expand All @@ -999,7 +999,7 @@ describe('runRelease', () => {
});
});

describe('editedNotes (manual-mode draft dispatch, #319)', () => {
describe('editedNotes (manual-mode draft dispatch)', () => {
it('should merge editedNotes over generated notes before publish (edited wins per package)', async () => {
await runRelease({ ...defaultOptions, editedNotes: { 'test-pkg': '- edited by human' } });

Expand Down
10 changes: 5 additions & 5 deletions packages/release/test/unit/selection-region.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ describe('selection-region', () => {

// --- Hierarchical / release-unit selection (#464) ---

describe('hierarchical selection (#464)', () => {
describe('hierarchical selection', () => {
const tauriGroups = { tauri: { sync: 'linked' as const, packages: ['@wdio/tauri-*', 'tauri-plugin-*'] } };
const tauriAll = ['@wdio/tauri-service', '@wdio/tauri-plugin', 'tauri-plugin-wdio-webdriver'];
const tauriUpdates: Update[] = [
Expand Down Expand Up @@ -330,7 +330,7 @@ describe('selection-region', () => {
expect(region).not.toContain('rk-sel:@wdio/tauri-plugin');
});

it('should label independent-group members "bundled" rather than "coupled" (#509)', () => {
it('should label independent-group members "bundled" rather than "coupled"', () => {
// independent members version on their own commit-driven lines but ship atomically with the
// unit — "coupled" implies a shared version they don't have; "bundled" conveys atomic shipping.
const independent = { tauri: { sync: 'independent' as const, packages: ['@wdio/tauri-*', 'tauri-plugin-*'] } };
Expand All @@ -341,7 +341,7 @@ describe('selection-region', () => {
expect(region).not.toContain('· coupled');
});

it('should keep an independent primary’s prerequisite as "coupled", not "bundled" (#509)', () => {
it('should keep an independent primary’s prerequisite as "coupled", not "bundled"', () => {
// A prerequisite ships with the unit but isn't a group member — it has no version-bundle with
// the independent group, so it keeps `coupled` even while the true group member shows `bundled`.
const independent = { tauri: { sync: 'independent' as const, packages: ['@wdio/tauri-*', 'tauri-plugin-*'] } };
Expand Down Expand Up @@ -432,7 +432,7 @@ describe('selection-region', () => {

// --- Channel-grouped sections (#487) ---

describe('channel-grouped sections (#487)', () => {
describe('channel-grouped sections', () => {
const STABLE = '#### Stable — advancing on `latest`';
const PRERELEASE = '#### Prereleases — advancing on their pre-release dist-tag';

Expand Down Expand Up @@ -569,7 +569,7 @@ describe('selection-region', () => {
});
});

describe('channel toggles (#521)', () => {
describe('channel toggles', () => {
const channel = (over: Partial<ChannelToggleConfig> = {}): ChannelToggleConfig => ({
prereleased: new Set(),
graduated: new Set(),
Expand Down
Loading
Loading