CLI to discover, fetch, and run reusable automation workflows from remote plugin packs.
Project description
LazyOps
Turn your scattered scripts into reusable, searchable, and shareable workflows.
Why LazyOps?
Every engineer has a folder full of scripts:
cleanup.sh
restart-pods.py
rotate_logs.sh
debug-nginx.sh
fix-permissions.sh
After a few months:
- You forget they exist.
- You can't remember their arguments.
- They're undocumented.
- They only work on your machine.
- Your teammates rewrite the same automation.
LazyOps solves this by adding a lightweight workflow layer on top of existing scripts.
No rewrites. No proprietary language. Just structure.
Features
- 🚀 Run scripts as named workflows (
lazyops run pack/plugin) - 📦 Install workflow packs (aws, kubernetes, security, …) from a remote catalog
- 🔍 Search and list workflows across installed packs
- 🐍 Support multiple runtimes (Bash, Python, Node.js, executables)
- 📝 Interactive picker when you run
lazyops runwith no arguments - ✅ Manifest validation before execution
- 🔖 Pin catalog version by git branch or tag (
source.ref) - 🤝 Workflows live in a separate repo — share and version them independently
Architecture
LazyOps is a CLI-only installer. Workflows are fetched at runtime from a separate plugins repo:
| Repo | Role |
|---|---|
| LazyOps | CLI, config, fetch & run |
| lazyops-plugins | Workflow catalog (packs + plugins) |
Each pack is a bundle (e.g. aws, kubernetes). Each plugin is one workflow folder under that pack. The git branch or tag on the plugins repo is the catalog version.
lazyops-plugins/
└── plugins/
└── aws/
├── pack.yaml
└── addpatchclasstag/
├── workflow.yaml
├── script.sh
└── README.md
Run a workflow:
lazyops run aws/addpatchclasstag
LazyOps fetches the plugin at your configured source.ref, validates the manifest, and executes the script.
Installation
From PyPI (recommended)
The PyPI package is lazyops-cli (the name lazyops is taken by another project). The command is still lazyops:
pipx install lazyops-cli
lazyops --help
Requires Python 3.10+ and git (used to fetch workflows at runtime).
From source (development)
LazyOps runs from a project-local virtual environment (.venv). Do not install with system pip.
git clone https://github.com/MridulTi/LazyOps.git
cd LazyOps
bash setup.sh
source ~/.zshrc # or ~/.bashrc — loads the lazyops alias
lazyops --help # works from any directory
setup.sh adds a global shell alias pointing at the repo wrapper (which always uses .venv):
alias lazyops='/path/to/LazyOps/lazyops'
export LAZYOPS_ROOT='/path/to/LazyOps'
You can also run from the repo without the alias:
./lazyops --help
source .venv/bin/activate
Quick start
Point LazyOps at the plugins catalog, enable packs, and run workflows:
# 1. Configure the plugins source (branch = version)
lazyops source init https://github.com/MridulTi/lazyops-plugins.git --ref v1.0.0
# 2. Enable packs you need
lazyops pack add aws
lazyops pack add kubernetes
# 3. Discover and run
lazyops list
lazyops search patch
lazyops run aws/addpatchclasstag
lazyops run # interactive: pick pack → pick plugin → confirm
# 4. Upgrade catalog version
lazyops source update --ref v1.2.0
For local development against a checkout of lazyops-plugins:
lazyops source init file:///path/to/lazyops-plugins --ref main
Config is stored at ~/.lazyops/config.yaml:
source:
url: https://github.com/MridulTi/lazyops-plugins.git
ref: v1.0.0
path_prefix: plugins
packs:
- aws
- kubernetes
Commands
| Command | Purpose |
|---|---|
lazyops source init <url> [--ref] |
Set plugins repo URL and version |
lazyops source show |
Show current source config |
lazyops source update --ref <ref> |
Bump catalog version |
lazyops pack add <pack> |
Enable a pack |
lazyops pack list |
List installed packs |
lazyops pack list <pack> |
List plugins in a pack |
lazyops pack remove <pack> |
Disable a pack |
lazyops run <pack>/<plugin> [args...] |
Fetch and run a workflow |
lazyops run |
Interactive workflow picker |
lazyops list |
List workflows in installed packs |
lazyops search <query> |
Search by name, id, or description |
Example manifest
id: addpatchclasstag
name: "Add Patch Class Tag"
description: "Add patch class tags to instances. Required env: AWS_REGION or REGION."
runtime: bash
entrypoint: script.sh
pack: aws
version: 1.0.0
inputs:
- name: instance_id
required: true
Philosophy
Scripts should remain scripts.
LazyOps does not replace your automation. It makes it easier to organize, discover, document, and reuse — with a shared catalog your whole team can install and pin to a version.
Roadmap
- Workflow specification
- Remote plugin catalog (source + packs)
- Fetch and run workflows from git
- Interactive CLI
- Search and list
- Input validation
- Plugin runtimes
- Optional web dashboard
Contributing
Contributions are welcome.
You can help by:
- Adding workflows to lazyops-plugins
- Improving CLI documentation
- Supporting additional runtimes
- Reporting bugs
- Suggesting new features
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lazyops_cli-1.0.0.tar.gz.
File metadata
- Download URL: lazyops_cli-1.0.0.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c35a2ddb986a37c5441af54aa5eb6be2e0a9b8429dac85325a161d7e57fd4097
|
|
| MD5 |
47d86f3b67d59100e952bb32c66dcd56
|
|
| BLAKE2b-256 |
edda7e911795d1657c02bddd25dc4293810bc5f21b66d9c306eebcb40f96370a
|
Provenance
The following attestation bundles were made for lazyops_cli-1.0.0.tar.gz:
Publisher:
publish.yml on MridulTi/LazyOps
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazyops_cli-1.0.0.tar.gz -
Subject digest:
c35a2ddb986a37c5441af54aa5eb6be2e0a9b8429dac85325a161d7e57fd4097 - Sigstore transparency entry: 1894259124
- Sigstore integration time:
-
Permalink:
MridulTi/LazyOps@76dc5eb059518171762469a92f94d8d3bca8d2e9 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/MridulTi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@76dc5eb059518171762469a92f94d8d3bca8d2e9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lazyops_cli-1.0.0-py3-none-any.whl.
File metadata
- Download URL: lazyops_cli-1.0.0-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac40aecdfd155fc4b648eb340d62899a1e8752b19848b918a24d156ca67f0a10
|
|
| MD5 |
1dc1c7dbb5e351e1e17e712e582b0263
|
|
| BLAKE2b-256 |
e862a36d5abe081d092b32b8c50d3d05bbf9fcbfd0f8af27cacc21ae6cb7e6e3
|
Provenance
The following attestation bundles were made for lazyops_cli-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on MridulTi/LazyOps
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazyops_cli-1.0.0-py3-none-any.whl -
Subject digest:
ac40aecdfd155fc4b648eb340d62899a1e8752b19848b918a24d156ca67f0a10 - Sigstore transparency entry: 1894259277
- Sigstore integration time:
-
Permalink:
MridulTi/LazyOps@76dc5eb059518171762469a92f94d8d3bca8d2e9 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/MridulTi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@76dc5eb059518171762469a92f94d8d3bca8d2e9 -
Trigger Event:
push
-
Statement type: