{"record":{"id":"d6ae5301517aef0d","repo":"windmill-labs/windmill","slug":"no-resource-metadata-file-found-for-fileset-resour-d6ae53","errorCode":null,"errorMessage":"No resource metadata file found for fileset resource: ${change.path}","messagePattern":"No resource metadata file found for fileset resource: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/sync/sync.ts","lineNumber":5798,"sourceCode":"                  log.info(\n                    `Editing ${getTypeStrFromPath(change.path)} ${change.path}`,\n                  );\n                }\n              }\n              // Fileset routing must precede the single-file check (as it does\n              // in the added/deleted branches): a fileset accepts arbitrary\n              // child names, so a child like `<res>.fileset/q.resource.file.sql`\n              // matches both predicates and belongs to its fileset parent.\n              if (isFilesetResource(change.path)) {\n                const result = await pushFilesetParentResource(\n                  change.path,\n                  workspace.workspaceId,\n                  alreadySynced,\n                  cachedWsNameForPush,\n                  specificItems,\n                );\n                if (result.status === \"parent-missing\") {\n                  throw new Error(\n                    `No resource metadata file found for fileset resource: ${change.path}`,\n                  );\n                }\n                // Pushed or already-synced: the parent resource carries the\n                // whole fileset, so this child's content is on the remote.\n                if (stateTarget) {\n                  await writeFile(stateTarget, change.after, \"utf-8\");\n                }\n                continue;\n              }\n              if (isFileResource(change.path)) {\n                const resourceFilePath = await findResourceFile(change.path);\n                if (!alreadySynced.includes(resourceFilePath)) {\n                  alreadySynced.push(resourceFilePath);\n\n                  const newObj = parseFromPath(\n                    resourceFilePath,\n                    await readTextFile(resourceFilePath),","sourceCodeStart":5780,"sourceCodeEnd":5816,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/sync/sync.ts#L5780-L5816","documentation":"During `wmill sync push`, when a change is a child file of a fileset resource, the CLI must sync the parent resource metadata file that carries the whole fileset. If syncing that parent reports status \"parent-missing\", the CLI throws this error: the child change cannot be pushed on its own because no resource metadata file exists for it (locally or remotely).","triggerScenarios":"`wmill sync push` encounters a change.path pointing at a file inside a fileset (e.g. an app sub-file), and the parent resource metadata (the `.resource.json`-style manifest for the fileset) is absent, so the sync helper returns parent-missing.","commonSituations":"Hand-deleting or renaming the parent metadata file in the sync folder, pulling a partial workspace, or git commits that excluded the parent file while keeping children.","solutions":["Restore or re-generate the parent resource metadata file for that fileset (re-run `wmill sync pull` for that path)","Ensure the whole fileset directory, including its metadata file, is committed to git","Exclude the orphaned child file if it is not wanted, then push","Create the parent resource via the UI/CLI first, then sync pull to regenerate metadata"],"exampleFix":"// before: pushing orphaned child\nfilesets/myapp/index.html  (parent myapp.resource.json deleted)\n// after: regenerate parent then push\nwmill sync pull --include-skip > /dev/null && wmill sync push","handlingStrategy":"validation","validationCode":"import fs from \"fs\";\nimport path from \"path\";\nfunction hasParentMetadata(childPath: string): boolean {\n  const dir = path.dirname(childPath);\n  return fs.readdirSync(dir).some(f => f.endsWith(\".resource.json\") || f.endsWith(\".resource.yaml\"));\n}","typeGuard":null,"tryCatchPattern":"try {\n  await wmill.sync.push(opts);\n} catch (e) {\n  if (String(e.message).startsWith(\"No resource metadata file found\")) {\n    await wmill.sync.pull({ includeSiblings: true }); // regenerate parent\n  }\n}","preventionTips":["Never commit only fileset children — include parent metadata files","Re-run `wmill sync pull` after manual directory surgery","Grep the repo for fileset dirs lacking a metadata file in CI"],"tags":["cli","sync","fileset","missing-file"],"backgroundTag":"missing-resource-metadata-file","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"}