Skip to main content

Getting Started with Morphir CLI Preview

This guide will help you get started with the Morphir CLI Preview features, including WIT support and JSONL batch processing.

Prerequisites​

  • A terminal (Linux, macOS, or Windows PowerShell)
  • Internet connection for installation
  • Basic familiarity with command-line tools

Installation​

Quick Install Script​

Linux & macOS​

curl -fsSL https://raw.githubusercontent.com/finos/morphir/main/scripts/install.sh | bash

Windows (PowerShell)​

iwr https://raw.githubusercontent.com/finos/morphir/main/scripts/install.sh -useb | iex

Using Go Install​

If you have Go 1.21+ installed:

go install github.com/finos/morphir/cmd/morphir@latest

Download Binary​

Download pre-built binaries from GitHub Releases.

Verify Installation​

morphir about

Expected output:

Morphir - Functional Data Modeling
═══════════════════════════════════

Version: 0.4.0-alpha.1
Git Commit: abc123...
Build Date: 2026-01-08
Go Version: go1.25.5
Platform: linux/amd64

Your First WIT Compilation​

Let's compile a simple WIT interface to Morphir IR.

Create a WIT File​

Create a file named hello.wit:

package example:hello;

interface greeter {
/// Greet someone by name
greet: func(name: string) -> string;

/// Say goodbye
goodbye: func() -> string;
}

Compile to Morphir IR​

morphir wit make hello.wit -o hello.ir.json

Output:

SUCCESS Compiled WIT to Morphir IR
Types: 0, Values: 2

View the IR​

cat hello.ir.json

The IR contains the module structure with the two functions.

Understanding the Output​

JSON Output Mode​

For structured output:

morphir wit make hello.wit --json
{
"success": true,
"typeCount": 0,
"valueCount": 2,
"diagnostics": []
}

JSONL Output Mode​

For streaming/batch workflows:

morphir wit make hello.wit --jsonl
{"success":true,"typeCount":0,"valueCount":2,"module":{"values":[{"name":"Greet"},{"name":"Goodbye"}],"sourcePackage":{"namespace":"example","name":"hello"}}}

Working with Types​

WIT supports various types that map to Morphir IR:

Records​

package example:users;

interface user-service {
record user {
id: u64,
name: string,
email: string,
active: bool,
}

get-user: func(id: u64) -> option<user>;
create-user: func(name: string, email: string) -> user;
}
morphir wit make users.wit --json
{
"success": true,
"typeCount": 1,
"valueCount": 2,
"diagnostics": [
{"severity": "warn", "code": "WIT001", "message": "lossy mapping: u64 → Int"}
]
}

Understanding Diagnostics​

The diagnostic WIT001 indicates that u64 is mapped to Morphir's Int type, which doesn't preserve the size or signedness information. This is expected and the conversion still succeeds.

Round-Trip Validation​

The build command validates that WIT can be converted to IR and back:

morphir wit build hello.wit -o hello-regenerated.wit
package example:hello;

interface greeter {
greet: func(name: string) -> string;
goodbye: func() -> string;
}

VALID Round-trip validation passed

Batch Processing​

Process multiple WIT sources efficiently:

Create a Batch Input File​

Create sources.jsonl:

{"name": "greeter", "source": "package example:hello; interface greeter { greet: func(name: string) -> string; }"}
{"name": "users", "source": "package example:users; interface users { get-user: func(id: u64) -> string; }"}
{"name": "orders", "source": "package example:orders; interface orders { create-order: func() -> u64; }"}

Process All Sources​

morphir wit make --jsonl-input sources.jsonl --jsonl

Output (one line per source):

{"name":"greeter","success":true,"typeCount":0,"valueCount":1,"module":{...}}
{"name":"users","success":true,"typeCount":0,"valueCount":1,"module":{...}}
{"name":"orders","success":true,"typeCount":0,"valueCount":1,"module":{...}}

Process from Stdin​

echo '{"name": "test", "source": "package a:b; interface foo { x: func(); }"}' | \
morphir wit make --jsonl-input - --jsonl

Common Workflows​

Validate WIT Files in CI​

#!/bin/bash
# validate-wit.sh

# Find all WIT files and create JSONL input
find ./wit -name "*.wit" | while read f; do
echo "{\"file\": \"$f\"}"
done > /tmp/wit-sources.jsonl

# Compile and check for failures
morphir wit make --jsonl-input /tmp/wit-sources.jsonl --jsonl > /tmp/results.jsonl

# Exit with error if any failed
if grep -q '"success":false' /tmp/results.jsonl; then
echo "WIT validation failed:"
grep '"success":false' /tmp/results.jsonl
exit 1
fi

echo "All WIT files validated successfully"

Strict Validation​

For stricter validation (warnings become errors):

morphir wit make hello.wit --warnings-as-errors --strict

Verbose Output​

To see all diagnostics:

morphir wit make hello.wit -v

Next Steps​

Troubleshooting​

Command Not Found​

After installation, you may need to add the binary to your PATH:

Linux/macOS:

export PATH="$PATH:/usr/local/bin"

Windows: Restart your terminal for PATH changes to take effect.

Parse Errors​

If WIT parsing fails, check:

  1. Package declaration is present (package namespace:name;)
  2. Interface syntax is correct
  3. Type references are valid

Example error:

{"success":false,"error":"parse error at line 3: expected 'func'"}

Unsupported Types​

Some WIT types are not yet supported:

  • flags - Use enum or record instead
  • resource - Use record with handle field

The --strict flag will fail on unsupported types instead of silently ignoring them.

Getting Help​