Steve CLI
A simple CLI tool to run jobs from jobs.yaml with proper environment setup. Perfect for local development and testing of automation kernel jobs.
Installation
Install from local development
cd /home/frank/Projects/7frank/tilt-ts-4/apps/example-hehnke/packages/steve-cli
uv venv
uv pip install -e .
Install from GitHub
uv add steve-cli
OR
uv add git+https://github.com/your-org/tilt-ts-4.git#subdirectory=apps/example-hehnke/packages/steve-cli
Usage
Run a job
steve extract-data
steve transform-data
steve validate-data
This will:
- Look for
jobs.yamlin the current directory - Find the specified job by name
- Set all environment variables from the job's
envsection - Execute the job's command with the proper environment
List available jobs
steve ls
Shows all jobs in jobs.yaml with their commands, schedules, dependencies, and environment variables.
Get help
steve help
steve --help
Use custom jobs file
steve -f path/to/custom.yaml extract-data
steve ls -f path/to/custom.yaml
Example
Given a jobs.yaml file:
jobs:
- name: extract-data
cron: "0 2 * * *"
command: ["uv", "run", "src/extract.py"]
env:
SOURCE_URL: "https://jsonplaceholder.typicode.com/users"
OUTPUT_PATH: "/data/raw/extracted_data.parquet"
- name: transform-data
dependsOn: ["extract-data"]
command: ["uv", "run", "src/transform.py"]
env:
INPUT_PATH: "/data/raw/extracted_data.parquet"
OUTPUT_PATH: "/data/processed"
Running steve extract-data will:
- Set
SOURCE_URL=https://jsonplaceholder.typicode.com/users - Set
OUTPUT_PATH=/data/raw/extracted_data.parquet - Execute:
uv run src/extract.py
Features
- ✅ Simple: Just
steve <job-name>to run any job - ✅ Environment: Automatically sets environment variables from
jobs.yaml - ✅ Discovery: Auto-finds
jobs.yamlin current directory - ✅ Listing: See all available jobs with
steve ls - ✅ Flexible: Supports custom jobs file paths
- ✅ Colorful: Nice colored output for better readability
- ✅ Error handling: Clear error messages for missing jobs or files
File Metadata Extraction
Steve automatically extracts metadata from files read or written via MetadataRegistry. The extractor is chosen by file extension — no configuration needed.
| Extension | Extractor | Requires |
|---|---|---|
.parquet, .pq |
ParquetExtractor |
pip install steve-cli[polars] |
.csv, .tsv, .txt |
CsvExtractor |
stdlib only |
.json, .jsonl, .ndjson |
JsonExtractor |
stdlib only |
.xlsx, .xls, .xlsm |
ExcelExtractor |
pip install steve-cli[excel] |
| anything else | GenericExtractor |
stdlib only |
Adding a custom extractor
Implement MetadataExtractorPort, declare which extensions it handles, and register it once at startup:
from steve_cli.storage.metadata.port import MetadataExtractorPort, FileMetadata, ColumnMetadata
from steve_cli.storage.metadata.registry import MetadataRegistry
class AvroExtractor(MetadataExtractorPort):
extensions = (".avro",)
def extract(self, data: bytes, path: str) -> FileMetadata:
import fastavro, io
reader = fastavro.reader(io.BytesIO(data))
schema = reader.writer_schema
columns = [
ColumnMetadata(name=f["name"], type=str(f["type"]))
for f in schema.get("fields", [])
]
records = list(reader)
return FileMetadata(
format="avro",
size_bytes=len(data),
rows=len(records),
columns=columns,
)
MetadataRegistry.register("avro", AvroExtractor)
After registration, MetadataRegistry.extract(data, "output.avro") picks AvroExtractor automatically. You can also force a specific extractor for any file via the env var:
METADATA_EXTRACTOR=avro steve jobs run my-job
Why Steve?
Named after Steve Jobs - because it helps you run jobs locally! 😄
Requirements
- Python 3.8+
- click >= 8.0.0
- pyyaml >= 6.0
Development
# Install in development mode
uv pip install -e .
# Run tests (when added)
pytest
# Format code
black steve_cli/
isort steve_cli/
use cli
source .venv/bin/activate steve
uv build uv publish
Metadata
Release files for steve-cli 0.3.13
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| steve_cli-0.3.13.tar.gz | 25.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| steve_cli-0.3.13-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.3 kB
Release files / steve_cli-0.3.13.tar.gz
| Download URL | steve_cli-0.3.13.tar.gz |
|---|---|
| Size | 25.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9fe4059d2c05f6b0781daad7bfc371236a023fbd3510579b17a09d54351e889c
|
|
BLAKE2b-256 checksum How to use checksums |
3f29b91745cfd7a5bf1724429a3013e41544f7c9b1888fb8fc77555f57ec438e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.04","id":"plucky","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / steve_cli-0.3.13-py3-none-any.whl
| Download URL | steve_cli-0.3.13-py3-none-any.whl |
|---|---|
| Size | 33.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
60809027b986cec71d0879d309ab87306c34226f7b57103395bdbf85db78536d
|
|
BLAKE2b-256 checksum How to use checksums |
0ccd3867912de416407738abc91fddc403da06b9cf7a6bab02c4a3bc471420af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.04","id":"plucky","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|