All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Bounded model-original capture observations distinguish worker issuance, body outcomes, owned handles and actual joins. Retained connection views and detached workers cannot certify joined cleanup. This internal observation component does not advertise connected profile qualification.
spec/mep/: the Morphir Extension Protocol contract as a Gleam model, compiled to committed Morphir IR (spec/mep/generated/mep.ir.json) with a drift check in CI (mise run spec:mep,mise run spec:mep-check). It covers the handshake, capabilities and claims, compile, diagnostics and generate messages, and the cancellation and progress notifications from the protocol draft, and documents the pre-1.0 versioning rule and the wire mapping (#964, #960).- The compatibility kit's cases gain
.featuretwins underspec/ir/mck/, beside the existing Markdown kit files;morphir mck checkchecks that a case and its twin stay in step (#946). morphir mck run --engine gherkinruns the kit from its.featurefiles.--engine legacy, which runs the Markdown kit, stays the default for the parity window. The gherkin engine runs the IR suite only, so--engine gherkin --suite metadatais a usage error (#946).morphir mck convertwrites a kit case's.featuretwin from its Markdown source;morphir mck convert --checkchecks an existing twin against that source without writing it (#946).morphir mck report comparecompares two kit reports, for example a Gherkin-engine report and a legacy-engine report. It fails when the record counts differ, and otherwise names the first record index where any field differs. It ignoresdurationMs,startedAtanddriverVersion. A report with norecordsmember is an error (#946).- CI runs a parity step that runs the kit under both engines and compares their reports (#946).
morphir itestreads.featureand.feature.mdexamples, besidescenarios.md(#946).
morphir itestruns onmorphir-bdd'sSuite. Its--tag,--filter,--list,--keep-tempand positionalrootoptions, and itsPASS,FAILand summary line formats, are unchanged (#946).morphir itestruns scenarios, and prints their PASS and FAIL lines, in document order; it used to run them sorted by id.--listis unchanged (#946).- A scenario document that cannot be read no longer fails a run when
--filterleaves it out. Before, every document was checked before selection (#946). - The
scenarios.mdreader now refuses amorphir:assertionormorphir:goldenblock that does not check the command just before it (#946). morphir itestwrites its suite reports (itest.json,itest.xml) to a temporary directory that it removes after the run.--report-dir <DIR>keeps them in<DIR>;MORPHIR_BDD_OUTdoes the same when the flag is not given. It writes nothing into the project it runs in (#946).morphir itest --tag @xis now refused as an invalid tag. It used to match nothing (#946).- The converted
elm/single-fileexample's id is nowelm/single-file#compile-and-install(#946).
- Breaking: MCK Markdown case files,
morphir mck convert,morphir mck run --engine, and themck:paritytask. The Gherkin.featurekit is the sole IR case source; managed kits require driver contract 2 (#946). - Breaking: notebook scenarios (
scenario.ipynb) are no longer supported. Convert one toscenarios.feature.md; notebook support returns with the VFS work (#946). - Breaking: the workspace spelling
kind: notebookis removed; writekind: inline(#946).
0.4.0-beta.9 - 2026-09-25
- Early-access V4.1 linked metadata in single-file JSON, YAML and Ion. The
morphir metadatacommands query facts, export their contexts, check document structure, and validate assertions against native declarations from a freshly authenticated provider Library. The shared MCK has a focused metadata suite, and V3/V4 decorator sidecars remain supported (#999).
- The
morphir-rustpin moves to8c10fe6(finos/morphir-rust#271).compile,generate,extension listand the playground catalog resolve providers through themorphir-hostregistry, overNativeSourcebuilt-ins andInstalledSourceinstalled extensions. The UI workspace provider starts its installed guest throughInstalledSource(#963, #959). - The workbench reuses guests through a
morphir-hostPoolinstead of the daemon session actor. As before, a guest is stopped in order after five minutes without a call. A guest is now replaced when an installed extension is reinstalled at the same version. A result that does not decode or fails the host's checks is reported at once and its guest is stopped in order, without a retry on a fresh guest (#963, #959). - Transport failures that begin as I/O or JSON errors read
IO error: ...orJSON error: ...again, not theExtension error: IO error: ...wording noted under 0.4.0-beta.8 (#963). - Playground error texts: a rejected call now reads
Provider '<provider>' rejected '<method>': ..., the same text asmorphir compile, instead offailed during '<method>'. A lost guest's message no longer includesExtension session is no longer available:and can end with; transport state is indeterminate(#963). - The published
morphir-scala-elmpin moves tov0.5.0-M10. That release answersmorphir.extension.describeand ships a version-2 bundle descriptor,morphir-scala-elm-0.5.0-M10.bundle.release.json(finos/morphir-scala#1081).extension installnow probes it bydescribe, where earlier releases fell back to a session, and the host compatibility suite expects that. A version such as0.5.0-M10is a prerelease, so install it with--version; channelstabledoes not select it (#921). - The
morphir-rustpin moves to58c2bc4(finos/morphir-rust#267 and #273). It addsmorphir-bdd, one cucumber-rs runner for Morphir's Gherkin suites, besidemorphir-gherkin, the Gherkin document model the pin already holds (finos/morphir-rust#270, #946). - The
morphir-rustpin moves to8858332(finos/morphir-rust#275).morphir-daemonis now a client ofmorphir-host, and themorphir-hostPoolstops idle guests and reports each failure kind on its own (#959).
0.4.0-beta.8 - 2026-09-24
- An installed extension's claims keep
multiDocumentand the other nested capability members the version-2 descriptor supplies.extension installrecorded them in the catalog but the host rebuilt a provider's capabilities from the flat members, so a frontend that claimed multi-document compile was run one document at a time. The install lock now pins the supplied claims atindex.claims, so a later catalog edit cannot change them; a lock written by an earlier beta has no pin and falls back to the catalog (finos/morphir-rust#266, #921).
- The
morphir-rustpin moves to04ababf(finos/morphir-rust#265, #266, #268 and #269).extension-claimsprints a built guest's capability claims, and the WASM extension bundles carry version-2 descriptors with those claims. - The published WASM bundle pins move to the releases with version-2 descriptors:
extension/avro/v0.2.0,extension/openapi/v0.2.0,extension/python/v0.4.0andextension/rust/v0.3.0. The host records their claims in the catalog withclaimCheckunchecked, because it never probes a WASM artifact. These bundles need Morphir CLI0.4.0-beta.7or later to publish (#921). - The CLI's install probe, publish describe, and one-shot compile, generate and workspace discovery calls for configured, installed and native MEP providers now run through
morphir-hostsessions; the workbench session pool is unchanged. A provider that returns an invalid method result, such as an artifact path outside the output directory, is now shut down in order instead of being killed. Transport failures that begin as I/O or JSON decode errors now readExtension error: IO error: ...(orExtension error: JSON error: ...) instead ofIO error: .... Themorphir-rustpin moves to3b4e4fe(finos/morphir-rust#263, which addsmorphir-host-native; #963, #959).
0.4.0-beta.7 - 2026-09-24
extension installno longer refuses an extension that answersmorphir.extension.describewhen it is installed from a version-1 index record. The host converts a version-1 record into claims with its own defaults for members the flat format cannot express, such asincremental, and compared thedescribeanswer with them exactly. It now checks that answer the way it checks a session: identity, protocol, capability kinds and the flat members. Claims an extension supplied are still checked exactly. This affected the Elm extensionv0.4.0through its version-1 descriptor (finos/morphir-rust#261, #921).
- Breaking for tooling that asserted
3.1.0is refused: the CLI and the kit now read IR format3.1.0. The reference support table and the morphir-rust table move from[3.0.0,3.1.0),[4.0.0,4.1.0)to[3.0.0,3.2.0),[4.0.0,4.1.0), so"3.1.0"is accepted and3.2.0is refused withunsupported_format_version_minor(kbmorphir-irdecision 0018, #970). The reference implementation is morphir-rust finos/morphir-rust#255, #256, #257, #258 and #260, already in the pinned submodule. - The published Elm extension pin moves to
extension/elm/v0.4.0. That release answersmorphir.extension.describe, soextension installprobes it bydescribe, and it also ships a version-2 process bundle: raw executables, their.sha256files andmorphir-elm-extension-0.4.0.bundle.release.json, whichextension repository publish --bundleaccepts once renamed torelease.json(finos/morphir-elm#1305, #921). The host compatibility suite expects thedescribeprobe for Elm and the session fallback formorphir-scala-elm. The reference Elm examples (mise run examples:prepare-elm) now require Elm extension0.4.0. - Capability statements are now capability claim sets made of claims (kb
morphir-extensionsdecision 0007, #921). The version-2 formats move to the next draft: a claim set carriesclaimsVersion0.1.0-draft.2, and a bundle descriptor artifact, index record or installed catalog entry holds it inclaims, withclaimCheck(probedorunchecked) in place ofstatementSource(probedordeclared) andschemaVersion2.0.0-draft.2. This CLI still reads draft.1 records anddescriberesponses and converts them, and writes only draft.2, so a Morphir home or index that this CLI wrote version-2 records into is not readable by0.4.0-beta.6and earlier. An installed catalog that holds any entry with claims is written as2.0.0-draft.2, which those CLIs cannot read at all, version-1 entries included; a catalog of version-1 entries only stays1.0.extension installandextension listprintClaims: uncheckedorClaims: probed (...), and--no-probesays the claims were not checked. Themorphir-rustpin moves toe479dc9(finos/morphir-rust#253).
- IR format
3.1.0, a minor revision of the classic IR (#970, kbmorphir-irdecision 0018). A v3 distribution may be aSpecsdistribution, which publishes a package's specification without its definitions; its own modules must be module specifications, and aSpecsthat declares a release below3.1.0is refused withspecs_before_3_1in JSON, YAML and Ion. A v3 distribution may also be stored as a JSON or YAML document tree, which uses the v4 tree layout with classic v3 payloads and says"3.1.0"in every file. Writers emit the lowest version that fits, so a single-file v3Librarystill says3.morphir migrate --target-version v3 --output-layout vfs --output-format json,yamlorionwrites a v3 tree, and every tree format's manifest decides the version on read. A migrated v3Specsbecomes a v4Specswith format version4. The v3 JSON Schema acceptsSpecs, anddocs/spec/ir/schemas/v3/document-tree-files.mdspecifies the v3 tree. - The draft Ion IR codec covers v3 dependency specifications and every v4 distribution kind and node the draft spells: specs and application distributions with entry points, every value expression and pattern, custom and derived types, and external and incomplete bodies (finos/morphir-rust#248). It also covers v4 attributes, Morphir annotations on specifications, and document literals, whose numbers keep their lexemes as an Ion int, an Ion decimal, or
number::"<lexeme>"(finos/morphir-rust#251).morphir ir migrate --target-version v3 --output-layout vfs --output-format ionwrites a v3 Ion tree, andgenerate -ireads one.ionVersionstays0.1.0-draft.1(#946).
0.4.0-beta.6 - 2026-09-24
- Early-access local Library authoring and publication (#945): the CLI compiles a Gleam model into a verified dependency-free classic V4 Library, signs its release with an explicit local Ed25519 seed, and publishes it to an explicitly initialized local registry. Publication requires caller-signed TUF metadata and an exact predecessor, and runs on macOS only; other platforms await qualification. A separate project can initialize public trust, resolve, restore, generate and compile the published Library without a signing key. See the
helloexample inexamples/package/local-library-publish. - The CLI identifies itself to extensions with
"kind": "cli"ininitialize.host, on every initialization path, independently of its name label (#954, finos/morphir-rust#235). - Draft Amazon Ion IR format,
ionVersion0.1.0-draft.1, for IR v3 and v4 (#946).ir.format = "ion"writesmorphir-ir.ion, one datagram of annotated elements with S-expression values. Withir.layout = "document-tree"it writes a tree whose root ismanifest.ion. Each tree file holds the same elements, and the path supplies the package, module and name. The draft spelling can still change before a release. The compatibility kit's profiles stayjsonandyaml. The design is indocs/design/draft/ir/ion.mdand the kb notemorphir-ir/ion-ir-format.md.
- The CLI sends every frontend the current compile envelope,
sources: { root, documents }. Process and WASM frontends no longer receive the legacy top-leveldocumentswithoptions.sourceRootUri, andcompile_wire_requestis gone. A process or WASM frontend released beforesourcesexisted no longer compiles with this CLI: that isextension/python/v0.2.0and earlier,extension/rust/v0.1.0, andmorphir-scala-elmv0.5.0-M08and earlier. Useextension/python/v0.3.0,extension/rust/v0.2.0,morphir-scala-elmv0.5.0-M09and the Elm extensionv0.3.1or later (#921). - The published extension pins move to frontends that accept the
sourcescompile envelope as well as the legacy top-leveldocuments:extension/python/v0.3.0,extension/rust/v0.2.0andmorphir-scala-elmv0.5.0-M09. With the Elm extensionv0.3.1, which already reads both, every pinned frontend can takesources, so the CLI can stop sending the legacy envelope (#921).INSTALLING.mdnames the Pythonv0.3.0bundle.
0.4.0-beta.5 - 2026-09-23
morphir extension repository publish --bundleaccepts a version-2 process bundle:release.json, one raw executable per platform and each one's.sha256file. Publish checks every digest and statement before running anything, runs the artifact for this platform to check its capabilities, and writes index records that keep each declared statement and record whether it was probed. Archives, mixed WASM and process bundles, and platform ABIs the index cannot represent are refused (kbmorphir-extensionsdecision 0003, #921).morphir extension installprobes the selected process artifact before it commits: it runsdescribe, or a session when the extension does not implement it, and refuses the install when the answer disagrees with the declared statement, leaving nothing behind.--no-probeskips the probe. Install andextension listshow the capability kinds and whether the statement was probed (kbmorphir-extensionsdecision 0003, #921). An install from a version-1 index record keeps the version-1 catalog shape, so an older CLI can still read a shared Morphir home.
- Extension formats follow the capability-statement compatibility rules (kb
morphir-extensionsdecision 0004): the bundle descriptor, index record and installed catalog ignore unknown members unless they are listed as critical, carry SemVer schema versions, and old records still load. An extension'srequires.hostis checked against this CLI's version. Themorphir-rustpin moves to689df2a(finos/morphir-rust#223, #224, #225). - Every Elm provider reads an explicit package name in a selection of files with both
.and/as segment separators, and reports one normal form:--package-name My.Package, or a borrowed manifest namedDocumentation.Decoration, now works with every Elm provider and namesmy/packageordocumentation/decoration. The IR package path does not change. The pins move tomorphir-rustadf03d8,extension/elm/v0.3.1andmorphir-scala-elmv0.5.0-M08(kbmorphir-extensionsdecision 0005). - The MEP draft assigns
-32014(not initialized) to a request that is not allowed beforemorphir.initializeor after shutdown, and a statement built from adescribefallback session holds only what the session reports (kb decision 0006).
0.4.0-beta.4 - 2026-09-23
- The native package MVP profile runs 70 required local Library cases across fresh trust, metadata refresh, full-lock resolve and restore, scoped update, and refusal paths.
morphir mck package mvp-runwrites one versioned prerelease JSON report;mvp-report checkindependently verifies the complete inventory, andmvp-report renderwrites a standalone offline HTML view. - Published CLI acceptance on all six native targets runs the downloaded beta.4 binary against those 70 cases and both signed local Library examples under operating-system network denial. It retains the JSON/HTML reports, example logs, and negative checking evidence alongside the unchanged 80 integrity and 78 resolution cases.
morphir compile --inputaccepts files from any language whose provider declares their suffix, and repeats: several files from one directory compile together. The provider synthesizes the project through workspace discovery, naming the package and exposing every selected module;--package-nameis required for more than one file (#917).morphir generate --from-partial-compileconsumes a compile of selected files. Such a compile is marked in its task record, and an implicitgeneraterefuses it otherwise, because its IR need not match the project's declared exposure.
- There is one compile route. The CLI's single-file Elm route, its Elm module-header scanner and its
morphir-<language>default are gone: the language comes from--language, the configuration or the suffix a provider declares, and every restriction comes from a declared capability, with refusals naming the provider. A compile of selected files negotiates the IR version with its provider, so--ir-version 4now works with a provider that serves it; without the flag it keeps the oldest release the provider serves. A provider that does not declarefrontend.multiDocumentis refused a multi-file selection before it is invoked; a project compile still submits its whole source set. morphir gleam roundtripwith only files as input and no--configor--projectis refused before compiling, because its generate half needs a project.- The published Elm extension pin moves to
extension/elm/v0.3.0, which serves workspace discovery. - The published
morphir-scala-elmpin moves tov0.5.0-M07, which serves workspace discovery, so its CI check compiles a single file again (finos/morphir-scala#1070). - Package integrity and resolution CI now use the native Morphir CLI against independent TypeScript and Rust adapters. TypeScript adopts qualified beta.3 for its installed-adapter checks; the replaced package runner, runner APIs and temporary parity tooling are retired. Independent package implementations, draft.3 helpers and frozen acceptance evidence remain.
0.4.0-beta.3 - 2026-09-21
morphir mck package run --kit <path> --adapter <exe>executes the existing package integrity and deterministic resolution contracts. It preserves all 80 draft.1 and 78 draft.2 cases, corpus hashes and draft reports. Both independent adapters pass with zero required skips. Package managed-kit acquisition and HTML rendering are not part of this command.- Packaged and published CLI acceptance now includes both package suites through fixed adapter recordings, complete ordered report comparisons and explicit copied package inputs. The existing six-target published-release workflow runs these checks with operating-system network denial. Live adapter parity remains a separate interoperability gate.
- The global
--no-bannerflag,MORPHIR_NO_BANNERenvironment variable and[cli] banner = falseconfiguration suppress the help/version banner. Precedence is flag, environment, then configuration.
- IR consumers now use the native CLI, and the replaced TypeScript IR runner APIs and future runner binaries have been retired. Adapters, codec tests and historical assets remain available. Package runner retirement follows qualified release adoption under #852; the existing TypeScript package gates remain available during that migration.
- Project compilation resolves configuration once during session startup and passes it to the compiler, preserving explicit project/config selection and single-file compilation rules.
- MCK adapter deadlines cover blocked stdin writes and shutdown as well as response reads, preventing a non-reading adapter from hanging the runner.
- Published-release qualification accepts the CLI version banner and retains Linux evidence after network-isolated execution. Windows release checkouts enable long paths before fetching fixtures.
morphir-opa(and itsregorusdependency) is now behind aregoCargo feature onmorphir, enabled by default. A Windows contributor whose Visual Studio install lacks the "MSVC v143 - VS 2022 C++ x64/x86 Spectre-mitigated libs (Latest)" component can build, test, and lint withcargo build --no-default-features -p morphirinstead of hitting amsvc_spectre_libsbuild-script panic; the only loss ismorphir eval's Rego provider and itest's Rego-backed assertions. Documented in INSTALLING.md and DEVELOPING.md (#886)
0.4.0-beta.2 - 2026-09-20
- Native IR compatibility tooling through
morphir mck, backed by the reusablemorphir-mcklibrary.check,coverage, andschema checkvalidate cases, vocabulary coverage, schemas, JSON and protocol examples, and accepted or rejected IR fences offline without Node, Bun, Git, or external schema validators. morphir mck run --adapter <exe>drives an explicit implementation adapter against the embedded kit, a checkout, or a verified vendored snapshot. It supports case filters, strict skip handling, bounded adapter sessions, and process-tree cleanup on failure, timeout, or cancellation.- Consolidated
2.0.0-draft.1JSON reports include driver, kit, and adapter provenance with the case results.morphir mck report checkvalidates a report against the selected kit and an allowed-failing baseline;report render --format htmlproduces a self-contained offline HTML view. The report contract remains a draft. morphir mck kit status,kit vendor, andkit updateidentify and manage pinned kit snapshots. Embedded and local sources work offline; GitHub acquisition requires a full commit revision. Themck-kit.lock.jsonmanifest records source identity, per-file SHA-256 hashes and kit digests. Managed snapshots reject missing, altered, or extra files; updates stage and verify replacement contents before installation.- Release archives for all six supported targets must pass the native MCK smoke gate before publication. The gate extracts the packaged CLI, uses a fresh directory and empty tool-runtime path, and exercises vendoring, authoring checks, an explicit native replay adapter, report adjudication, and HTML rendering.
- Parent IR validation, coverage, execution, and reporting gates now use the native CLI. TypeScript tooling remains available for migration parity, package suites, and consumers awaiting IR-4 adoption. Vocabulary generation and protocol-copy parity remain checked against the pinned TypeScript source. See the migration sequence.
- Interrupted kit downloads report how many bytes arrived and preserve the underlying error. Timeouts have an explicit diagnostic; acquisition limits and cleanup behavior are unchanged.
0.4.0-beta.1 - 2026-09-18
First beta of the Rust Morphir CLI. This release follows 0.4.0-alpha.7; no 0.4.0-alpha.8 was
released, and the changes planned for it ship here.
- Breaking — IR document-tree layout:
morphir migrate --output-layout vfs, and project-modemorphir compilewith[ir] layout = "document-tree", write the layout the document-tree page specifies and MCK cases document-tree-0001 to 0009 pin:manifest.<ext>at the root carryingpathBudgetand listing dependencies by name,pkg/<package path>/<module path>/module.<ext>beside<stem>.type.<ext>and<stem>.value.<ext>, and each dependency underdeps/<package path>/@/<module path>/. AnApplication's dependencies now have a home in the tree instead of being refused. A tree written by an earlier release is refused withmorphir::ir::document_tree::missing_memberand the guidancethis tree predates 0.4.0-beta.1; regenerate it with morphir migrate; the transport's ownname_mismatchandmodule_path_mismatchcodes are replaced bymorphir::ir::document_tree::invalid_distribution_shape. See Document-tree layout in 0.4.0-beta.1 (decisions 0012 and 0015; finos/morphir-rust#160) - IR v4 legacy spellings: the
legacy_spellingwindow stays open in this release. Files with the older member names still decode with a warning. A later release refuses them; rewrite affected files withmorphir migratebefore then. - Python extension: use the
extension/python/v0.2.0bundle with this release. Theextension/python/v0.1.0bundle requiresexposedModulesin every compile request and refuses a project that configures none withmissing field exposedModules - Update Rust dependencies, including
cucumber0.23,getrandom0.4,tokio-tungstenite0.30,usage-lib6.9 anduuid1.26 (#638, #752, #845)
- Native Elm provider (opt-in):
morphir compile --extension morphir-elm-nativecompiles a project's Elm type declarations to IR v3 or v4 with the built-in native Elm frontend from finos/morphir-rust#173;--input File.elm --extension morphir-elm-nativecompiles one file. With no--extension, Elm still resolves to themorphir-elmprocess extension. The native provider is types-only: value declarations are skipped with a warning (#848) - Frontend provider in configuration:
[frontend.<language>] extensionselects the frontend provider for a project, for example[frontend.elm] extension = "morphir-elm-native", so--extensionis not necessary on every run. Precedence is the--extensionflag, then the configured id, then the language's default provider. A blank or non-string value is a configuration error that names the key, and an id that does not provide the language is refused. Single-file compilation reads the key only with--configor--project(#854) - Incremental compile cache: for a provider that advertises
frontend.incremental, the CLI stores module results under.morphir/cache/compile/<extension>/<package>/and sends them back as thebaselineof the next compile, so unchanged modules are not recompiled. A corrupt or mismatched cache is ignored.--no-cacheskips the read and the write (#848) - Rust extension: project-mode
morphir compilediscovers.rssources, so the installedmorphir-rustWASM bundle (finos/morphir-rustextension/rust/v0.1.0) compiles the documented Rust subset to IR v3 or v4 and generates Rust. Earlier releases installed the bundle but refused compilation withUnknown language: rust. CI publishes, installs and runs the bundle through the CLI (#840) - The development Python extension supports typed function calls, same-package function imports, unary
Callableannotations and captured lambdas in IR v3 and v4. Packaged CLI tests cover compilation, generation and workspace model loading for these functions. - Project compilation honors
[ir].format_versionand--ir-versionfor v3 or v4. The new Python extension bundle supports v3 compilation and generation; v3 artifacts use JSON/YAML single-file storage. - Document-tree input spellings: a
manifest.ymlroot is recognised and read as a YAML document tree alongsidemanifest.yaml(it is never written back as.yml).morphir generate -iand every other path that probes a directory now ask the transport which manifests count, so the two agree
morphir extension repository init <name>accepts a bare relative path such asrepo; it failed withfailed to access : No such file or directory(finos/morphir-rust#175)- Project-mode
compileandgeneratehonor--projectand resolve sources from the selected member. Configured module exposure reaches the frontend, including private Python modules. Connected workspace model loading follows compile records and their JSON/YAML file or document-tree artifacts, including output-root overrides; a failed compile cannot reopen a stale installed model. - Reading or rewriting a document tree never follows a symlink or junction, so neither can reach outside the tree root; a manifest that is itself a link is refused with
morphir::ir::detection::linked_manifestrather than reported as a missing manifest
- Python extension bundles:
morphir extension repository publishpreserves frontend languages and backend targets in the Python extension's release descriptor. Install the separately releasedmorphir-pythonWASM bundle to compile the supported Python ADTs, fixed tuples and conditional functions to IR v4 and generate Python. CI verifies publication, installation and offline compilation/generation through the CLI.
- Update
morphir-rusttob4566e5, adding Python extension packaging and frontend-aware publication (finos/morphir-rust#158), plus fixed tuples, conditional function bodies and arbitrary-precision integer literals (finos/morphir-rust#157). The Python extension is built and installed separately. - IR format-version support tables: format-version support tables are intervals (
[3.0.0,3.1.0),[4.0.0,4.1.0)); a later patch of a supported minor is read, a later minor is refused withunsupported_format_version_minor, which replacesunsupported_format_version_revision(decision 0016) - IR v4 legacy spellings: the member names and shapes the Rust CLI wrote before the v4 vocabulary settled (
attrs,argumentType/arg,result,thenBranch/elseBranch,subject/fieldName,valueName/valueDefinition/inValue, the single-targetExternalBody, and a few pre-decision structural shapes) decode with alegacy_spellingwarning starting in 0.4.0-alpha.7 and are refused in a later release. See Files written by CLIs before 0.4.0-alpha.7 for the full table and themorphir migratecommand that rewrites affected files. - YAML output style:
morphir migrate, and project-modemorphir compilewith[ir] format = "yaml", write the v4 YAML profile's canonical style — flow sequences where no mapping appears inside them, quoting only where a plain spelling would change meaning, member order as the encoder writes it, one trailing newline. Single-filemorphir compilealways writes classic v3 JSON regardless of[ir]. Files written by earlier versions still read. See YAML output style (finos/morphir-rust#153) - YAML diagnostics: the YAML codec's private
morphir::ir::yaml::*names are replaced by the conformance kit's codes (duplicate_keyandduplicate_format_versionbecomeduplicate_member;alias_not_allowed,unsupported_tagandmerge_key_not_allowedbecomeunsupported_yaml_feature;multiple_documentsbecomesinvalid_yaml;non_finite_numberbecomesinvalid_literal;ambiguous_scalaris gone because an unquoted timestamp-like scalar is a string). See the rename table in the migration guide (finos/morphir-rust#153)
morphir config showprinted serde_json's internal number representation instead offormat_version = 3- The install ledger wrote backslash paths on Windows, so a second
morphir installtreated its own output as foreign content
First alpha of the Rust Morphir CLI with run-time extensions. The previous alpha, 0.4.0-alpha.5, only moved the release pipeline to the Rust binary.
- Extensions:
morphir extensionmanages Morphir Extension Protocol (MEP) providers.install,update,uninstall,list, andsearchacquire verified process and WASM extensions from configured repositories with SHA-256 content verification, exact lock files, and offline activation (#729, #765, #770) - Extension repositories:
morphir extension repositoryadds, lists, enables, disables, inspects, verifies, and removes repositories, andinitpluspublishauthor a local repository from a release bundle (#765, #770) - WASM backends:
morphir generateroutes to installed WASM backends. Apache Avro (avro), OpenAPI (openapi), and JSON Schema (json-schema) targets are served by themorphir-avroandmorphir-openapiextensions released from finos/morphir-rust. Backend options come from[codegen.<target>]inmorphir.tomland repeatable--option KEY=VALUEflags (#745, #766) - Compile providers:
morphir compilecompiles Elm through an installed Morphir Elm or Morphir Scala process extension, selectable with--provider(#726, #733, #736) - Gleam: the Gleam backend ships as a built-in provider
- Migrate:
morphir migrateconverts Morphir IR between format versions, with YAML as the primary output format (#720, #732) - Knowledge base:
morphir kbchecks, scaffolds, indexes, syncs, and renders Open Knowledge Format bundles (#722) - Desktop:
morphir desktopacquires, installs, and launches verified Morphir Desktop packages, including unsigned local packages, with correlated launch logs (#741, #746, #773, #777, #779, #782, #784) - Playground:
morphir playgroundserves the vendored Playground client over the Morphir Playground protocol and reuses one extension session across invocations (#778, #783) - Web workbench:
morphir uiserves the connected web workbench with workspace navigation and the Insight and XRay views (#756, #757, #790) - Cache:
morphir cache statusandmorphir cache cleaninspect and prune the content-addressed store (#753) - Home:
MORPHIR_HOMErelocates the Morphir home directory (#712) - Config: secret values can come from commands and the system keyring (#710)
- Out directory: every task writes under
.morphir/outand records a task result;-oinstalls the declared outputs into the requested directory (#789)
- Breaking: compile and generate always write under the workspace out root (
<workspace>/.morphir/out/<module>/<task>.dest) and write a<task>.jsonresult record.-onow installs the task's declared outputs to the given directory after the run instead of redirecting the task; on the single-file Elm compile path,-oused to take a file path and write the IR there directly, and now takes a directory like every other command.--out-dirandMORPHIR_OUT_DIRrelocate the root. Config:[workspace].output_diris now[workspace].out_dir(default.morphir/out),[project].output_directoryis removed,[ir].modeis replaced by[ir].layoutand[ir].format(ir.modestill works for one release as a deprecated alias, with a warning). Generate reads compile output through the record, so[ir]YAML and document-tree storage now flow through to backends, andgenerate -ialso accepts a compile-output directory in addition to an IR file or a document-tree directory. The single-file Elm compile path still always writes classic v3 JSON regardless of[ir]; it now warns when a given--config's[ir].layoutor[ir].formatasks for something else, since those settings do not apply to it.output_pathin a command's JSON result is the task's canonical.destdirectory for every command, not an artifact file inside it. (#789) - Morphir IR v4 name canonicalization and initialism encoding follow the accepted conformance corpus (#744)
- The v3 and later
formatVersioncontract is defined and enforced (#738) - The CLI reference under
docs/cliis generated from the CLI usage spec and checked in CI (#714)
- Installed extensions no longer fail at initialize when the display name in the repository record differs from the name the guest reports.
extension repository publishderived "Morphir Openapi" from the identifier while the guest reports "Morphir OpenAPI", so every published OpenAPI bundle failed with "initialization metadata disagreed with discovery". A release bundle may now declare itsnameinrelease.json
morphir-liveis retired. The web workbench inmorphir uireplaces it (#739, #740)
- Release workflow builds the CLI for six targets and uploads only assets whose checksum changed (#703, #704)
- CI builds the Morphir Elm and Morphir Scala process extensions and runs the installed-extension integration tests against them; it now also builds the Avro and OpenAPI WASM guests and runs the WASM backend tests (#754)
- The release pipeline now packages the Rust
morphirCLI for Linux, macOS, and Windows on x86_64 and aarch64 (#703, #704)
0.4.0-alpha.4 - 2026-01-13
- CLI Logging Integration: Structured logging now available throughout CLI (#555)
- Global logging flags:
--log-level,-v/--verbose,-q/--quiet,--log-file - Log level resolution: CLI flags > Environment variables > Config file > Defaults
GetLogger()function for commands to access configured loggervalidatecommand updated as reference implementation
- Global logging flags:
- Pipeline Logging Support: Logger propagation through pipeline execution (#555)
- Added
Loggerfield topipeline.Context WithLogger()method for immutable logger propagation- Default noop logger when not configured
- Added
- Upgraded charmbracelet/lipgloss to v2.0.0-beta.3 (#556)
- Updated all imports to
github.com/charmbracelet/lipgloss/v2 - Using
compat.AdaptiveColorfor backward-compatible adaptive colors - Theme colors now use
lipgloss.Color()withcolor.Colorinterface
- Updated all imports to
- Updated all internal module dependencies to v0.4.0-alpha.3
- Enhanced release validation with module consistency checks (#554)
- Validates all modules have corresponding
go mod tidyentries in.goreleaser.yaml - Checks that hook scripts referenced in
.goreleaser.yamlexist
- Validates all modules have corresponding
- Added new Go module checklist documentation in DEVELOPING.md (#554)
- Workspace setup now resilient to unpublished module versions
go work syncfailures no longer block workspace setup- Enables CI to work with release PRs that bump cross-module versions
- External consumption test now handles cross-module release changes
- Detects release branches and allows expected cross-module dependency failures
- Provides clear messaging when code uses unreleased internal module features
0.4.0-alpha.3 - 2026-01-13
- Structured Logging: New
pkg/loggingmodule with zerolog wrapper (#549)- Logger type with functional options pattern (
WithLevel,WithFormat,WithFile) - Multi-writer support for simultaneous stderr and file logging
- Configurable log levels (trace, debug, info, warn, error, fatal, disabled)
- Text format (colored, human-readable) and JSON format for log aggregation
- Log files written to
.morphir/logs/directory Noop()logger for testing and disabled logging scenarios
- Logger type with functional options pattern (
- Removed
-vshort flag from--versioncommand (reserved for future--verboseflag) - Use
morphir --versionormorphir versionfor version information
- Migrated mise tasks to TypeScript/Python with pinned tool versions (#548)
- Tasks now use Bun for TypeScript execution
- Improved cross-platform compatibility
- Better error handling and output formatting
- Updated charmbracelet/lipgloss dependency to v2 (#546, #547)
0.4.0-alpha.2 - 2026-01-13
- Decoration System: New decoration infrastructure for metadata enrichment
morphir decorateCLI command for applying decorations- Type registry for decoration types with validation
- BDD tests for decoration workflows
- Toolchain Integration Phase 2: Major expansion of toolchain adapters
- Go Toolchain Adapter: Complete Go code generation support (#529)
morphir golang makecommand to generate Go modules from IRmorphir golang buildcommand for full IR→Go pipeline- IR to Go module/workspace generator (#515)
- Comprehensive tests and fixtures (#524)
- WIT Toolchain Adapter: WebAssembly Interface Types Phase 2 (#526)
- morphir-elm Integration: NPX backend for morphir-elm tooling (#530)
- Integration tests validating morphir-elm interoperability (#534)
- Toolchain Enablement Design: Framework for toolchain discovery and enablement (#538)
- Go Toolchain Adapter: Complete Go code generation support (#529)
- Workflow Planning System: New workflow orchestration capabilities (#533)
- Workflow plans with dependency resolution
- Workspace doctor command for environment validation (#531)
- Website Improvements:
- Upgrade Docusaurus from 2.4.3 to 3.9.2 (#523)
- Contributing companies panel (#514)
- Restructured documentation hierarchy for newcomers (#379)
- Decorations CI issues (#541)
- Docusaurus config for morphir.finos.org deployment (#517)
- Updated lipgloss dependency to v2 (#512)
- Updated npm to v19 (#444)
- Updated TypeScript to ~5.9.0 (#525)
- Updated doublestar to v4.9.2 (#490)
- Added golangci-lint to mise tools
- Comprehensive documentation improvements and tooling (#527)
- Security dependency updates for website
0.4.0-alpha.1 - 2026-01-08
- WIT Pipeline (CLI Preview): WebAssembly Interface Types support for Morphir
morphir wit makecommand to compile WIT files to Morphir IRmorphir wit gencommand to generate WIT from Morphir IRmorphir wit buildcommand for full WIT→IR→WIT pipeline- JSONL batch processing mode for streaming/CI workflows (
--jsonlflag) - Type mapping infrastructure with diagnostics for lossy transformations
- WIT parser adapter and emitter with round-trip support
- BDD tests with scenario outlines for comprehensive coverage
- Virtual File System (VFS): New
pkg/vfsmodule for filesystem abstraction- Core VFS implementation with virtual paths (
VPath) - Traversal helpers for entry tree manipulation
- Shadowing support for overlaying file systems
- Sandbox policy hooks for write operations
- Path manipulation helpers
- Core VFS implementation with virtual paths (
- Task Execution Engine: New
pkg/taskmodule for build orchestration- Task/target execution with dependency tracking
- Pipeline integration for task configuration
morphir task listcommand to display configured tasks
- Pipeline Enhancements: Major improvements to
pkg/pipeline- Core pipeline types and composition framework
- Validation step with improved diagnostics
- Comprehensive unit tests for composition and error handling
- Document Processing: New
pkg/docling-docmodule- Functional document processing with efficient builder pattern
- BDD tests integrated into release process
- Jupyter Notebook Support: New
pkg/nbformatmodule- Support for reading and processing
.ipynbfiles
- Support for reading and processing
- IR Visitor Framework: New visitor pattern for Morphir IR
- Type and Pattern traversal helpers
- Extensible visitor infrastructure
- Type Mapping Infrastructure: New
pkg/bindings/typemapmodule- Registry for bidirectional type mappings
- Support for multiple binding targets (WIT, Protocol Buffers, etc.)
- Migrated task runner from Justfile to
misetasks across scripts, docs, and CI - Removed outdated morphir-elm subtree and related Elm code
- Upgraded Docusaurus from 2.0.0-beta.15 to stable 2.4.3
- Updated lipgloss dependency to v2
- Added CLI Preview documentation for v0.4.0-alpha.1
- Improved code coverage documentation and module tracking
- Added module and package documentation for
pkg/models
- Comprehensive code coverage and test reporting in CI/CD
- Node.js 24 configured for Docusaurus website builds
- Updated GitHub Actions (checkout v6, artifact actions, create-issue-from-file v6)
- Security dependency updates for website
0.3.3 - 2026-01-05
morphir aboutcommand: Display version, platform information, and embedded changelog- Shows version, git commit, build date, Go version, and platform details
--changelogflag displays full embedded CHANGELOG.md with colorful markdown rendering by default--no-colorflag andNO_COLORenvironment variable support for plain text output--jsonflag for programmatic access to version information- Embedded CHANGELOG synced automatically during build process
- Glamour-powered markdown rendering with automatic dark/light theme detection
- Install script enhancements: Support for installing specific versions
install.sh <version>andinstall.ps1 <version>now accept version argument- Still defaults to latest release if no version specified
- Downloads pre-built binaries from GitHub releases (no Go required)
- Release script CI wait logic: Improved automation and reliability
- Now actively polls and waits for CI to complete (10 minute timeout)
- Shows progress indicators during wait
- Prevents releases when CI is still running or failed
- Reduces manual intervention needed for releases
- Build process: CHANGELOG.md now automatically synced to cmd directory
- Added
sync-changelogmise task with dependency tracking - GoReleaser hooks updated to include changelog sync
.gitignoreupdated to exclude generatedcmd/morphir/cmd/CHANGELOG.md
- Added
0.3.2 - 2026-01-05
- CRITICAL: Remove replace directives from source code for go install compatibility
- Removed all
replacedirectives from cmd/morphir/go.mod - Removed all
replacedirectives from pkg/tooling/go.mod - Removed all
replacedirectives from tests/bdd/go.mod go install github.com/finos/morphir/cmd/morphir@v0.3.2now works correctly
- Removed all
- Documented workflow trigger limitations for re-pushed tags
- morphir-developer skill: Comprehensive development workflow assistant
- go.work management and verification
- Branch/worktree setup with issue tracking
- Pre-commit checks and best practices
- Integration with beads and GitHub issues
- TDD/BDD workflow guidance
- Release automation script:
scripts/release.shfor automated releases- Complete pre-flight checks
- Automated tag creation and pushing
- Workflow triggering and monitoring
- Post-release verification
- go install compatibility testing
- Workspace setup scripts: Dynamic go.work configuration
scripts/setup-workspace.shfor Linux/macOSscripts/setup-workspace.ps1for Windows- Automatically discovers all Go modules
- Used by CI and local development
- CI enhancements: go.work setup for all build/test jobs
- All CI jobs now use go.work for local module resolution
- External consumption test for release PRs
- Verifies module versions are correct before release
- Development workflow: Use
go workfor local development instead of replace directives - Release process: Source code in tags no longer contains replace directives
- Release process: Automated with
scripts/release.shfor consistency - CI workflow: All jobs now set up go.work automatically
- Ensures consistent behavior between local dev and CI
- Release PRs get additional external consumption test
0.3.1 - 2026-01-05
- Complete module version references for all internal dependencies
- Updated pkg/tooling/go.mod to reference v0.3.0 for pkg/config and pkg/models
- Updated tests/bdd/go.mod to reference v0.3.0 for pkg/models
- Fixed release workflow to handle existing tags with
-fflag
- Release workflow now supports manual re-triggering for failed releases
0.3.0 - 2026-01-04
- Interactive TUI Framework: Full-featured terminal UI with vim-style navigation
- Modern terminal interface using Bubbletea and Lipgloss
- Vim-style keybindings (h/j/k/l navigation, gg/G, Ctrl+d/u)
- Three-panel layout: sidebar, content viewer, and status bar
- Markdown rendering support with syntax highlighting
- Collapsible sections and tree navigation
- Demo application showcasing TUI capabilities
- Markdown Rendering: Rich markdown support in terminal
- Headings, lists, code blocks with syntax highlighting
- Links, emphasis (bold, italic), blockquotes
- Horizontal rules and inline code
- Configurable color themes
- Enhanced Validation: Improved
morphir validatecommand- Better error reporting and diagnostics
- JSON output support for programmatic use
- Validation of Morphir IR structure
- Layered Configuration System: Complete configuration management with multiple sources
- TOML file support (
morphir.toml,.morphir/morphir.toml) - XDG-compliant path resolution for global config (
~/.config/morphir/) - System-wide configuration (
/etc/morphir/morphir.toml) - User override file (
.morphir/morphir.user.toml, gitignored) - Environment variable overrides with
MORPHIR_*prefix - Priority-based merging (env > user > project > global > system > defaults)
- TOML file support (
- Workspace Management: Discovery and initialization of Morphir workspaces
morphir workspace initcommand with--hiddenand--nameflags- Automatic workspace discovery walking up directory tree
- Standard directory structure (
.morphir/out/,.morphir/cache/)
- Configuration CLI Commands:
morphir config show- Display resolved configurationmorphir config path- Show configuration file locations and status--jsonflag on all commands for programmatic access
- Schema Validation: Configuration validation with errors and warnings
- Validates log levels, formats, paths, numeric ranges
- Distinguishes fatal errors from non-fatal warnings
- New Packages:
pkg/config- Public configuration API with immutable typespkg/tooling/workspace- Workspace discovery and initializationpkg/tooling/markdown- Markdown rendering for terminal outputcmd/morphir/internal/tui- Reusable TUI framework components
- Documentation:
- Comprehensive configuration guide (
docs/configuration.md) - TUI framework documentation and examples
- Package documentation (
doc.gofiles) - Example configurations (
examples/morphir.toml,examples/morphir.minimal.toml) - Updated README with Configuration section
- New DEVELOPING.md and INSTALLING.md guides
- Comprehensive configuration guide (
- Release Infrastructure:
- GoReleaser configuration for automated releases
- GitHub Actions CI workflow for format, lint, test, and build checks
- GitHub Actions release workflow for automated releases on tags
- Release preparation scripts with multi-module tagging support
go installsupport with proper module structure
- Development Tools:
- Installation scripts for Linux/macOS and Windows (PowerShell)
- Development setup scripts
- Changelog suggestion script
- Enhanced Justfile with new development targets
morphir workspace initnow fully functional (was stubbed)- Migrated morphir-go codebase into main morphir repository
- Updated module paths from
github.com/finos/morphir-gotogithub.com/finos/morphir - Enhanced build system with workspace-based development support
- Improved CLI architecture for better extensibility
- Module path resolution for
go installcompatibility - Replace directives handling in multi-module workspace
0.1.0 - 2026-01-01
- Initial Go monorepo structure with
go.workworkspace - CLI application built with Cobra and Bubbletea
- Root command that launches interactive TUI
workspace initcommand (stubbed implementation)validatecommand for validating Morphir IR (stubbed implementation)- Library modules:
models,tooling,sdk,pipeline - Build orchestration with Justfile
- Cross-platform scripts directory with bash and PowerShell versions
- OS detection infrastructure for Windows, Linux, macOS support
- Development build targets (
build-dev,install-dev) - CI check script for running all validation tasks
- AGENTS.md with development guidelines and project principles
- CLI development guidelines for stdout/stderr separation and JSON output support
- Functional programming principles and TDD/BDD practices documentation
- Updated to Go 1.25.5
- Refactored Justfile with proper OS detection and readable formatting
- Improved command registration consistency
- Duplicate help command registration in CLI