Repository navigation
flame 0.3.0
flame 0.3.0 — the flame command for Linux, macOS and Windows, its installer, and
flame-client, flame-core and flame-web, the libraries it is built from.
Installing
curl -fsSL https://propensive.dev/flame | shOr, without trusting the redirect, from this release alone — a 106-byte POSIX-shell bootstrap
which downloads the flame script below, checks it against the digest given here, and runs it:
openssl base64 -d <<EOF | sh -s -- https://github.com/propensive/flame/releases/download/0.3.0/flame 9135016ae7aa6bbe9916b43b12b90ac076aba0333ade6fbd567e1cea75ac40e6
Zj1gbWt0ZW1wYDtjdXJsIC1zTG8gJGYgJDF8fHdnZXQgLXFPICRmICQxO2Nhc2UgYG9wZW5zc2wg
ZGdzdCAtc2hhMjU2ICRmYCBpbiAqJDIpY2htb2QgK3ggJGY7ZXhlYyAkZjtlc2Fj
EOFChanges
Pin the propensive/.github commit that replaces a stale staged jar (#18)
Pins the commit of propensive/.github that fixes a staged sync doing nothing at all.
install treated an unknown digest as proof that whatever already sat at the coordinate was current, and staged assets carried no digest — so sync_releases.py --staged was inert whenever ~/.ivy2/local was already populated. That is exactly the case for a release: CI publishes this repository's own modules with publishLocal and caches the ivy2 layout under a key that does not change between a PR run and a release run, and those jars share the released coordinates without the POM and ivy.xml that release.stage embeds.
The launcher therefore compiled against jars that were not the ones being released, Burdock recorded their digests, and every one of this repository's libraries was inlined instead of externalized. propensive/.github#19 computes the digest, so the stale jar is repaired.
etc/shared runs shared scripts at the commit pinned in etc/github-ref, so nothing here picks that up until this one-line bump lands.
Update dependencies (#17)
Release by tagging rather than by make (#16)
Releases are no longer cut by hand with make release VERSION=X.Y.Z; pushing a signed tag publishes the release instead, through one shared script that every repository in the ecosystem now uses, and the release notes are generated from the pull requests that went into it.
To release flame, bump flameVersion in build.mill, merge it, wait for CI to go green on that commit, and then:
git tag -s X.Y.Z && git push --tagsThe tag is the trigger. It fires .github/workflows/release.yml — fourteen lines calling the reusable scala-release.yml in propensive/.github — which runs release.sh at the commit pinned in etc/github-ref. What flame needs beyond the common path is declared in the new etc/release; the library list and the version pin are not declared there, because the script derives them from release.stage and from build.mill.
Nothing is published until every gate has passed: the tag is signed and verified by GitHub; CI is already green on that exact commit, so a release never re-runs the suite; flameVersion equals the tag; and deps.py check finds every pin, transitively, a published release. If a later step fails, the release and the tag are deleted from origin, so a retry is git tag -d X.Y.Z && git tag -s X.Y.Z && git push --tags.
The published release is unchanged in shape: the three library jars first, then — once GitHub has indexed their digests — the repackaged flame executables, the polyglot bootstrap and the installer, with the script refusing to upload an executable that inlined a library instead of referring to the release.
The readme's install line is also corrected to https://propensive.dev/flame, following the hosting change in propensive/.github#16.
Release notes are now generated
Every release's notes are assembled the same way, and the Changes section is built from the body of each pull request merged since the previous tag — the summary paragraph and the user-facing notes that pull_request_template.md has always asked for. What goes in a PR body is now what users read on the release. A hand-written overview can be added as doc/notes/<version>.md; it is optional and nothing gates on it.
Show a prompt marker before the REPL's field, and import confirmations as notices (#15)
Summary
- Prompt marker: the web REPL's field shows a Powerline `` prompt, in the accent tone while the line reads as Scala and the info tone once it reads as natural language. Settled entries, unknown commands and natural-language lines are echoed past the marker's width (
Blocks.indented), so a line keeps the column it was typed at. - Import confirmations:
Imported foo.*becomesimported foo.*(Repl.messages.imported/importedClause), and the web front-end shows each as a muted notice with the clause highlighted as Scala (Blocks.imported). - Five new tests in
flame_test.scala.
Dependency
etc/refs pins pyrocosm 0.3.0-bbe78f934c26 (b9d0a9e), from the field-prompt branch, which adds Control.Field.Decoration's prompt. That's still open as propensive/pyrocosm#20. Once it merges, this should be repinned to a pyrocosm main snapshot.
Serve the web REPL in Pyrocosm's default theme (#14)
Flame's own web theme is gone: its Zed colours for code now live in Pyrocosm's default theme, so every Pyrocosm tool's pages look alike, and the web REPL takes the default.
Snapshot debt
etc/refs pins Pyrocosm at 0.3.0-dee893e2baaa (propensive/pyrocosm's web-style PR) and Soundness at 0.68.0-b963c9733024 (propensive/soundness#2038). Both must be released, and the pins bumped, before this repository can be. The Pyrocosm snapshot is not yet published; CI will resolve it once it is.
Adopt Pyrocosm's standard command line, through pyrocosm-cli (#13)
Flame now gets its housekeeping from Pyrocosm's new pyrocosm-cli module (propensive/pyrocosm#17): a Flame descriptor (Tool(t"flame", prose, web = FlameWeb)) wraps the unchanged arguments match dispatch in Flame.standard, which handles flame about, flame --version / -v, flame install (now the manpage as well as the completions, --force to overwrite) and flame quit before falling through to flame's own arms, including the flag-first ones (flame --basic, --host, the settings flags).
What goes: the Install subcommand and installCompletions, and Workspace's locator, parser and stat cache, replaced by Flame.repoFile and Flame.repoConfig (flame keeps its typed Config over the shared document, and its own upward walk for the .pyrocosm/flame history directory). The stale duplicate .fume/config.tel goes too; the real one is .pyrocosm/fume/config.tel.
What comes: the version is a META-INF/pyrocosm/flame/version resource the build writes (FLAME_RELEASE_VERSION when a release or snapshot is published, which make release now exports; otherwise the pinned version with the filtered tree hash and -dirty); a user configuration file at ~/.config/flame/config.tel alongside the repository's; and FlameWeb, so that serve and port in a configuration file bring the web REPL up in the daemon on the first invocation and keep it until flame quit. Interactive flame serve is unchanged, with its default port now read from FlameWeb.port. The flag-name collision guard in the tests gains version and force.
Verified on the built launcher (with a private XDG_RUNTIME_DIR, so the installed flame's socket directory was never touched): about, --version, -v, install (and its refusal to overwrite without --force), quit killing the daemon, flame --basic still reaching the REPL prompt, the config-driven web REPL answering on its port and stopping on quit, flame serve, and tab-completion of the standard subcommands with flame's own. Tests: 159/159 after rebasing onto main (an earlier run had one order-dependent failure, d97ea6, which also occurs on main and passes alone).
The pyrocosm pin is the published snapshot 0.3.0-980213367721: a debt, since pyrocosm 0.3.0 must be released and the pin bumped before flame can be.
Configure flair, and pin it as a tool (#12)
.pyrocosm/flair/config.tel checks every source against Consequent Style, with the licence header (now kept in etc/header.txt, extracted from the sources, which all begin with it; one file still said 0.1.0 and is fixed), and measures casts and the imperative constructs; make check runs it with the released flair 0.2.1 pinned in etc/tools. 1032 warnings across 26 files today; CI does not run the check until that is zero.
Run the tests with fume 0.4.0, in CI as locally (#11)
The shared workflow now installs the fume pinned in etc/tools (bumped to 0.4.0) and runs the suites in the test assembly with it, so test_main goes from the CI workflow; make test names the assembly explicitly, as CI does. The duplicate .fume/config.tel goes. Verified locally with make test.
Assets
flame-client, flame-core and flame-web, each attached as <artifactId>-0.3.0.jar, with
its POM and ivy.xml embedded under META-INF/maven/ — the jar alone is enough for a consumer
to resolve it. Depend on this release by pinning it in etc/refs:
propensive/flame 0.3.0
make sync-deps installs the set into a local ivy repository, transitively; see
propensive/.github for the scheme.
Also attached: one flame executable per platform (flame-linux-x64, flame-linux-arm64,
flame-macos-x64, flame-macos-arm64 and flame-windows-x64.exe); flame, the polyglot
bootstrap — a small any-shell script, to be renamed flame.bat or flame.ps1 on Windows, which
downloads the right executable, verifies its checksum, replaces itself and re-invokes; and
install.sh, which https://propensive.dev/flame redirects to. Each executable externalizes
the libraries above, resolving further dependencies from the Soundness and proscala releases and
from Maven Central on first run.