{"record":{"id":"72f05742dc439f12","repo":"windmill-labs/windmill","slug":"wmillignore-is-not-supported-anymore-switch-to-w","errorCode":null,"errorMessage":".wmillignore is not supported anymore, switch to wmill.yaml","messagePattern":"\\.wmillignore is not supported anymore, switch to wmill\\.yaml","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/sync/sync.ts","lineNumber":3105,"sourceCode":"  ) {\n    whitelist = {\n      approve(file: string): boolean {\n        return (\n          (!wmillconf.includes ||\n            wmillconf.includes?.some((i) => minimatch(file, i))) &&\n          (!wmillconf?.excludes ||\n            wmillconf.excludes!.every((i) => !minimatch(file, i))) &&\n          (!wmillconf.extraIncludes ||\n            wmillconf.extraIncludes.length === 0 ||\n            wmillconf.extraIncludes.some((i) => minimatch(file, i)))\n        );\n      },\n    };\n  }\n\n  try {\n    await stat(\".wmillignore\");\n    throw Error(\".wmillignore is not supported anymore, switch to wmill.yaml\");\n  } catch {\n    //expected\n  }\n\n  // new Gitignore.default({ initialRules: ignoreContent.split(\"\\n\")}).ignoreContent).compile();\n\n  return (p: string, isDirectory: boolean) => {\n    // Without the option, `locks/` is not Windmill's: a repo that keeps its own\n    // lockfiles there would otherwise see them pulled into the diff and deleted\n    // as absent from a remote that never serializes shared locks.\n    if (\n      !wmillconf.dedupeLockfiles &&\n      (p === SHARED_LOCK_DIR || p.startsWith(SHARED_LOCK_DIR + SEP))\n    ) {\n      return true;\n    }\n    const ext = wmillconf.json ? \".json\" : \".yaml\";\n    if (!isDirectory && p.endsWith(\".resource-type\" + ext)) {","sourceCodeStart":3087,"sourceCodeEnd":3123,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/sync/sync.ts#L3087-L3123","documentation":"The legacy .wmillignore file is no longer honored by wmill sync. To prevent silently ignoring different files than the user expects, sync throws immediately when a .wmillignore file exists, telling you to migrate to wmill.yaml.","triggerScenarios":"Running any wmill sync command (push/pull) from a folder containing a .wmillignore file; the stat('.wmillignore') check succeeds and the error is thrown.","commonSituations":"Upgrading the CLI from an older version where .wmillignore worked; a repo cloned from an old template containing .wmillignore.","solutions":["Delete .wmillignore from the sync folder","Re-express the ignore rules in wmill.yaml (the current configuration file)","Re-run the sync command after migrating"],"exampleFix":"// before\n.wmillignore:\n  node_modules/\n// after (wmill.yaml)\ninclude:\n  - \"**\"\nexclude:\n  - node_modules/**","handlingStrategy":"validation","validationCode":"try { await Deno.stat('.wmillignore'); throw new Error('Migrate .wmillignore to wmill.yaml before running sync'); } catch (e) { if (!(e instanceof Error) || !e.message.startsWith('Migrate')) { /* file absent — ok */ } }","typeGuard":"async function hasLegacyIgnore(dir = '.'): Promise<boolean> { try { await Deno.stat(`${dir}/.wmillignore`); return true; } catch { return false; } }","tryCatchPattern":"try { await syncPush(); } catch (e) { if (String(e.message).includes('.wmillignore')) { console.error('Delete .wmillignore and move its rules into wmill.yaml, then retry.'); } else throw e; }","preventionTips":["Remove .wmillignore when upgrading the CLI","Keep ignore/exclude rules only in wmill.yaml","Add a repo check that fails CI if .wmillignore exists"],"tags":["cli","sync","deprecated","config"],"backgroundTag":"deprecated-config-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"}