windmill-labs/windmill · error
Unknown language '${language}'. Valid languages: ${validLang
Error message
Unknown language '${language}'. Valid languages: ${validLanguages} What it means
`wmill script bootstrap` resolves the requested language through `languageAliases`, then looks up starter code in `scriptBootstrapCode`. If no bootstrap template exists for the (resolved) language, it throws with the sorted list of valid languages.
Source
Thrown at cli/src/commands/script/script.ts:1634
const languageAliases: Record<string, ScriptLanguage> = {
python: "python3",
};
async function bootstrap(
opts: GlobalOptions & { summary: string; description: string },
scriptPath: string,
language: ScriptLanguage | string
) {
if (!validatePath(scriptPath)) {
return;
}
const resolvedLanguage = (languageAliases[language] ?? language) as ScriptLanguage;
const scriptInitialCode = scriptBootstrapCode[resolvedLanguage];
if (scriptInitialCode === undefined) {
const validLanguages = Object.keys(scriptBootstrapCode).sort().join(", ");
throw new Error(
`Unknown language '${language}'. Valid languages: ${validLanguages}`
);
}
const config = await readConfigFile();
const extension = filePathExtensionFromContentType(
resolvedLanguage,
config.defaultTs
);
const scriptCodeFileFullPath = scriptPath + extension;
const scriptMetadataFileFullPath = scriptPath + ".script.yaml";
try {
await stat(scriptCodeFileFullPath);
throw new Error("File already exists: " + scriptCodeFileFullPath);
} catch (e: any) {
if (e.message?.startsWith("File already exists")) throw e;View on GitHub (pinned to e474e8803c)
Solutions
- Use one of the languages listed in the error message.
- Check for a language alias (e.g. `deno` for typescript-deno) supported by your CLI version.
- Update the CLI (`npm i -g windmill-cli` or `brew upgrade wmill`) if the language is newer than your installed version.
- Run `wmill script bootstrap --help` to see accepted values.
Example fix
// before wmill script bootstrap f/my_script js // after wmill script bootstrap f/my_script typescript
Defensive patterns
Strategy: validation
Validate before calling
const valid = ['python','typescript','go','shell','bun','deno','ansible','bash','powershell','php','rust','sql','nunjucks','graphql'];
if (!valid.includes(lang)) {
throw new Error(`Language '${lang}' not supported; use one of: ${valid.join(', ')}`);
} Type guard
function isSupportedLanguage(l: string): l is SupportedLanguage {
return ['python','typescript','go','shell','bun','deno'].includes(l);
} Try / catch
try {
await wmill.script.bootstrap(path, lang);
} catch (e) {
if (String(e.message).startsWith('Unknown language')) {
console.error(e.message); // message lists valid languages
}
throw e;
} Prevention
- Tab-complete the language argument where supported.
- Check `wmill --version` and upgrade before using newly added languages.
- Keep a team cheat-sheet of canonical Windmill language names.
When it happens
Trigger: `wmill script bootstrap my_script <lang>` with a misspelled or unsupported language value, e.g. `python3` when only `python` is aliased, `js` instead of `typescript`, or `bash` instead of `shell`/`bun`.
Common situations: Typing a language name from another tool's vocabulary (`golang` vs `go`, `py` vs `python`); copying a command from docs for a Windmill version that doesn't support that language yet; shell tab-completion inserting the file extension (`.ts`) instead of the language name.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Invalid migration name '${name}': use only letters, digits,
- Unknown workspace dependencies file format: ${path}. Valid f
- Cannot push flow ${remotePath}: step(s) reference non-worksp
- Completed jobs file must contain an array of jobs
- Queued jobs file must contain an array of jobs
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/f6b1fdc1b139c7dc.
Report an issue: GitHub.