To fix a broken build after a Cursor project-wide refactor, start by running git diff --stat to identify all modified files, then clean and rebuild with rm -rf node_modules package-lock.json && npm install. The most common causes are broken import paths, out-of-sync TypeScript type definitions, and stale build caches. This guide provides a systematic five-step recovery process covering import fixes, type consistency, configuration files, and dependency resolution.
Understanding What Happens During Project-Wide Refactor
When you use Cursor’s project-wide refactor capability, the AI analyzes your entire codebase and applies changes across multiple files simultaneously. This includes renaming variables, updating function signatures, moving code between modules, and rewriting imports. The problem is that automated refactoring doesn’t always account for:
- Build configuration files that reference old variable names
- Generated files that get overwritten
- Circular dependency issues created by new import patterns
- TypeScript type definitions that become inconsistent
- Environment-specific configuration
Common Build Errors After Project-Wide Refactor
Module Resolution Failures
The most frequent issue you’ll encounter is module resolution failures. After refactoring, imports often point to non-existent paths or use outdated module names.
Error messages you might see:
Cannot find module '@/components/Header'Module not found: Error: Can't resolve './utils/helpers'ESM module error: The requested module does not provide an export
TypeScript Compilation Errors
TypeScript errors explode after a refactor because type definitions get out of sync with implementation.
Typical errors:
Type error: Property 'x' is missing in type 'Y'Type 'A' is not assignable to type 'B'Cannot find name 'OldFunctionName'
Dependency Conflicts
Refactoring can introduce incompatible dependency versions or orphaned packages.
Watch for:
ERESOLVE could not resolveConflicting peer dependencyPackage not found: @old/package-name
Step-by-Step Fix Guide
Step 1: Identify the Scope of Damage
Before making changes, understand the extent of the refactor damage:
# Check git status to see all modified files
git status
# See the diff of changes
git diff --stat
# Look for untracked files that might be orphaned
git status -u
Run your build to get a complete error list:
# For npm projects
npm run build 2>&1 | tee build-errors.log
# For yarn
yarn build 2>&1 | tee build-errors.log
# For pnpm
pnpm build 2>&1 | tee build-errors.log
Step 2: Fix Import Statements
Import issues are usually the quickest to resolve. Cursor often misses updating imports when files move or rename.
Use this diagnostic script to find broken imports:
# Find all import statements referencing old names
grep -r "from ['\"]@old/module" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" .
# Find relative imports to moved files
grep -r "from ['\"]\.\." --include="*.ts" --include="*.tsx" src/
For TypeScript projects, verify your tsconfig.json paths configuration:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"]
}
}
}
Step 3: Restore Type Consistency
TypeScript errors after refactoring typically stem from:
Interface changes may not propagate fully. Create a type migration map. If User interface changed, find all files using User:
grep -r "interface User" --include="*.ts" src/
grep -r ": User)" --include="*.ts" src/
Generic type parameters may be mismatched. Check function signatures across your codebase:
grep -r "function.*<.*>" --include="*.ts" src/
Enum values may have been renamed. Enums are particularly fragile, so search for hardcoded enum usages:
grep -r "Status\." --include="*.ts" src/
Step 4: Clean and Rebuild
Cached files often cause false positives after refactoring:
# Clear node_modules and reinstall
rm -rf node_modules package-lock.json
npm install
# Clear TypeScript cache
rm -rf .tsbuildinfo
rm -rf node_modules/.cache
# Clear any bundler cache
rm -rf .next # Next.js
rm -rf dist # Vite/Webpack
rm -rf build # Create React App
Step 5: Fix Configuration Files
Build configurations often reference old names. Check these common files:
tsconfig.json— path aliases and includesnext.config.jsornext.config.mjs— webpack aliasesvite.config.ts— resolve aliasesjest.config.js— module name mappers.eslintrc— rule configurations referencing old names
Example vite.config.ts fix:
import { defineConfig } from 'vite'
import path from 'path'
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
// Add missing aliases here
}
}
})
Diagnostic Tips for Complex Cases
Circular Dependency Detection
Run this to find circular dependencies:
# Using npm
npm install -D circular-dependency-plugin
# Or use Node's built-in analyzer
node -e "require('module')._load('./src/index.js', {}, true)"
Version Conflict Resolution
If you see dependency conflicts:
# Analyze dependency tree
npm ls <package-name>
# Find what requires the old package
npm why <package-name>
# Use npm-check-updates to see available updates
npx npm-check-updates
Rollback Strategy
If the refactor broke too much, consider a staged rollback:
# Create a backup branch before major refactors
git branch backup-pre-refactor
# Revert specific files
git checkout HEAD -- src/components/OldComponent.tsx
# Or use git reflog to find before-refactor state
git reflog
git checkout <commit-hash> -- .
Prevention
Avoid future build breaks with these practices:
- Run incremental builds during refactoring, not just at the end
- Use type-safe refactoring with TypeScript’s rename feature instead of AI-only changes
- Commit before large refactors so you can easily rollback
- Test the build after each major change rather than waiting until the end
Related Reading
Built by theluckystrike — More at zovo.one