nvim/.config/nvim/lua/util/root.lua

-- nvim/.config/nvim/lua/util/root.lua
-- Detect project root by LSP workspace, then root markers, then cwd.

local M = {}

local MARKERS = {
  ".git", "Cargo.toml", "go.mod", "pyproject.toml",
  "package.json", "Makefile", "flake.nix", ".hg",
}

---@param bufnr integer|nil
function M.get(bufnr)
  bufnr = bufnr or 0
  local path = vim.api.nvim_buf_get_name(bufnr)
  if path == "" then return vim.uv.cwd() end
  path = vim.fs.normalize(path)

  -- 1) LSP workspace folders
  for _, c in ipairs(vim.lsp.get_clients({ bufnr = bufnr })) do
    local wfs = c.workspace_folders or {}
    for _, w in ipairs(wfs) do
      local wpath = vim.uri_to_fname(w.uri)
      if path:sub(1, #wpath) == wpath then return wpath end
    end
  end

  -- 2) Walk up for a known marker
  local found = vim.fs.find(MARKERS, { upward = true, path = vim.fs.dirname(path) })[1]
  if found then return vim.fs.dirname(found) end

  -- 3) Fallback: cwd
  return vim.uv.cwd()
end

function M.cd()
  local r = M.get()
  vim.cmd.lcd(r)
  vim.notify("lcd " .. r, vim.log.levels.INFO)
end

return M