Commits
Add early-return check in cmd_init that detects existing config files
(.oxrls/config.json, oxrls.json, .oxrls.json) and prints an informational
message instead of proceeding with the wizard. Use --force to overwrite.
Also extracts cmd_init_at for testability and adds 7 unit tests.
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.
Solo (single-package) repos now always produce a root-level
CHANGELOG.md when changelogs are enabled. Per-package/global flags are
treated as monorepo-only. Update config logic, init wizard defaults,
docs, and add tests for solo and legacy cases.
- Replace .github/workflows/CI.yml with .tangled/workflows/ci.yml
- Replace chrono with time crate to enable macOS cross-compilation from Linux
- All 4 targets build via napi cross-compile (-x / --use-napi-cross)
- cargo-zigbuild and cargo-xwin from nixpkgs (no cargo install needed)
- Publish on release/* branches only, uses TANGLED_REF_NAME for npm tag
* fix: address all 12 code review findings (bugs, hardenings, cleanups)
🐛 BUG FIXES:
- init_wizard: apply user's npm access selection instead of discarding it
- lib: fix pre-state path inconsistency (use get_release_dir everywhere)
- release_file: normalize CRLF line endings in frontmatter parser
- lib: replace parse_from with try_parse_from to avoid process::exit in NAPI
- lib: propagate workspace detection errors in cmd_init instead of swallowing
🛡️ HARDENINGS:
- changelog: flexible header stripping with case-insensitive fallback
- package_json: simplify semver range matching logic, fix false positives
- workspace: propagate pnpm-workspace.yaml read/parse errors
- bump, premode: warn on invalid glob patterns instead of silent failure
🧹 CLEANUPS:
- premode: remove dead version_is_pre_release function
- lib: extract shared resolve_package_patterns helper (70% duplication)
- changelog: extract indent_continuations helper
🧪 TESTS:
- 10 new tests for strip_changelog_header, indent_continuations, CRLF parsing
- 79 total tests passing
* test: add megatest covering full user flow (8 phases)
Covers scaffold → config → release files → plan verification →
dry-run → real bump → internal dep updates → pre-release counter.
80 tests passing. Workspace with 8 packages across linked, fixed,
pre-mode, and independent scenarios.
* refactor: split bump.rs into 6-module dir + extract commands from lib.rs
Phase 1: bump.rs (1484 lines) → src/bump/ with mod.rs, plan.rs,
groups.rs, deps.rs, apply.rs, discovery.rs — each with a single
named responsibility.
Phase 2: lib.rs (731→138 lines) → src/commands/ with init.rs,
new.rs, status.rs, bump_cmd.rs, check.rs, release.rs, pre.rs —
each command has its own file matching the CLI subcommand.
80 tests passing, zero warnings, no API breakage.
* refactor: group workspace + pre-release logic into module directories
Phase 3: workspace module directory
- workspace.rs + package_json.rs → src/workspace/{mod,loader,package_json}.rs
- package_json module moved under workspace (re-exported via mod.rs)
Phase 4: pre-release module directory
- premode.rs → src/prerelease/{mod,state,logic}.rs
- Now split into state management (PreState) and logic (resolve/apply)
80 tests passing, zero warnings, no API breakage.
* style: run cargo fmt on restructured files
Phase 3: workspace module directory
- workspace.rs + package_json.rs → src/workspace/{mod,loader,package_json}.rs
- package_json module moved under workspace (re-exported via mod.rs)
Phase 4: pre-release module directory
- premode.rs → src/prerelease/{mod,state,logic}.rs
- Now split into state management (PreState) and logic (resolve/apply)
80 tests passing, zero warnings, no API breakage.
Phase 1: bump.rs (1484 lines) → src/bump/ with mod.rs, plan.rs,
groups.rs, deps.rs, apply.rs, discovery.rs — each with a single
named responsibility.
Phase 2: lib.rs (731→138 lines) → src/commands/ with init.rs,
new.rs, status.rs, bump_cmd.rs, check.rs, release.rs, pre.rs —
each command has its own file matching the CLI subcommand.
80 tests passing, zero warnings, no API breakage.
Covers scaffold → config → release files → plan verification →
dry-run → real bump → internal dep updates → pre-release counter.
80 tests passing. Workspace with 8 packages across linked, fixed,
pre-mode, and independent scenarios.
🐛 BUG FIXES:
- init_wizard: apply user's npm access selection instead of discarding it
- lib: fix pre-state path inconsistency (use get_release_dir everywhere)
- release_file: normalize CRLF line endings in frontmatter parser
- lib: replace parse_from with try_parse_from to avoid process::exit in NAPI
- lib: propagate workspace detection errors in cmd_init instead of swallowing
🛡️ HARDENINGS:
- changelog: flexible header stripping with case-insensitive fallback
- package_json: simplify semver range matching logic, fix false positives
- workspace: propagate pnpm-workspace.yaml read/parse errors
- bump, premode: warn on invalid glob patterns instead of silent failure
🧹 CLEANUPS:
- premode: remove dead version_is_pre_release function
- lib: extract shared resolve_package_patterns helper (70% duplication)
- changelog: extract indent_continuations helper
🧪 TESTS:
- 10 new tests for strip_changelog_header, indent_continuations, CRLF parsing
- 79 total tests passing
This reverts commit f541349ef9630005e1f7091bdc925433b264ea9f.
* fix: skip GitHub release in napi prepublish
* Revert "fix: skip GitHub release in napi prepublish"
This reverts commit f541349ef9630005e1f7091bdc925433b264ea9f.
* fix(bump): apply bump type on first pre-release before adding tag
* chore: commit pending changes
* v1.0.0-alpha.5
ci: publish on release/* branches instead of v* tags
- Lint/build/test runs on every push to main
- Publish + npm publish + GitHub Release only on v* tag pushes
- Prevents duplicate runs
- Trigger on git tag push (v*) instead of commit message check
- Publish to npm with correct dist-tag (latest vs next)
- Create GitHub Release with prebuilt oxrls binaries
- Proper YAML structure
- Publish now correctly detects stable vs pre-release versions
- Added cargo build --release --bin oxrls to matrix build
- Pre-releases (e.g. 1.0.0-alpha.3) publish with --tag next
Binding tests failed because index.js still references old
package-template names. Replace with cargo test which covers
all core CLI logic.
- Version bumps now shown in aligned columns (left-aligned names, right-aligned versions)
- Status output shows filenames instead of full paths
- Private bump_type_str made pub for use in status output
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.
- Replace .github/workflows/CI.yml with .tangled/workflows/ci.yml
- Replace chrono with time crate to enable macOS cross-compilation from Linux
- All 4 targets build via napi cross-compile (-x / --use-napi-cross)
- cargo-zigbuild and cargo-xwin from nixpkgs (no cargo install needed)
- Publish on release/* branches only, uses TANGLED_REF_NAME for npm tag
* fix: address all 12 code review findings (bugs, hardenings, cleanups)
🐛 BUG FIXES:
- init_wizard: apply user's npm access selection instead of discarding it
- lib: fix pre-state path inconsistency (use get_release_dir everywhere)
- release_file: normalize CRLF line endings in frontmatter parser
- lib: replace parse_from with try_parse_from to avoid process::exit in NAPI
- lib: propagate workspace detection errors in cmd_init instead of swallowing
🛡️ HARDENINGS:
- changelog: flexible header stripping with case-insensitive fallback
- package_json: simplify semver range matching logic, fix false positives
- workspace: propagate pnpm-workspace.yaml read/parse errors
- bump, premode: warn on invalid glob patterns instead of silent failure
🧹 CLEANUPS:
- premode: remove dead version_is_pre_release function
- lib: extract shared resolve_package_patterns helper (70% duplication)
- changelog: extract indent_continuations helper
🧪 TESTS:
- 10 new tests for strip_changelog_header, indent_continuations, CRLF parsing
- 79 total tests passing
* test: add megatest covering full user flow (8 phases)
Covers scaffold → config → release files → plan verification →
dry-run → real bump → internal dep updates → pre-release counter.
80 tests passing. Workspace with 8 packages across linked, fixed,
pre-mode, and independent scenarios.
* refactor: split bump.rs into 6-module dir + extract commands from lib.rs
Phase 1: bump.rs (1484 lines) → src/bump/ with mod.rs, plan.rs,
groups.rs, deps.rs, apply.rs, discovery.rs — each with a single
named responsibility.
Phase 2: lib.rs (731→138 lines) → src/commands/ with init.rs,
new.rs, status.rs, bump_cmd.rs, check.rs, release.rs, pre.rs —
each command has its own file matching the CLI subcommand.
80 tests passing, zero warnings, no API breakage.
* refactor: group workspace + pre-release logic into module directories
Phase 3: workspace module directory
- workspace.rs + package_json.rs → src/workspace/{mod,loader,package_json}.rs
- package_json module moved under workspace (re-exported via mod.rs)
Phase 4: pre-release module directory
- premode.rs → src/prerelease/{mod,state,logic}.rs
- Now split into state management (PreState) and logic (resolve/apply)
80 tests passing, zero warnings, no API breakage.
* style: run cargo fmt on restructured files
Phase 3: workspace module directory
- workspace.rs + package_json.rs → src/workspace/{mod,loader,package_json}.rs
- package_json module moved under workspace (re-exported via mod.rs)
Phase 4: pre-release module directory
- premode.rs → src/prerelease/{mod,state,logic}.rs
- Now split into state management (PreState) and logic (resolve/apply)
80 tests passing, zero warnings, no API breakage.
Phase 1: bump.rs (1484 lines) → src/bump/ with mod.rs, plan.rs,
groups.rs, deps.rs, apply.rs, discovery.rs — each with a single
named responsibility.
Phase 2: lib.rs (731→138 lines) → src/commands/ with init.rs,
new.rs, status.rs, bump_cmd.rs, check.rs, release.rs, pre.rs —
each command has its own file matching the CLI subcommand.
80 tests passing, zero warnings, no API breakage.
🐛 BUG FIXES:
- init_wizard: apply user's npm access selection instead of discarding it
- lib: fix pre-state path inconsistency (use get_release_dir everywhere)
- release_file: normalize CRLF line endings in frontmatter parser
- lib: replace parse_from with try_parse_from to avoid process::exit in NAPI
- lib: propagate workspace detection errors in cmd_init instead of swallowing
🛡️ HARDENINGS:
- changelog: flexible header stripping with case-insensitive fallback
- package_json: simplify semver range matching logic, fix false positives
- workspace: propagate pnpm-workspace.yaml read/parse errors
- bump, premode: warn on invalid glob patterns instead of silent failure
🧹 CLEANUPS:
- premode: remove dead version_is_pre_release function
- lib: extract shared resolve_package_patterns helper (70% duplication)
- changelog: extract indent_continuations helper
🧪 TESTS:
- 10 new tests for strip_changelog_header, indent_continuations, CRLF parsing
- 79 total tests passing