{"record":{"id":"d44003fe14b9bf1a","repo":"windmill-labs/windmill","slug":"runnable-runnableid-content-is-still-an-inline","errorCode":null,"errorMessage":"Runnable ${runnableId} content is still an !inline reference, skipping","messagePattern":"Runnable (.+?) content is still an !inline reference, skipping","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cli/src/commands/app/app_metadata.ts","lineNumber":515,"sourceCode":"      !runnable?.inlineScript\n    ) {\n      // Write non-inline runnables to their own file as-is\n      writeRunnableToBackend(runnablesFolder, runnableId, runnable);\n      continue;\n    }\n\n    const inlineScript = runnable.inlineScript;\n    const language = inlineScript.language as SupportedLanguage;\n    const content = inlineScript.content;\n\n    if (!content || !language) {\n      writeRunnableToBackend(runnablesFolder, runnableId, runnable);\n      continue;\n    }\n\n    // Skip if content is still an !inline reference (should have been replaced by replaceInlineScripts)\n    if (typeof content === \"string\" && content.startsWith(\"!inline \")) {\n      log.warn(\n        colors.yellow(\n          `Runnable ${runnableId} content is still an !inline reference, skipping`\n        )\n      );\n      writeRunnableToBackend(runnablesFolder, runnableId, runnable);\n      continue;\n    }\n\n    // Skip frontend scripts - they don't need locks\n    if (language === \"frontend\") {\n      // Still need to write the runnable YAML file\n      // Use runnableId (the dict key) for file naming, consistent with\n      // extractInlineScriptsForApps in sync.ts which also uses the key.\n      // Using runnable.name would create duplicate files when name != key.\n      const [basePathO, ext] = pathAssigner.assignPath(\n        runnableId,\n        language\n      );","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/app/app_metadata.ts#L497-L533","documentation":"While generating app metadata/locks, updateRawAppRunnables walks raw-app runnable definitions. If a runnable's content is still the raw string `!inline <path>` after the replaceInlineScripts pass should have resolved it, the CLI cannot process it as real script content, warns, writes the runnable back unchanged, and skips lock generation for it.","triggerScenarios":"`wmill app generate-metadata` (or app generate-locks) on a raw app where an inline-script reference was not replaced earlier: replaceInlineScripts skipped or failed for that file (e.g. readInlinePathSync returned '' for a missing file), or the runnable sits in a location the replacement pass does not traverse.","commonSituations":"Missing inline script file on disk (so the earlier replacement silently failed); nested runnables in unusual app fields not covered by the traversal; freshly cloned repo without the referenced script files; committed raw app YAML whose !inline paths are wrong.","solutions":["Check earlier CLI output for 'Error reading inline path' warnings and fix the missing/wrong !inline paths.","Ensure the referenced script files exist relative to the raw app folder before running generate-metadata.","Re-run `wmill app generate-metadata` from the app root after fixing paths.","If the runnable should contain real content, replace the !inline reference manually in the raw app definition."],"exampleFix":"// before\ncontent: '!inline ./scripts/missing.ts'\n// after: file present at that path, then re-run\nwmill app generate-metadata  # content resolved to actual script code","handlingStrategy":"validation","validationCode":"// before generate-metadata: verify no raw-app file still contains unresolved references\ngrep -RIn '!inline ' apps/ && echo 'resolve inline references first' || true","typeGuard":"null","tryCatchPattern":"if (typeof content === 'string' && content.startsWith('!inline ')) {\n  log.warn(`Runnable ${runnableId} still !inline, skipping`);\n  writeRunnableToBackend(runnablesFolder, runnableId, runnable);\n  continue;\n}","preventionTips":["Commit all files referenced by `!inline` alongside the raw app definition.","Fix any 'Error reading inline path' warnings before generating metadata.","Run generate-metadata from the raw app root directory.","After cloning a repo, verify inline files exist before locking."],"tags":["cli","raw-apps","inline-scripts","metadata"],"backgroundTag":"unresolved-inline-reference","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}