{"record":{"id":"f1afcbd2e3db2aeb","repo":"BoundaryML/baml","slug":"project-name-name-contains-invalid-character-s-bad-use-ascii","errorCode":null,"errorMessage":"project name `{name}` contains invalid character(s) {bad:?}. Use ASCII letters, digits, `-`, `_`, or `.`.","messagePattern":"project name `(.+?)` contains invalid character\\(s\\) (.+?)\\. Use ASCII letters, digits, `-`, `_`, or `\\.`\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"baml_language/crates/baml_cli/src/init_command.rs","lineNumber":177,"sourceCode":"        .and_then(|s| s.to_str())\n        .filter(|s| !s.is_empty())\n        .map(|s| s.to_string())\n}\n\n/// Cargo-style project-name rules: non-empty, ASCII alphanumeric plus\n/// `-`, `_`, `.`. Whitelist beats blacklist here — `render_baml_toml`\n/// drops the name straight into a `\"...\"` TOML string, so a stray `\"`\n/// (or any control char) in the name produces an unparseable manifest.\nfn validate_project_name(name: &str) -> Result<()> {\n    if name.is_empty() {\n        anyhow::bail!(\"project name cannot be empty\");\n    }\n    let bad: Vec<char> = name\n        .chars()\n        .filter(|c| !(c.is_ascii_alphanumeric() || matches!(c, '-' | '_' | '.')))\n        .collect();\n    if !bad.is_empty() {\n        anyhow::bail!(\n            \"project name `{name}` contains invalid character(s) {bad:?}. \\\n             Use ASCII letters, digits, `-`, `_`, or `.`.\"\n        );\n    }\n    Ok(())\n}\n\nfn render_baml_toml(name: &str) -> String {\n    format!(\n        r#\"[package]\nname = \"{name}\"\n\n# [scripts]\n# dev = \"-f main\"\n\n# Add a client generator, then generate its SDK:\n#   baml generate add python/pydantic2\n#   baml generate","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/baml_language/crates/baml_cli/src/init_command.rs#L159-L195","documentation":"validate_project_name rejects names containing characters outside the whitelist of ASCII letters, digits, `-`, `_`, `.`. The name is interpolated into a quoted TOML string in baml.toml, so characters like `\"` or control characters would produce an unparseable manifest; the check reports the exact offending characters.","triggerScenarios":"Run `baml init <path> --name` with a name containing spaces, slashes, quotes, unicode, or other non-whitelisted characters.","commonSituations":"Using a package display name like \"My Cool App!\", a path fragment like `a/b`, or copying a name with quotes into `--name`.","solutions":["Rename using only ASCII letters, digits, `-`, `_`, `.` (e.g. `my-cool-app`).","Put a human-friendly description elsewhere (e.g. edit baml.toml comments after init) instead of encoding it in the name.","Sanitize the name in your script: strip or replace invalid characters before invoking `baml init`."],"exampleFix":"// before\nbaml init ./app --name \"My App!\"\n// after\nbaml init ./app --name \"my-app\"","handlingStrategy":"validation","validationCode":"# guard: enforce Cargo-style name before init\necho \"$NAME\" | grep -qE '^[A-Za-z0-9._-]+$' || { echo \"invalid project name: $NAME\"; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Restrict names to [A-Za-z0-9._-]","Sanitize user-supplied names before passing --name","Keep display names out of the identifier (edit baml.toml later)"],"tags":["cli","validation","project-name","identifier-format"],"backgroundTag":"invalid-identifier-format","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}