{"record":{"id":"2dcc642d6f8d9f65","repo":"windmill-labs/windmill","slug":"existingname-wired-add-opts-hint-manual","errorCode":null,"errorMessage":"${existingName}: ${wired}. Add ${opts.hint} manually to pick up wmill's recommended settings (incl. workspace /f/, /u/ import resolution).","messagePattern":"(.+?): (.+?)\\. Add (.+?) manually to pick up wmill's recommended settings \\(incl\\. workspace /f/, /u/ import resolution\\)\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cli/src/commands/refresh/tsconfig.ts","lineNumber":377,"sourceCode":"  // The file is still exactly what a previous CLI generated → it's ours, so\n  // migrate it to the new split (replace with the thin stub that extends the\n  // managed file). No prompt: we're not touching user-authored content.\n  if (opts.legacyFormats?.some((fmt) => deepEqual(parsed, fmt))) {\n    writeFileSync(existing, JSON.stringify(opts.create, null, 2) + \"\\n\");\n    log.info(\n      colors.green(\n        `Migrated previously-generated ${existingName} to reference ${opts.token}`\n      )\n    );\n    return;\n  }\n\n  // Custom config. Try wiring a clone so we can report un-wireable cases without\n  // mutating, then only persist with the user's consent.\n  const next = JSON.parse(JSON.stringify(parsed)) as Record<string, unknown>;\n  const wired = opts.wire(next);\n  if (wired !== true) {\n    log.warn(\n      `${existingName}: ${wired}. Add ${opts.hint} manually to pick up wmill's ` +\n        `recommended settings (incl. workspace /f/, /u/ import resolution).`\n    );\n    return;\n  }\n\n  const consent = opts.mode.assumeYes\n    ? true\n    : opts.mode.interactive\n    ? await Confirm.prompt({\n        message:\n          `${existingName} isn't linked to wmill's ${opts.token}. Add ${opts.hint}? ` +\n          `Your settings are preserved (it's inserted first, so your config wins).`,\n        default: true,\n      })\n    : false;\n\n  if (!consent) {","sourceCodeStart":359,"sourceCodeEnd":395,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/refresh/tsconfig.ts#L359-L395","documentation":"During `wmill refresh tsconfig` (or the Deno import-map variant), wmill tries to merge its recommended compiler settings into an existing tsconfig.json via opts.wire(). The merge is non-mutating: if the custom config cannot be wired (e.g. an 'extends' chain or non-object fields prevent inserting the needed entries), wmill warns instead of silently rewriting the file and asks the user to add the setting manually so workspace /f/ and /u/ import paths resolve.","triggerScenarios":"Running `wmill refresh tsconfig` (or `wmill refresh deno-import-map`) in a project whose tsconfig.json is too custom for the automatic wiring — typically a config extending a third-party preset the merger cannot traverse, or conflicting entries it refuses to overwrite.","commonSituations":"Projects using tsconfig presets (SvelteKit, Vite, Nx) where 'extends' hides the real config; monorepos with hand-tuned compilerOptions; CI refresh runs where the local tsconfig drifted from the one wmill generated earlier.","solutions":["Open tsconfig.json and add the setting named in the warning (per opts.hint, e.g. paths / baseUrl entries) by hand","Temporarily rename or simplify tsconfig.json, re-run `wmill refresh tsconfig` to get a working baseline, then re-apply custom settings on top","Check for an 'extends' preset blocking the merge and inline the needed compilerOptions instead"],"exampleFix":"// before (tsconfig.json)\n{ \"extends\": \"@tsconfig/svelte/tsconfig.json\" }\n// after\n{\n  \"extends\": \"@tsconfig/svelte/tsconfig.json\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": { \"/f/*\": [\"./.wmill/gen/frontend/*\"], \"/u/*\": [\"./.wmill/gen/user/*\"] }\n  }\n}","handlingStrategy":"validation","validationCode":"const cfg = JSON.parse(fs.readFileSync('tsconfig.json','utf8')); if (cfg.extends) console.warn('preset may block wmill wiring');","typeGuard":"function isPlainObject(v: unknown): v is Record<string, unknown> { return typeof v === 'object' && v !== null && !Array.isArray(v); }","tryCatchPattern":null,"preventionTips":["Avoid deep extends chains","Re-run refresh after manual edits","Commit generated paths"],"tags":["cli","tsconfig","configuration"],"backgroundTag":"tsconfig-not-wired","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"}