Script Execution
Miso picks an interpreter per script — by file extension or shebang, falling back to sh.
Changing the Interpreter
You can run scripts with a different interpreter in three ways:
1. Use a Different File Extension
Miso selects the interpreter based on the file extension:
| Extension | Interpreter | Notes |
|---|---|---|
.sh | sh | POSIX shell (default) |
.bash | bash | Bash |
.zsh | zsh | Z shell |
.js, .mjs | node | Node.js |
.ts | bun or node | bun when the project uses bun, otherwise node |
.py | python3 | Python 3 |
.rb | ruby | Ruby |
.pl | perl | Perl |
.lua | lua | Lua |
.php | php | PHP |
.tsruns onbunwhen your project uses bun — detected from thepackageManagerfield inpackage.json, then from a bun lockfile — and otherwise onnode. Barenode script.tsneeds Node 23.6+ (or 22.6+ with--experimental-strip-types);bunruns TypeScript with no extra setup.
2. Configure the Default Shell in miso.json
For scripts with no recognized extension, you can override the default sh in miso.json:
{
"shell": "bash"
}3. Use a Shebang
While you don’t need one, if the first line starts with #!, Miso uses the specified interpreter:
#!/usr/bin/env node
console.log("Running with Node.js");Interpreter Requirements
Make sure the required interpreter is installed and available in your PATH:
which node
which python3
which rubyWorking Directory
Scripts run from the project root, no matter where they sit in the scripts folder. Write paths relative to the root:
# scripts/build/miso.sh
cd apps/miso && go build ./cmdSo you can reference project files consistently without caring where the script lives.
Local Binaries on PATH
Miso prepends node_modules/.bin to each script’s PATH, walking from the target directory up to the project root (nearest first). Locally-installed CLIs run bare — no npx or package-manager prefix:
drizzle-kit push # resolves node_modules/.bin/drizzle-kit
wrangler deploy # resolves node_modules/.bin/wranglerError Handling
If a script exits with a non-zero status code, Miso will display the error and exit with the same code:
if [ -z "$1" ]; then
echo "Error: Environment required"
exit 1
fi