feat(cli): ship the binary from the published crate - #217
Merged
Conversation
`cargo install rustmotion` could not work. The README documents it, and the crate's own description calls it "a CLI tool", but the published crate carried only a `[lib]`: the `rustmotion` binary was declared in `rustmotion-cli`, which is `publish = false`. Installing it gave a library and no command. The binary now lives in `crates/rustmotion` and `rustmotion-cli` is gone. The studio subcommand could not come along, and not for want of trying: an optional dependency does not help, because `rustmotion-studio` depends on `rustmotion`, so cargo rejects the cycle before compiling anything. No capability is lost — `rustmotion-studio` already declares its own binary of that name, so the studio is launched directly instead of through a subcommand. Moving the CLI exposed a second defect, latent while the crate was unpublished and the same class as the themes bug fixed in #216: `build.rs` walked `.claude/skills/rustmotion/` and `skills.rs` embedded `CLAUDE.md`, both outside the package directory. `cargo package` archives only what lives under the crate, so the tarball did not compile — the verify step failed on a missing SKILL.md. Both now live inside the crate, with symlinks at their old paths so Claude Code still finds them. One copy, not two: this repository already learned in #165 what a duplicated skill list costs when it drifts, and the test that caught that drift is what still guards it. The install destination is unchanged. `build.rs` embeds the path the file will be written to rather than the path it came from, and running the built binary in an empty directory writes 59 files to `.claude/skills/rustmotion/` as before.
This was referenced Aug 20, 2026
Merged
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.
cargo install rustmotioncannot work today. The README documents it at line 12,and the crate describes itself as "a CLI tool", but the published crate carries
only a
[lib]— therustmotionbinary is declared inrustmotion-cli, which ispublish = false. Anyone following the documented instruction installs a libraryand gets no command.
No issue tracks this; it was found while looking for the binary to reproduce an
unrelated studio bug.
The binary moves into the published crate
crates/rustmotion-cliis gone and its 21 files moved undercrates/rustmotionvia
git mv, so history follows. Six subcommands —render,concat,validate,schema,info,completions— keep their behaviour exactly.The studio subcommand could not come along
Not a scoping choice.
rustmotion-studiodepends onrustmotion, so makingrustmotiondepend on the studio — even optionally — is a cycle, and cargorefuses before compiling:
Nothing is lost.
rustmotion-studioalready declares its own binary of that name,so the studio is launched directly rather than through
rustmotion studio.A second defect, found by moving
Latent while the crate was unpublished, and the same class as the themes bug fixed
in #216:
build.rswalked.claude/skills/rustmotion/andskills.rsembeddedCLAUDE.md— both outside the package directory.cargo packagearchives onlywhat lives under the crate, so the tarball did not compile:
Left alone, this PR would have replaced "no binary" with "cannot publish at all".
Both now live inside the crate, with symlinks at their old paths so Claude
Code still finds them. One copy, deliberately: this repository already learned in
#165 what a duplicated skill list costs when it drifts — 17 files behind, no build
or test failing — and
tests/skill_files_match_disk.rs, written for thatincident, still guards it.
Verification
cargo fmt --all --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspacecargo package -p rustmotion--helpproves nothing here, so the built binary was exercised:validateandinfoon a real scenario,schema,still,render --frame,render --frameswith its audio slice,
completions generate zsh, andrustmotion-studio --helpstill works.
The one that mattered most, since
build.rsnow embeds a destination that differsfrom the source path: running
skills installin an empty directory writes 59files to
.claude/skills/rustmotion/, exactly where it wrote them before.Left alone on purpose
docs/superpowers/plans/still citescrates/rustmotion-cli. Those are Juneplanning records; rewriting them would falsify an account of what was done.