Languages: English | 中文 Platforms: Windows · Linux · Android (Termux)
TL;DR: Build workflows in the GUI (recommended). The GUI exports real lyenv plugins. The CLI installs/runs plugins with structured stdio JSON, logs, and config mutations.
lyenv is a directory-based environment manager and automation runtime:
- Environment = a directory (
bin/,plugins/,workspace/,.lyenv/) - Workflow = a plugin (manifest-driven commands)
- stdio JSON execution: plugins exchange JSON via stdin/stdout (structured result/logs/mutations)
- GUI is a workflow compiler: draw flows → export as multi-step stdio plugin → install/run with live logs
make build
make build-guiCI note: if your workflow uses npm ci, you must commit package-lock.json (or shrinkwrap) because npm ci requires an existing lockfile. 4
lyenv create ./demo
lyenv init ./demoLinux/macOS (bash/zsh)
eval "$(lyenv activate)"Windows PowerShell
lyenv activate | Invoke-Expressionlyenv install installs both lyenv and lyenv-gui:
- Tries system bin first (e.g.
/usr/local/bin, Termux$PREFIX/bin) - If permission denied, falls back to
~/.local/bin - Windows (policy A): no automatic PATH modification; if not found, add install directory to PATH manually.
Install:
lyenv installUninstall:
lyenv uninstallOptional:
lyenv install --bindir=/usr/local/bin
lyenv uninstall --bindir=/usr/local/binlyenv gui start --openRegister an environment for GUI selection:
lyenv gui add ./demo --name=demo
lyenv gui list- Create nodes and edges (Start → ... → End)
- Put a flow into a Group: one Group = one command
- Click Run:
- choose which group to run
- input args
- GUI exports a temporary plugin → installs → runs → streams logs → cleans up
When the flow is stable, export it as a plugin package (zip). This zip can be:
- installed locally (for development), or
- published to the plugin center (see below).
plugin/
├─ manifest.yaml|yml|json
├─ config.yaml|json (optional)
└─ scripts/
└─ ...
- shell: simple command execution and logging
- stdio (recommended): JSON request/response via stdin/stdout
- supports
message(final result),logs,artifacts,mutations - mutations are merged safely into:
- global config:
lyenv.yaml - plugin local config:
plugins/<INSTALL_NAME>/config.yaml|json
- global config:
- supports
lyenv run <INSTALL_NAME> <COMMAND> -- arg1 arg2Install latest:
lyenv plugin install tester --name=testerInstall a specific version:
lyenv plugin install tester --version=0.1.0 --name=testerSugar syntax:
lyenv plugin install tester@0.1.0 --name=testerThis project uses a plugin center monorepo:
- plugin source lives in
plugins/<NAME>/ - plugin zip archives are published as GitHub Release assets under a fixed tag
artifactsusing a release upload action. 2 3 index.yamlcontains source + sha256 per version and is updated by CI
- Prepare a plugin directory (GUI-exported zip or hand-written plugin)
- Add plugin source to the center repo at:
plugins/<NAME>/
manifest.yaml
... - Open a PR to center repo
mainwith source files only (do NOT commit zip artifacts) - After merge, CI will:
- package
plugins/<NAME>into<NAME>-<VERSION>.zip - upload zip to GitHub Release assets (tag=
artifacts) 2 3 - update
index.yamland open a PR
- package
- Merge the
index.yamlPR to publish
See CONTRIBUTING.md for:
- local testing
- sparse checkout (no full repo clone)
- CI rules and versioning
Releases are built by GitHub Actions on tag push using a build matrix (OS/arch combinations). The matrix strategy is a standard GitHub Actions feature. 1
Release assets are uploaded using a GitHub Release action. 2 3
Build artifacts are typically collected via artifact upload/download actions. 5 6
- Global dispatch log:
.lyenv/logs/dispatch.log - Per-run log:
.lyenv/logs/dispatch/<DISPATCH_ID>.log - Plugin logs:
plugins/<INSTALL_NAME>/logs/YYYY-MM-DD/...
See LICENSE.