v0.5.1
Twelve command-surface and contract fixes on top of v0.5.0 — including one where a second project's bootstrap could silently make tan build compile the wrong SDK — plus a README rewritten as a user-facing guide.
Highlights
tan kconfigworks on the workspace tan itself bootstrapped. It resolved neither the workspace venv'swestnor the bootstrappedZEPHYR_BASE, so it failed against the exact environment the quickstart produces. (#453)tan qualityandtan migratecan succeed at all. Neither could pass the west extension's required argument, under any input. (#454)- A second project's bootstrap no longer silently repoints the first.
~/.alp/sdk-defaultis machine-global and last-writer-wins; project A could resolve project B's checkout and build it withok: trueand no warning. (#464) tan debug-configinfers a real hardware target instead of defaulting tonative-hostand writing alaunch.jsonpointing at a binary the build never produces. (#456)tan generate --allis re-runnable. It succeeded once, then always exited 3 because one of nine targets refused to overwrite — leaving the other eight rewritten. (#457)tan renodehonours--project. It resolved the build root from the CWD and its own remedy told you to build the wrong directory. (#470)- Silent failures made audible:
tan pinmuxprinted nothing on exit 2 (#458),tan diffreported "no differences" on aboard.yamlthattan validaterejects (#455), andtan bootstrap --print-envdescribed a workspace bootstrap would never create (#459). - README rewritten from ~4,000 words to under 1,000: quickstart, command table, SDK selection order, JSON envelope contract.
Fixed
- Four
debug-configpreconditions reclassified from exit 5 to exit 2 — user-fixable input was being reported as a tan crash. (#462) bootstrap.workspace-orphan-refusedno longer prints a stringifiedNonefor its destination, or advises dropping a--workspacethe invocation never passed. (#469)contract/issue-codes.jsonregistered two codes twice, one pair disagreeing on severity. JSON duplicate keys are last-wins, so the published severity depended on file order. Deduped, plus a new gate that rejects duplicates. (#467)
Behaviour worth knowing
- On a multi-core SoM,
tan debug-confignow needs--core <name>; without it, it exits 2 withdebug-config.target-kind-ambiguousrather than guessing. tan qualityrequires--profile,tan migraterequires one of--check/--preview/--apply. Both refuse at exit 2 before spawningwest.- When the machine-global default SDK was last written by a different project's bootstrap, commands now emit a
sdk.global-default-foreign-projectwarning instead of resolving silently.
Install
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/alplabai/tan-cli/main/install.sh | sh# Windows
irm https://raw.githubusercontent.com/alplabai/tan-cli/main/install.ps1 | iex| Platform | Asset |
|---|---|
| Windows x64 | tan-x86_64-pc-windows-msvc.zip |
| Linux x64 (glibc) | tan-x86_64-unknown-linux-gnu.tar.gz |
| macOS x64 | tan-x86_64-apple-darwin.tar.gz |
| macOS arm64 | tan-aarch64-apple-darwin.tar.gz |
The Linux binary requires GLIBC_2.30 or newer, measured from the frozen payload rather than the bootloader. There is no musl asset: a PyInstaller musl freeze runs only on musl distros, so install.sh probes for musl and refuses before downloading rather than failing at exec. Linux arm64 and Windows arm64 have no prebuilt archive — install from source on those hosts.
Verify a download:
gh attestation verify <downloaded-file> --repo alplabai/tan-clichecksums.txt carries the SHA-256 of every asset; envelope-contract.json is the machine-readable command/issue-code contract consumers key off.
Full detail: CHANGELOG.md · full diff