Rust based release manager for JS/TS monorepos, heavily inspired by Vite+ ❤️
publish changelog rust release bun pnpm changeset version bump node
0

Configure Feed

Select the types of activity you want to include in your feed.

Prefix changelog versions with v and add solo mode

Change generate_changelog_section to emit a 'v' before version numbers.

Treat solo workspaces specially in apply_release_plan: for
single-package
repos generate a per-package changelog section (version H2, no package
prefix) instead of aggregating into a dated global section.

Add create_solo_workspace helper and tests for solo changelog
formatting;
update megatest expectations accordingly.

authored by

bdbch and committed by
Tangled
(Jun 2, 2026, 4:16 PM +0300) 6421629c 56df9b62

+206 -78
+5
.oxrls/770e-faint-lane.md
··· 1 + --- 2 + '@bdbchgg/oxrls': 'patch' 3 + --- 4 + 5 + Fix a bug where the changelog format for solorepo workspaces would not use the normal mono-repo format
-1
packages/oxrls/index.d.ts
··· 1 1 /* auto-generated by NAPI-RS */ 2 2 /* eslint-disable */ 3 3 export declare function runCli(args: Array<string>): void 4 - export declare function plus100(input: number): number
+74 -56
packages/oxrls/index.js
··· 3 3 // @ts-nocheck 4 4 /* auto-generated by NAPI-RS */ 5 5 6 - const { createRequire } = require('node:module') 7 - require = createRequire(__filename) 8 - 9 6 const { readFileSync } = require('node:fs') 10 7 let nativeBinding = null 11 8 const loadErrors = [] ··· 80 77 try { 81 78 const binding = require('@bdbchgg/oxrls-android-arm64') 82 79 const bindingPackageVersion = require('@bdbchgg/oxrls-android-arm64/package.json').version 83 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 84 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 80 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 81 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 85 82 } 86 83 return binding 87 84 } catch (e) { ··· 96 93 try { 97 94 const binding = require('@bdbchgg/oxrls-android-arm-eabi') 98 95 const bindingPackageVersion = require('@bdbchgg/oxrls-android-arm-eabi/package.json').version 99 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 100 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 96 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 97 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 101 98 } 102 99 return binding 103 100 } catch (e) { ··· 108 105 } 109 106 } else if (process.platform === 'win32') { 110 107 if (process.arch === 'x64') { 108 + if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') { 109 + try { 110 + return require('./oxrls-native.win32-x64-gnu.node') 111 + } catch (e) { 112 + loadErrors.push(e) 113 + } 111 114 try { 115 + const binding = require('@bdbchgg/oxrls-win32-x64-gnu') 116 + const bindingPackageVersion = require('@bdbchgg/oxrls-win32-x64-gnu/package.json').version 117 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 118 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 119 + } 120 + return binding 121 + } catch (e) { 122 + loadErrors.push(e) 123 + } 124 + } else { 125 + try { 112 126 return require('./oxrls-native.win32-x64-msvc.node') 113 127 } catch (e) { 114 128 loadErrors.push(e) ··· 116 130 try { 117 131 const binding = require('@bdbchgg/oxrls-win32-x64-msvc') 118 132 const bindingPackageVersion = require('@bdbchgg/oxrls-win32-x64-msvc/package.json').version 119 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 120 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 133 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 134 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 121 135 } 122 136 return binding 123 137 } catch (e) { 124 138 loadErrors.push(e) 139 + } 125 140 } 126 141 } else if (process.arch === 'ia32') { 127 142 try { ··· 132 147 try { 133 148 const binding = require('@bdbchgg/oxrls-win32-ia32-msvc') 134 149 const bindingPackageVersion = require('@bdbchgg/oxrls-win32-ia32-msvc/package.json').version 135 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 136 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 150 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 151 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 137 152 } 138 153 return binding 139 154 } catch (e) { ··· 148 163 try { 149 164 const binding = require('@bdbchgg/oxrls-win32-arm64-msvc') 150 165 const bindingPackageVersion = require('@bdbchgg/oxrls-win32-arm64-msvc/package.json').version 151 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 152 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 166 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 167 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 153 168 } 154 169 return binding 155 170 } catch (e) { ··· 167 182 try { 168 183 const binding = require('@bdbchgg/oxrls-darwin-universal') 169 184 const bindingPackageVersion = require('@bdbchgg/oxrls-darwin-universal/package.json').version 170 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 171 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 185 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 186 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 172 187 } 173 188 return binding 174 189 } catch (e) { ··· 183 198 try { 184 199 const binding = require('@bdbchgg/oxrls-darwin-x64') 185 200 const bindingPackageVersion = require('@bdbchgg/oxrls-darwin-x64/package.json').version 186 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 187 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 201 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 202 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 188 203 } 189 204 return binding 190 205 } catch (e) { ··· 199 214 try { 200 215 const binding = require('@bdbchgg/oxrls-darwin-arm64') 201 216 const bindingPackageVersion = require('@bdbchgg/oxrls-darwin-arm64/package.json').version 202 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 203 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 217 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 218 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 204 219 } 205 220 return binding 206 221 } catch (e) { ··· 219 234 try { 220 235 const binding = require('@bdbchgg/oxrls-freebsd-x64') 221 236 const bindingPackageVersion = require('@bdbchgg/oxrls-freebsd-x64/package.json').version 222 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 223 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 237 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 238 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 224 239 } 225 240 return binding 226 241 } catch (e) { ··· 235 250 try { 236 251 const binding = require('@bdbchgg/oxrls-freebsd-arm64') 237 252 const bindingPackageVersion = require('@bdbchgg/oxrls-freebsd-arm64/package.json').version 238 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 239 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 253 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 254 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 240 255 } 241 256 return binding 242 257 } catch (e) { ··· 256 271 try { 257 272 const binding = require('@bdbchgg/oxrls-linux-x64-musl') 258 273 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-x64-musl/package.json').version 259 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 260 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 274 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 275 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 261 276 } 262 277 return binding 263 278 } catch (e) { ··· 272 287 try { 273 288 const binding = require('@bdbchgg/oxrls-linux-x64-gnu') 274 289 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-x64-gnu/package.json').version 275 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 276 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 290 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 291 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 277 292 } 278 293 return binding 279 294 } catch (e) { ··· 290 305 try { 291 306 const binding = require('@bdbchgg/oxrls-linux-arm64-musl') 292 307 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-arm64-musl/package.json').version 293 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 294 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 308 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 309 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 295 310 } 296 311 return binding 297 312 } catch (e) { ··· 306 321 try { 307 322 const binding = require('@bdbchgg/oxrls-linux-arm64-gnu') 308 323 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-arm64-gnu/package.json').version 309 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 310 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 324 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 325 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 311 326 } 312 327 return binding 313 328 } catch (e) { ··· 324 339 try { 325 340 const binding = require('@bdbchgg/oxrls-linux-arm-musleabihf') 326 341 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-arm-musleabihf/package.json').version 327 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 328 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 342 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 343 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 329 344 } 330 345 return binding 331 346 } catch (e) { ··· 340 355 try { 341 356 const binding = require('@bdbchgg/oxrls-linux-arm-gnueabihf') 342 357 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-arm-gnueabihf/package.json').version 343 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 344 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 358 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 359 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 345 360 } 346 361 return binding 347 362 } catch (e) { ··· 358 373 try { 359 374 const binding = require('@bdbchgg/oxrls-linux-loong64-musl') 360 375 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-loong64-musl/package.json').version 361 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 362 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 376 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 377 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 363 378 } 364 379 return binding 365 380 } catch (e) { ··· 374 389 try { 375 390 const binding = require('@bdbchgg/oxrls-linux-loong64-gnu') 376 391 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-loong64-gnu/package.json').version 377 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 378 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 392 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 393 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 379 394 } 380 395 return binding 381 396 } catch (e) { ··· 392 407 try { 393 408 const binding = require('@bdbchgg/oxrls-linux-riscv64-musl') 394 409 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-riscv64-musl/package.json').version 395 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 396 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 410 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 411 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 397 412 } 398 413 return binding 399 414 } catch (e) { ··· 408 423 try { 409 424 const binding = require('@bdbchgg/oxrls-linux-riscv64-gnu') 410 425 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-riscv64-gnu/package.json').version 411 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 412 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 426 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 427 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 413 428 } 414 429 return binding 415 430 } catch (e) { ··· 425 440 try { 426 441 const binding = require('@bdbchgg/oxrls-linux-ppc64-gnu') 427 442 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-ppc64-gnu/package.json').version 428 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 429 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 443 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 444 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 430 445 } 431 446 return binding 432 447 } catch (e) { ··· 441 456 try { 442 457 const binding = require('@bdbchgg/oxrls-linux-s390x-gnu') 443 458 const bindingPackageVersion = require('@bdbchgg/oxrls-linux-s390x-gnu/package.json').version 444 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 445 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 459 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 460 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 446 461 } 447 462 return binding 448 463 } catch (e) { ··· 461 476 try { 462 477 const binding = require('@bdbchgg/oxrls-openharmony-arm64') 463 478 const bindingPackageVersion = require('@bdbchgg/oxrls-openharmony-arm64/package.json').version 464 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 465 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 479 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 480 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 466 481 } 467 482 return binding 468 483 } catch (e) { ··· 477 492 try { 478 493 const binding = require('@bdbchgg/oxrls-openharmony-x64') 479 494 const bindingPackageVersion = require('@bdbchgg/oxrls-openharmony-x64/package.json').version 480 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 481 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 495 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 496 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 482 497 } 483 498 return binding 484 499 } catch (e) { ··· 493 508 try { 494 509 const binding = require('@bdbchgg/oxrls-openharmony-arm') 495 510 const bindingPackageVersion = require('@bdbchgg/oxrls-openharmony-arm/package.json').version 496 - if (bindingPackageVersion !== '1.0.0-alpha.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 497 - throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 511 + if (bindingPackageVersion !== '1.0.0-alpha.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 512 + throw new Error(`Native binding package version mismatch, expected 1.0.0-alpha.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 498 513 } 499 514 return binding 500 515 } catch (e) { ··· 521 536 wasiBindingError = err 522 537 } 523 538 } 524 - if (!nativeBinding) { 539 + if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { 525 540 try { 526 541 wasiBinding = require('@bdbchgg/oxrls-wasm32-wasi') 527 542 nativeBinding = wasiBinding 528 543 } catch (err) { 529 544 if (process.env.NAPI_RS_FORCE_WASI) { 530 - wasiBindingError.cause = err 545 + if (!wasiBindingError) { 546 + wasiBindingError = err 547 + } else { 548 + wasiBindingError.cause = err 549 + } 531 550 loadErrors.push(err) 532 551 } 533 552 } ··· 557 576 } 558 577 559 578 module.exports = nativeBinding 560 - module.exports.plus100 = nativeBinding.plus100 561 579 module.exports.runCli = nativeBinding.runCli
+37 -17
packages/oxrls/src/bump/apply.rs
··· 141 141 } 142 142 143 143 if changelog_mode.global { 144 - // Collect all bumped packages with their summaries for the global changelog 145 - let global_packages: Vec<(String, semver::Version, BumpType, Vec<String>)> = plan 146 - .bumps 147 - .values() 148 - .map(|bump| { 149 - ( 150 - bump.package_name.clone(), 151 - bump.new_version.clone(), 152 - bump.bump_type, 153 - bump.summaries.clone(), 154 - ) 155 - }) 156 - .collect(); 144 + if is_solo_repo { 145 + // Solo repo: use per-package format (version h2, no package prefix). 146 + // Since there's only one package, the per-package formatter gives the 147 + // desired output — version as heading, plain bullet entries. 148 + if let Some((_name, bump)) = plan.bumps.iter().next() { 149 + let mut changes: IndexMap<BumpType, Vec<String>> = IndexMap::new(); 150 + changes.insert(bump.bump_type, bump.summaries.clone()); 151 + let entry = ChangelogEntry { 152 + package_name: bump.package_name.clone(), 153 + version: bump.new_version.to_string(), 154 + changes, 155 + }; 156 + let section = generate_changelog_section(&entry); 157 + if !section.is_empty() { 158 + let changelog_path = workspace.root.join("CHANGELOG.md"); 159 + update_changelog(&changelog_path, &section)?; 160 + } 161 + } 162 + } else { 163 + // Monorepo: aggregate changes from all bumped packages with a date heading 164 + let global_packages: Vec<(String, semver::Version, BumpType, Vec<String>)> = plan 165 + .bumps 166 + .values() 167 + .map(|bump| { 168 + ( 169 + bump.package_name.clone(), 170 + bump.new_version.clone(), 171 + bump.bump_type, 172 + bump.summaries.clone(), 173 + ) 174 + }) 175 + .collect(); 157 176 158 - let global_section = generate_global_changelog_section(&global_packages); 159 - if !global_section.is_empty() { 160 - let global_changelog_path = workspace.root.join("CHANGELOG.md"); 161 - update_global_changelog(&global_changelog_path, &global_section)?; 177 + let global_section = generate_global_changelog_section(&global_packages); 178 + if !global_section.is_empty() { 179 + let global_changelog_path = workspace.root.join("CHANGELOG.md"); 180 + update_global_changelog(&global_changelog_path, &global_section)?; 181 + } 162 182 } 163 183 } 164 184
+76
packages/oxrls/src/bump/mod.rs
··· 656 656 ); 657 657 } 658 658 659 + /// Helper: create a solo repo workspace (single package at root, no workspaces field). 660 + fn create_solo_workspace(tmp: &TempDir) -> Workspace { 661 + let root_pkg = serde_json::json!({ 662 + "name": "@bdbchgg/wingetjs", 663 + "version": "1.0.0" 664 + }); 665 + std::fs::write( 666 + tmp.path().join("package.json"), 667 + serde_json::to_string_pretty(&root_pkg).unwrap(), 668 + ) 669 + .unwrap(); 670 + 671 + load_workspace(tmp.path()).unwrap() 672 + } 673 + 674 + #[test] 675 + fn test_solo_repo_changelog_format() { 676 + let tmp = TempDir::new().unwrap(); 677 + let workspace = create_solo_workspace(&tmp); 678 + 679 + let release_dir = tmp.path().join(".oxrls"); 680 + std::fs::create_dir_all(&release_dir).unwrap(); 681 + 682 + let content = r#"--- 683 + "@bdbchgg/wingetjs": minor 684 + --- 685 + 686 + Initial release of @bdbchgg/wingetjs"#; 687 + std::fs::write(release_dir.join("release.md"), content).unwrap(); 688 + 689 + let config = OxrlsConfig::default(); 690 + let plan = build_release_plan(&workspace, &config, &release_dir).unwrap(); 691 + 692 + // Apply the plan (not dry run) 693 + apply_release_plan(&workspace, &plan, &config, &release_dir, false, false).unwrap(); 694 + 695 + // Read the generated changelog 696 + let changelog_path = tmp.path().join("CHANGELOG.md"); 697 + assert!(changelog_path.exists(), "CHANGELOG.md should exist"); 698 + 699 + let changelog = std::fs::read_to_string(&changelog_path).unwrap(); 700 + 701 + // Should use version as h2, NOT a date 702 + assert!( 703 + changelog.contains("## v1.1.0"), 704 + "Changelog should use version heading, got:\n{}", 705 + changelog 706 + ); 707 + assert!( 708 + !changelog.contains("2026-"), 709 + "Changelog should NOT use date heading, got:\n{}", 710 + changelog 711 + ); 712 + 713 + // Should NOT contain package prefix 714 + assert!( 715 + !changelog.contains("**@bdbchgg/wingetjs**"), 716 + "Changelog should NOT contain package prefix in solo mode, got:\n{}", 717 + changelog 718 + ); 719 + 720 + // Should use plain bullet format 721 + assert!( 722 + changelog.contains("- Initial release of @bdbchgg/wingetjs"), 723 + "Changelog should use plain bullet format, got:\n{}", 724 + changelog 725 + ); 726 + 727 + // Verify structure 728 + assert!( 729 + changelog.contains("### Minor Changes"), 730 + "Changelog should have Minor Changes section, got:\n{}", 731 + changelog 732 + ); 733 + } 734 + 659 735 #[test] 660 736 fn test_pre_state_not_saved_by_build_plan_alone() { 661 737 // When build_release_plan is called without a subsequent apply,
+3 -2
packages/oxrls/src/changelog.rs
··· 38 38 pub fn generate_changelog_section(entry: &ChangelogEntry) -> String { 39 39 let mut lines = Vec::new(); 40 40 41 - lines.push(format!("## {}", entry.version)); 41 + lines.push(format!("## v{}", entry.version)); 42 42 lines.push(String::new()); 43 43 44 44 let type_names = [ ··· 237 237 }; 238 238 239 239 let section = generate_changelog_section(&entry); 240 - assert!(section.contains("1.2.4")); 240 + assert!(section.contains("v1.2.4")); 241 241 assert!(section.contains("### Patch Changes")); 242 242 assert!(section.contains("Fixed editor selection behavior.")); 243 243 assert!(!section.contains("Minor Changes")); ··· 263 263 }; 264 264 265 265 let section = generate_changelog_section(&entry); 266 + assert!(section.contains("v2.0.0")); 266 267 assert!(section.contains("### Major Changes")); 267 268 assert!(section.contains("### Minor Changes")); 268 269 assert!(section.contains("### Patch Changes"));
+11 -2
packages/oxrls/tests/megatest.rs
··· 418 418 419 419 let changelog_content = std::fs::read_to_string(&changelog_path).unwrap(); 420 420 assert!(changelog_content.contains("# Changelog"), "Should have changelog header"); 421 - assert!(changelog_content.contains("my-app"), "Should reference the package name"); 422 - assert!(changelog_content.contains("1.0.1"), "Should reference the new version"); 421 + // Solo repo uses version heading (not date), no package prefix 422 + assert!( 423 + changelog_content.contains("## v1.0.1"), 424 + "Should use version heading, got:\n{}", 425 + changelog_content 426 + ); 427 + assert!( 428 + !changelog_content.contains("**my-app**"), 429 + "Solo repo should NOT have package prefix, got:\n{}", 430 + changelog_content 431 + ); 423 432 assert!(changelog_content.contains("Fix login bug"), "Should contain the release summary"); 424 433 assert!(changelog_content.contains("### Patch Changes"), "Should group changes by type"); 425 434