An idea capture, not a design: give people a way to get pmt/tmt without a Rust toolchain.
Motivation
Today the only way to obtain either binary is cargo install — i.e. install Rust first. That is fine for the audience that already has it, and it is a hard gate for the one that does not.
The gate matters more than it looks, because the editor plugins assume a binary on PATH. All four (VS Code and JetBrains, PM-1 and TM-1) shell out to pmt/tmt for LSP and DAP, and each declares a MIN_TESTED_PMT/MIN_TESTED_TMT floor — currently 0.4.0. So the plugin story is "install this extension, then install Rust, then cargo install two crates, then check your version is new enough". Someone who wants to look at a brainfuck universal Turing machine in their editor is not necessarily someone who wants a Rust toolchain.
Second, smaller point: v0.4.0's release attached four plugin artifacts and no binaries at all. Even a user who is happy to download something by hand has nothing to download.
Possible shapes, in dependency order
-
Prebuilt release binaries. The prerequisite for everything below, and the bulk of the work. A release workflow with a target matrix, artifacts attached to the GH release, built against the toolchain rust-toolchain.toml pins (1.98.0) so a packaged binary and a local build are the same compiler by construction. Candidate targets: aarch64-apple-darwin, x86_64-apple-darwin, x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, x86_64-pc-windows-msvc. CI today (.github/workflows/test.yml) is ubuntu-only and runs on push to master / PRs against it, so this is a new workflow rather than an extension of that one.
-
A Homebrew tap (mellonis/homebrew-tap), one formula installing both binaries. Formula-from-source is the cheap version (brew installs Rust as a build dep, no bottles to maintain); pouring prebuilt bottles is faster for users and more upkeep. Worth deciding deliberately rather than by default.
-
Windows. A zip of the MSVC build gets most of the way. winget and scoop manifests are each a small increment on top of (1) — scoop especially, since it is just a JSON manifest pointing at a release asset.
-
Linux beyond tarballs. .deb/.rpm/AUR are real ongoing maintenance for a pre-1.0 project. My inclination is: tarballs from (1), and revisit only if someone asks.
Open questions
- One package or two? One repo, two CLIs, crates versioned in lockstep — a single
machine-toolchains package installing both seems right, but it forecloses installing only the one you use.
- Shell completions. Homebrew conventionally installs completions into its own share dirs.
pmt completions / tmt completions currently implement zsh only; bash and fish are recognised names that fail with a not-yet-implemented error. Packaging is the point where that gap becomes user-visible rather than theoretical — a formula that installs zsh completions and silently ships nothing for bash users is a worse experience than the current one. Either scope bash into this work or decide explicitly to ship zsh-only.
- Windows and completions generally — no completion story there at all today.
- Bottles vs from-source for brew (above), and whether the answer changes once (1) exists and the binaries are already built.
- Does this change the release checklist? The realized flow is: docs audit, bump crates + plugins +
MIN_TESTED_* floors with the CHANGELOG entry, merge, tag, gh release create with plugin artifacts. Binary artifacts would slot into that last step, but the matrix build wants to run before the tag is published, not after.
Placement
Not before the C2 arc (#14) lands — it touches nothing this does, but it would compete for the same review attention. Most naturally part of a release round rather than a standalone change, since it modifies the release flow: 0.5.0 is the obvious candidate.
An idea capture, not a design: give people a way to get
pmt/tmtwithout a Rust toolchain.Motivation
Today the only way to obtain either binary is
cargo install— i.e. install Rust first. That is fine for the audience that already has it, and it is a hard gate for the one that does not.The gate matters more than it looks, because the editor plugins assume a binary on
PATH. All four (VS Code and JetBrains, PM-1 and TM-1) shell out topmt/tmtfor LSP and DAP, and each declares aMIN_TESTED_PMT/MIN_TESTED_TMTfloor — currently 0.4.0. So the plugin story is "install this extension, then install Rust, thencargo installtwo crates, then check your version is new enough". Someone who wants to look at a brainfuck universal Turing machine in their editor is not necessarily someone who wants a Rust toolchain.Second, smaller point: v0.4.0's release attached four plugin artifacts and no binaries at all. Even a user who is happy to download something by hand has nothing to download.
Possible shapes, in dependency order
Prebuilt release binaries. The prerequisite for everything below, and the bulk of the work. A release workflow with a target matrix, artifacts attached to the GH release, built against the toolchain
rust-toolchain.tomlpins (1.98.0) so a packaged binary and a local build are the same compiler by construction. Candidate targets:aarch64-apple-darwin,x86_64-apple-darwin,x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,x86_64-pc-windows-msvc. CI today (.github/workflows/test.yml) is ubuntu-only and runs on push to master / PRs against it, so this is a new workflow rather than an extension of that one.A Homebrew tap (
mellonis/homebrew-tap), one formula installing both binaries. Formula-from-source is the cheap version (brew installs Rust as a build dep, no bottles to maintain); pouring prebuilt bottles is faster for users and more upkeep. Worth deciding deliberately rather than by default.Windows. A zip of the MSVC build gets most of the way.
wingetandscoopmanifests are each a small increment on top of (1) — scoop especially, since it is just a JSON manifest pointing at a release asset.Linux beyond tarballs.
.deb/.rpm/AUR are real ongoing maintenance for a pre-1.0 project. My inclination is: tarballs from (1), and revisit only if someone asks.Open questions
machine-toolchainspackage installing both seems right, but it forecloses installing only the one you use.pmt completions/tmt completionscurrently implement zsh only; bash and fish are recognised names that fail with a not-yet-implemented error. Packaging is the point where that gap becomes user-visible rather than theoretical — a formula that installs zsh completions and silently ships nothing for bash users is a worse experience than the current one. Either scope bash into this work or decide explicitly to ship zsh-only.MIN_TESTED_*floors with the CHANGELOG entry, merge, tag,gh release createwith plugin artifacts. Binary artifacts would slot into that last step, but the matrix build wants to run before the tag is published, not after.Placement
Not before the C2 arc (#14) lands — it touches nothing this does, but it would compete for the same review attention. Most naturally part of a release round rather than a standalone change, since it modifies the release flow: 0.5.0 is the obvious candidate.