Use this module to run shell commands as part of engine startup — building assets, running migrations, or starting long-lived processes like a production server.
modules::shell::ExecModule
Sample Configuration
- class: modules::shell::ExecModule
config:
exec:
- cd frontend && npm install
- cd frontend && npm run build
- bun run --enable-source-maps index-production.js
With file watching:
- class: modules::shell::ExecModule
config:
watch:
- steps/**/*.{ts,js}
- config/*.json
exec:
- cd frontend && npm install
- cd frontend && npm run build
- bun run --enable-source-maps index-production.js
Configuration
The commands to execute as a sequential pipeline. Each command runs in its own process. Intermediate commands must exit successfully before the next one starts; the final command is kept running as a long-lived process.Because each entry is a separate process, you cannot share shell state between entries. Use && to chain operations that must share a working directory:- cd path/to/project && npm run build
If an intermediate command exits with a non-zero code, the pipeline stops and the remaining commands are skipped.
Glob patterns that trigger a full pipeline restart on file change. See the warning below for matching limitations.
Patterns match by root directory and file extension only — the filename portion is ignored. src/**/*.test.ts matches all .ts files under src/, not only test files. Use ** to watch subdirectories recursively: config/*.json only watches the top level of config/, while config/**/*.json watches at any depth. Files without an extension (e.g., Makefile, shell scripts) are never matched.