After the latest updates, Cursor is breaking valid JSX/TSX code on save.
This happens every single time I save a file, even with very small edits. It affects not only className strings (Tailwind), but also entire JSX tags and structure.
The IDE removes closing quotes or breaks JSX syntax, making the code invalid. I constantly have to undo (Cmd + Z) after saving.
This is happening on every file, not just specific components.
For AI issues: which model did you use?
Model name (e.g., Sonnet 4, Tab…)
For AI issues: add Request ID with privacy disabled
Request ID: f9a7046a-279b-47e5-ab48-6e8dc12daba1
For Background Agent issues, also post the ID: bc-…
Additional Information
Add any other context about the problem here.
Does this stop you from using Cursor?
Yes - Cursor is unusable
Sometimes - I can sometimes use Cursor
No - Cursor works, but with this issue
The more details you provide, the easier it is for us to reproduce and fix the issue. Thanks!
or removing source.fixAll improve the behavior and it’s a bit more stable.
Still not sure why this didn’t happen before, it’s long time I’ve this setup and it started this strange behavior just after last update of cursor (possibly due to updates in Cursor / ESLint / plugins), but sharing in case others hit the same issue.
Hey, thanks for the detailed report and for figuring out the root cause yourself.
Your find with editor.codeActionsOnSave and source.fixAll looks like the right direction. It was most likely a conflict between ESLint auto-fix running via source.fixAll and Tab autocomplete. They both try to change the code, and JSX ends up getting broken.
A few things that can help confirm what’s happening:
Check your ESLint extension version. It may have updated along with Cursor and triggered the conflict. You can try rolling the extension back to a previous version right click the extension > Install Another Version.
If the Tab issue still shows up, try temporarily turning off Cursor Tab in Cursor Settings > Features > Cursor Tab, then see if the problem goes away on save. This helps isolate whether it’s Tab or ESLint.
You can also try adding a timeout: "editor.codeActionsOnSaveTimeout": 5000. Sometimes a race between formatting and code actions can cause issues like this.
If switching to source.fixAll.eslint fully fixed it, you can mark the thread as solved so it’s easier for other users with the same setup. Let me know if anything else still reproduces.