fix(workspace): restructure into a true sibling Cargo workspace - #77
Merged
Conversation
release-please's built-in Rust strategy unconditionally force-syncs the version of every `[workspace] members` entry whenever the manifest it reads for a release path declares both `[package]` and `[workspace]` in the same file (src/strategies/rust.ts: "found workspace with N members, upgrading all"). PR #75 removed the redundant "." self- reference from that array, which fixed a warning, but the very next release PR reproduced the identical bug (cli-engine-macros silently bumped to match cli-engine's version with no corresponding commits, changelog, or manifest entry) — confirmed via two consecutive release-please-action run logs. The only way to stop it: the manifest release-please reads for cli-engine's path must not declare `[workspace]` at all. Move cli-engine's package into its own `cli-engine/` subdirectory as a true sibling of `cli-engine-macros/`, and make the repo root a pure virtual `[workspace]`-only manifest. - `Cargo.toml` (root): now workspace-only, with `resolver = "3"` (virtual workspaces don't auto-infer this from an edition-2024 member the way a non-virtual root does — verified in a scratch workspace) and the `[workspace.lints.*]` tables moved here verbatim. - `cli-engine/Cargo.toml`: everything else from the old root manifest; `cli-engine-macros` path dependency updated to `../cli-engine-macros` (now a sibling, not nested); `readme` points at `../README.md` (verified Cargo packages a readme outside the crate directory correctly). - `cli-engine/LICENSE`: copied so `cargo publish` still bundles a license file, matching today's behavior (previously implicit since LICENSE and Cargo.toml shared a directory). - `release-please-config.json` / `.release-please-manifest.json`: package key `"."` renamed to `"cli-engine"` (component/tag name unaffected). - CI/release workflows: the two `cargo publish` steps that ran at repo root now need an explicit `-p cli-engine` (a virtual workspace has no default package to publish). Other steps are left as bare workspace-wide commands — cli-engine-macros now gets covered by them too, which it silently wasn't before. - Doc wording in `AGENTS.md`, `README.md`, `CONTRIBUTING.md`, and `cli-engine/docs/design.md` updated to describe the new workspace shape and fix relative links. Verified locally end-to-end: fmt, clippy, test, doc, and doctest all pass (both default and pkce-auth feature sets), missing-docs count is still zero, Cargo.lock is untouched (path deps don't encode filesystem paths), and `cargo publish --dry-run` succeeds for both crates with `cargo package --list` confirming LICENSE/README are correctly bundled.
axburgess-godaddy
approved these changes
Aug 3, 2026
Merged
jpage-godaddy
added a commit
that referenced
this pull request
Aug 3, 2026
The move to cli-engine/ (#77) changed release-please's per-path commit filtering — file diffs for commits made before the move (#72, #73) point at the old src/ paths, not cli-engine/, so release-please's regenerated changelog only picked up commits made after the move. Nothing was lost from git history or the shipped code; this just restores the visible changelog entry to the full set of changes since 0.6.0.
jpage-godaddy
added a commit
that referenced
this pull request
Aug 3, 2026
🤖 I have created a release *beep* *boop* --- <details><summary>cli-engine: 0.6.1</summary> ## [0.6.1](cli-engine-v0.6.0...cli-engine-v0.6.1) (2026-08-03) ### Features * **command:** add context-aware typed constructors and ArgGroup support ([#73](#73)) ([748efc6](748efc6)) * **output:** support nested table output in human rendering ([#72](#72)) ([8ca7479](8ca7479)) ### Bug Fixes * **workspace:** drop redundant "." self-reference from workspace members ([#75](#75)) ([b769528](b769528)) * **workspace:** restructure into a true sibling Cargo workspace ([#77](#77)) ([05b8b29](05b8b29)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jacob Page <jpage@godaddy.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
cli-engine-macros's version gets silently force-synced to matchcli-engine's, even with zero commits of its own (seen again in chore: release main #74, after fix(workspace): drop redundant "." self-reference from workspace members #75's"."self-reference fix only removed a warning, not the actual behavior).src/strategies/rust.ts) and tracing two consecutiverelease-please-actionrun logs: any time the manifest release-please reads for a release path has both[package]and[workspace]in the same file, it unconditionally forces every[workspace] membersentry's version to match — regardless of commits, regardless of thecargo-workspaceplugin, regardless ofrelease-please-config.json's independent per-package versioning. Our rootCargo.tomlwas exactly that shape (cli-engine's own package +[workspace] members = ["cli-engine-macros"]), so this fires on every release.cli-engine's package into its owncli-engine/subdirectory as a true sibling ofcli-engine-macros/, and make the repo root a pure virtual[workspace]-only manifest. TracedRust.buildUpdates()for a manifest with no[workspace]section — it takes the safe "single crate found, updating Cargo.toml" branch; the buggy branch can no longer trigger.What moved / changed
src/,tests/,examples/,docs/,CHANGELOG.md,Cargo.toml→ all moved intocli-engine/viagit mv(100% renames, history preserved).Cargo.toml: workspace-only,resolver = "3"(a virtual workspace doesn't auto-infer this from an edition-2024 member the way a non-virtual root does — verified in a scratch workspace, confirmed the warning/behavior change),[workspace.lints.*]moved here verbatim.cli-engine/Cargo.toml:cli-engine-macrospath dependency →../cli-engine-macros(sibling, not nested);readme→../README.md(verified Cargo packages a readme outside the crate directory correctly).cli-engine/LICENSE: copied socargo publishstill bundles a license file (previously implicit since LICENSE and Cargo.toml shared a directory).release-please-config.json/.release-please-manifest.json: package key"."→"cli-engine"(component/tag name unaffected — releases still tag ascli-engine-vX.Y.Z)..github/workflows/ci.ymlandrelease.yml: the twocargo publishsteps that ran at repo root now use-p cli-engineexplicitly (a virtual workspace has no default package to publish; verifiedcargo publishwith no-pin a multi-member virtual workspace would otherwise try to publish every member in one shot). Other steps (fmt --all,check/clippy/test/doc --all-targets) are left as bare workspace-wide commands —cli-engine-macrosnow gets covered by them too, which it silently wasn't before.AGENTS.md,README.md,CONTRIBUTING.md, andcli-engine/docs/design.mdupdated to describe the new workspace shape and fix relative links.Test plan
cargo generate-lockfilereverted (it does a full fresh resolve, not what we want) — usedcargo checkinstead; confirmedCargo.lockhas zero diff (path deps don't encode filesystem paths)cargo fmt --all --checkcargo clippy --all-targets -- -D warnings(+--features pkce-auth)cargo test --all-targets(+ pkce-auth) — all passing, 0 failuresRUSTDOCFLAGS='-D warnings' cargo doc --no-deps(+ pkce-auth) andcargo test --doc(+ pkce-auth)cargo rustdoc --lib -p cli-engine -- -W missing-docs— zero missing docscargo package --list -p cli-engine— confirmsLICENSEandREADME.md(via../README.md) are correctly bundledcargo publish --dry-run -p cli-engineandcd cli-engine-macros && cargo publish --dry-run— both succeed, correctly resolving the path dependencyrelease-pleaseAction run's log for theRuststrategy trace — should now show "single crate found, updating Cargo.toml" forcli-engineinstead of "found workspace with N members, upgrading all"🤖 Generated with Claude Code