{"record":{"id":"13f35468869524aa","repo":"windmill-labs/windmill","slug":"inline-script-at-context-path-join-is-stil","errorCode":null,"errorMessage":"Inline script at ${context.path.join(\".\")} is still an !inline reference, skipping","messagePattern":"Inline script at (.+?) is still an !inline reference, skipping","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cli/src/commands/app/app_metadata.ts","lineNumber":649,"sourceCode":"  rawDeps?: Record<string, string>,\n  defaultTs: \"bun\" | \"deno\" = \"bun\",\n  noStaleMessage?: boolean,\n  tempScriptRefs?: Record<string, string>\n): Promise<{ value: any; updatedScripts: string[] }> {\n  const pathAssigner = newPathAssigner(defaultTs, { skipInlineScriptSuffix: getNonDottedPaths() });\n  const updatedScripts: string[] = [];\n\n  const processor: InlineScriptProcessor = async (inlineScript, context) => {\n    const language = inlineScript.language as SupportedLanguage;\n    const content = inlineScript.content;\n\n    if (!content || !language) {\n      return inlineScript;\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          `Inline script at ${context.path.join(\n            \".\"\n          )} is still an !inline reference, skipping`\n        )\n      );\n      return inlineScript;\n    }\n\n    // Get the name from the parent object (following extractInlineScriptsForApps pattern)\n    // For normal apps, the name is stored in the component's \"name\" property\n    const scriptName = context.parentObject?.[\"name\"] || \"unnamed\";\n    const scriptPath = `${remotePath}/${context.path.join(\"/\")}`;\n\n    try {\n      let lock: string | undefined;\n      if (language !== \"frontend\") {\n        if (!noStaleMessage) {","sourceCodeStart":631,"sourceCodeEnd":667,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/app/app_metadata.ts#L631-L667","documentation":"traverseAndProcessInlineScripts visits inline script definitions in a raw app and its processor decides whether content needs lock-generation. If the content is still the literal `!inline <path>` string (the earlier replacement pass did not resolve it), the processor warns with the dotted path of the script, leaves the inlineScript untouched, and skips processing for that node.","triggerScenarios":"`wmill app generate-metadata` on a raw app whose inline scripts still contain `!inline` references after replaceInlineScripts ran: file missing/unreadable (readInlinePathSync warned), path outside traversal, or the reference was added between replacement and processing.","commonSituations":"Repo cloned without the referenced script files; case-mismatched paths failing on Linux CI; scripts nested in fields not traversed by the replacement pass; running generate-metadata from the wrong working directory.","solutions":["Fix the !inline paths so files exist at the stated locations relative to the app root.","Look for earlier 'Error reading inline path' warnings identifying exactly which files failed to load.","Re-run generate-metadata from the correct directory once paths are valid.","Manually paste the script content into the raw app definition if the inline workflow is not wanted."],"exampleFix":"// before\ninlineScript.content: '!inline ./flow/Scritp.py'  # path typo\n// after\ninlineScript.content: '!inline ./flow/Script.py'  # then re-run generate-metadata","handlingStrategy":"validation","validationCode":"// scan raw app definitions for leftover !inline refs before traversing\nimport { walk } from 'std/fs';\nfor await (const f of walk('./apps', { exts: ['.yaml', '.json'] })) {\n  if ((await Deno.readTextFile(f.path)).includes('!inline ')) {\n    console.error(`unresolved !inline in ${f.path}`);\n  }\n}","typeGuard":"null","tryCatchPattern":"if (typeof content === 'string' && content.startsWith('!inline ')) {\n  log.warn(`Inline script at ${context.path.join('.')} still !inline, skipping`);\n  return inlineScript;\n}","preventionTips":["Ensure replaceInlineScripts ran successfully (no prior 'Error reading inline path' warnings).","Keep !inline target paths correct and files committed to the repo.","Run from the app root so relative paths resolve identically in replacement and traversal passes.","Use CI file-existence checks for every `!inline` path in raw apps."],"tags":["cli","raw-apps","inline-scripts","traversal"],"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"}