@graham.systems /dist-town/cli
0.7.0
all artifacts verified
dist-town/cli 0.7.0
The command is now just disttown publish.
disttown.jsonc
A repo can commit a manifest describing what it publishes: the project,
the artifact globs, the storage choice, and the account expected to do
the publishing. It's JSON with comments (the .jsonc extension is the
honest label — editors just work), it resolves by walking up from
wherever you are (monorepo sub-projects get their own), and a published
JSON Schema at dist.town/disttown.schema.json gives you completion
and validation as you write it.
disttown init writes a commented scaffold, proposing the project name
and detecting dist/.
Inference, shown
With a manifest committed and an annotated tag at HEAD, publish infers
everything: the tag proposes the version (a leading v before a digit
is stripped), the manifest supplies the files, the storage choice
routes the bytes. Nothing inferred is ever silent — interactive publish
renders the whole plan first (every value with its source, every file
with its digest and destination, every pointer move) and asks. --yes
skips the question; non-interactive runs behave exactly as before, so
no CI pipeline changes.
Explicit arguments override the manifest everywhere. No manifest means the CLI you already know, unchanged.
Storage profiles
The machine defines buckets, repos pick them by name: disttown storage setup --profile cdn records the definition, a manifest says
"storage": "cdn", and per-entry overrides route individual globs
elsewhere. "blobs" is reserved for bytes-on-your-own-PDS. Upload
commands and credentials never live in the repo, so a cloned manifest
carries no secrets. DISTTOWN_STORAGE_BASE_URL / _UPLOAD_CMD serve
CI without any files.
The publisher guard
The manifest records which DID it expects to publish. Logged in as
someone else, publish stops before a byte moves and says so — the
multi-account save. The other resolution is adoption: the manifest is
rewritten to expect you, and the original project reference moves into
derivedFrom — fork lineage, captured at the only moment the CLI can
know it, preserved comment-for-comment. The claim reaches the project
record and renders on the fork's page as exactly what it is: a claim.
Also
- Every command that takes a project now infers it from the manifest
when you don't say —
release listbare, inside a governed repo, means that repo's project, and the output says so. - Manifest globs are containment-checked: never absolute, never escaping the repo, symlinks resolved — a hostile manifest can't publish your dotfiles.
storage doctor --profile <name>checks a named profile.- Nix builds of the CLI now stamp their version (
0.7.0+nix) and update source instead of reportingdev.
Artifacts
- disttown-darwin-amd64.tar.gz
sha-256
de3fb50a3a2298c27382f7c57d338891bc8197f5dfa1454c4f41504d6f635ee0 - disttown-darwin-arm64.tar.gz
sha-256
c58129c2f393c1818a6bfb9618eb3226d899f0e9b2555f963371fc80895d8a16 - disttown-linux-amd64.tar.gz
sha-256
d4f58f1eb35ddf9ac1d92b40cd4b0677f36b17fde738f1dcebee43633eaa5d3c - disttown-linux-arm64.tar.gz
sha-256
1632153a1a466f131ec6ffd91329da1e1c0618b5e5cb88552d378e6d878c02bd - disttown-windows-amd64.zip
sha-256
929c6cd27aba084e4c45337e337aea4d963ab34e46335cbde9c6e38f561706fb - disttown-windows-arm64.zip
sha-256
2043c8e2cfe7b5b89ab3e46aca38b939baa6f54b23236f3175cd4d5e5e3df281