{"record":{"id":"ccd4a49e363d1d12","repo":"nikivdev/code","slug":"jazz-tools-did-not-return-an-app-id","errorCode":null,"errorMessage":"jazz-tools did not return an app id","messagePattern":"jazz-tools did not return an app id","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/storage.rs","lineNumber":368,"sourceCode":"    };\n\n    if !output.status.success() {\n        let stdout = String::from_utf8_lossy(&output.stdout);\n        let stderr = String::from_utf8_lossy(&output.stderr);\n        bail!(\n            \"jazz2 app create failed: {}{}\",\n            stdout.trim(),\n            stderr.trim()\n        );\n    }\n\n    let stdout = String::from_utf8_lossy(&output.stdout);\n    let app_id = stdout\n        .lines()\n        .rev()\n        .find(|line| !line.trim().is_empty())\n        .map(|line| line.trim().to_string())\n        .ok_or_else(|| anyhow::anyhow!(\"jazz-tools did not return an app id\"))?;\n\n    Ok(JazzAppCredentials {\n        app_id,\n        backend_secret: generate_secret(\"backend\"),\n        admin_secret: generate_secret(\"admin\"),\n    })\n}\n\nfn jazz_tools_package_spec() -> String {\n    resolve_jazz_tools_package_spec(std::env::var(JAZZ_TOOLS_NPX_SPEC_ENV).ok().as_deref())\n}\n\nfn resolve_jazz_tools_package_spec(raw: Option<&str>) -> String {\n    raw.map(str::trim)\n        .filter(|value| !value.is_empty())\n        .unwrap_or(DEFAULT_JAZZ_TOOLS_NPX_SPEC)\n        .to_string()\n}","sourceCodeStart":350,"sourceCodeEnd":386,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/storage.rs#L350-L386","documentation":"create_jazz_app_credentials runs the jazz-tools CLI and derives the app id from the last non-empty line of its stdout. If the captured output has no non-empty lines, it throws 'jazz-tools did not return an app id', meaning the CLI produced no usable output (empty stdout).","triggerScenarios":"Running create_jazz_app_credentials (via bootstrap_cloudflare_secrets or jazz_new) when the jazz-tools command exits without printing anything to stdout — e.g. command failed silently, wrong binary on PATH, or output went only to stderr.","commonSituations":"jazz-tools not installed or not logged in so it prints nothing; a wrapper script swallows output; a version of jazz-tools whose output format changed (e.g. JSON on stderr).","solutions":["Run the jazz-tools command manually and confirm it prints an app id on stdout","Check the command's stderr (captured by run_command_with_output) for the real failure and fix auth/install","Verify the expected jazz-tools binary is first on PATH (which jazz-tools)","Update code to also parse JSON output or exit status before trusting stdout"],"exampleFix":"// before\nlet app_id = stdout.lines().rev().find(|line| !line.trim().is_empty())...\n// after\nif !output.status.success() {\n    anyhow::bail!(\"jazz-tools failed ({}): {}\", output.status, stderr_trimmed);\n}\nlet app_id = stdout.lines().rev().find(|line| !line.trim().is_empty())...","handlingStrategy":"validation","validationCode":"let output = run_command_with_output(cmd)?;\nif !output.status.success() {\n    anyhow::bail!(\"jazz-tools exited with {}: {}\", output.status, String::from_utf8_lossy(&output.stderr));\n}\nif String::from_utf8_lossy(&output.stdout).trim().is_empty() {\n    anyhow::bail!(\"jazz-tools produced no stdout; is it installed and logged in?\");\n}","typeGuard":null,"tryCatchPattern":"match create_jazz_app_credentials() {\n    Ok(creds) => creds,\n    Err(e) if e.to_string().contains(\"did not return an app id\") => {\n        eprintln!(\"run `jazz-tools` manually to see why it prints nothing\");\n        return Err(e);\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Verify jazz-tools is on PATH and authenticated before automating it","Check the command's exit status and stderr, not just stdout","Pin the jazz-tools version so output format stays stable"],"tags":["cli","subprocess","jazz-tools","stdout-parsing"],"backgroundTag":"empty-command-output","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}