Boil the pasta. Bring a large pot of salted water to a boil.
Cook the pasta according to package directions until al dente. Reserve about 1/2 cup of pasta water, then drain and set aside.
Sauté the aromatics. In a large skillet, heat the olive oil over medium heat. Add the onion and a pinch of salt.
Cook for 4–5 minutes, stirring occasionally, until soft and translucent. Add the garlic and cook 30–60 seconds, until fragrant.
Toast the spices. Sprinkle in cumin, smoked paprika, chili powder, and red pepper flakes if using. Stir for 30 seconds to wake up the flavors.
Don’t let the spices burn.
Build the sauce. Stir in the crushed tomatoes, tomato paste, non-dairy milk (or broth), and maple syrup. Season with 1/2 teaspoon salt and a few grinds of black pepper. Bring to a gentle simmer.
Add the beans. Fold in the black beans.
If using bell pepper or corn, add them now. Simmer for 6–8 minutes, stirring occasionally, until the sauce slightly thickens and the flavors meld.
Adjust consistency. If the sauce seems too thick, add a splash of reserved pasta water. If it’s thin, let it simmer another minute or two.
You want a silky, clingy texture that coats the pasta.
Finish with lime and greens. Stir in the lime juice. If using spinach, add it now and wilt for 1 minute. Taste and adjust salt, pepper, and heat as needed.
Toss with pasta. Add the drained pasta to the skillet and toss to coat evenly.
If needed, add more pasta water a tablespoon at a time to help the sauce hug the noodles.
Serve and garnish. Top with chopped cilantro. Add avocado slices or extra lime wedges if you like. Serve hot.