Skip to content

feat: IDE-grade distro overhaul (LSP/DAP/AI/docs/tests + treesitter migration)#1

Closed
yashksaini-coder wants to merge 47 commits into
devfrom
feat/ide-distro-overhaul
Closed

feat: IDE-grade distro overhaul (LSP/DAP/AI/docs/tests + treesitter migration)#1
yashksaini-coder wants to merge 47 commits into
devfrom
feat/ide-distro-overhaul

Conversation

@yashksaini-coder
Copy link
Copy Markdown
Owner

@yashksaini-coder yashksaini-coder commented May 10, 2026

Summary

Eight-phase overhaul that turns this personal config into an IDE-grade Neovim distribution for systems languages, plus runtime fixes for errors uncovered during smoke testing.

Phase-by-phase delivery

  • Phase 1 — IDE LSP & DAP. Pyright/Gopls/Clangd settings; full DAP for Python (debugpy), Go (delve), JS/TS (js-debug-adapter); extended LSP keymaps (rename, signature help, type def, implementations, document/workspace symbols, call hierarchy, inlay-hint toggle); DAP scopes/frames/eval widgets.
  • Phase 2 — Per-language enrichment. rustaceanvim, clangd_extensions, go.nvim, lazydev, friendly-snippets.
  • Phase 3 — AI assistants. Claude Code, GitHub Copilot + CopilotChat, OpenCode — all coexisting under <leader>i (collision-free namespace).
  • Phase 4 — Productivity. flash, todo-comments, harpoon, oil, undotree, neogit, diffview, refactoring, zen-mode, twilight, mini.bufremove.
  • Phase 5 — Time. pomo.nvim pomodoro timer + clock segment in lualine. (samharju/stand.nvim retracted: phantom slug.)
  • Phase 6 — Docs site. VitePress site at https://yashksaini-coder.github.io/nvim/, GitHub Pages workflow on dev push, <leader>D keymap to open it from inside Neovim.
  • Phase 7 — Tests + CI. plenary.busted harness, make test target, neotest with python/go/rust/jest/plenary adapters, CI lint + test workflow on PR/push.
  • Phase 8 — Polish. README highlights, smoke test, stand.nvim retraction.

Post-sprint runtime fixes

  • c25e9e3 fix(refactoring): add lewis6991/async.nvim runtime dependency — refactoring.nvim 1.x requires require("async").
  • 8a3c436 fix(treesitter): migrate to nvim-treesitter main branch for Neovim 0.12master branch query predicates use deprecated match-by-name API; main is the rewrite.
  • 29d4e3c chore: update lazy-lock — captures new plugin pins.
  • 03ef783 docs(treesitter): correct package name — tree-sitter-cli, not tree-sitter — Arch package nuance.

Manual steps required after merge

  1. One-time GitHub UI: Settings → Pages → Source → GitHub Actions so docs deploy.
  2. System packages (Arch):
    sudo pacman -S luarocks dotnet-sdk tree-sitter-cli
    • luarocks for Mason's luacheck install
    • dotnet-sdk for Mason's csharpier install
    • tree-sitter-cli (NOT tree-sitter — that's only the C library) for nvim-treesitter main parser compilation. Alternatives: cargo install tree-sitter-cli or npm i -g tree-sitter-cli.
  3. First nvim run: :Lazy sync then :MasonToolsInstall then :TSInstall all (or specific parsers).
  4. AI auth one-time: :Copilot auth (device flow). claude binary already on $PATH. OpenCode server requires opencode listening on port 4096.

Verification

  • stylua --check lua/ exits 0
  • make test 3/3 plenary tests passing
  • nvim --headless clean startup (one informational notify if tree-sitter-cli is missing)
  • All 25 Mason tools installed (after the system-package step)
  • Docs site builds locally with cd docs-site && npm install && npx vitepress build
  • Both runtime errors from smoke testing are resolved

Test plan

  • make test — 3 plenary tests pass
  • make all (lint + fmt-check) clean
  • <leader>? enumerates new groups (i, j, n, p, D, G, R, u)
  • Open a Python file, set breakpoint, <leader>dc launches debugpy
  • Open a Go file, <leader>Gt runs tests
  • <leader>D opens https://yashksaini-coder.github.io/nvim/
  • <leader>Re on a visual selection extracts a function (refactoring.nvim)
  • Open complex markdown — render-markdown.nvim no longer throws range nil

Known follow-ups (not blockers)

  • <leader>cf collision (crates "show features" vs LSP format) — left for user to decide
  • <M-l>/<M-w> Copilot accept may collide with tmux Alt-prefix — set -g xterm-keys on resolves
  • incremental_selection (<CR>/<S-CR>/<BS> to expand TS nodes) lost in treesitter migration — install treewalker.nvim if needed
  • indent module for treesitter is gone too; built-in indent often suffices

🤖 Generated with Claude Code

yashksaini-coder and others added 30 commits May 10, 2026 00:20
8-phase plan covering LSP/DAP IDE features for C/C++/Rust/Go/Python/JS,
per-language enrichment, AI assistants (Claude/Copilot/OpenCode),
productivity plugins, time/pomodoro utilities, deployed VitePress
docs site, and plenary test harness with CI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…toggle keymaps

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Removes manual column alignment in mason ensure_installed comments and
collapses Go DAP config tables to stylua's canonical form. No behavior
change — formatter-only fixes for the Phase 1 additions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cmp.lua, snacks.lua, terminal.lua had small stylua violations predating
this branch. Cleared so Phase 7 CI (lint + test) passes cleanly when added.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
opencode.nvim's `ask(default, opts)` accepts only `submit` and `context`
keys; `range = true` was silently ignored. The plugin auto-detects the
visual selection from mode "v", so passing it explicitly is unnecessary.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Create lua/plugins/time/pomo.lua with epwalsh/pomo.nvim, pomodoro
  session schedule, and <leader>p keys for start/stop/hide/show
- Add pomo timer and HH:MM clock components to lualine_x in lualine.lua
- Register <leader>p group "pomo (timer/clock)" in which-key.lua

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Creates lua/plugins/time/stand.lua with samharju/stand.nvim configured
for a 50-minute break interval with startup_notification disabled.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
yashksaini-coder and others added 16 commits May 10, 2026 01:09
Add { import = "plugins.time" } to the lazy.nvim spec in
lua/config/lazy.lua so that pomo.nvim and stand.nvim are loaded
alongside the other plugin sub-trees.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Convert all Lua files from tab indentation to 2-space indentation
to match stylua --indent-type=Spaces --indent-width=2 --column-width=100,
ensuring `stylua --check lua/` exits 0 in CI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Makefile auto-generates stylua.toml on demand, but bare `stylua --check`
without the file uses default tab indentation, contradicting the project's
declared 2-space style. Committing the config eliminates that drift and
makes local and CI agree.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Single source of truth for formatting rules.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Disable stand.nvim (samharju/stand.nvim does not exist on GitHub);
lazy.nvim was looping on failed clones and crashing headless startup.
Marked enabled=false with a note until a working RSI plugin is found.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The samharju/stand.nvim slug referenced in the original plan is a phantom;
git ls-remote confirms the repo is missing. Removing the dead spec rather
than carrying enabled=false TODO code. README's Time-discipline bullet
revised to describe only the working pomo.nvim + lualine integration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
refactoring.nvim 1.x (the version aligned with Neovim 0.12) requires
`require("async")` at lua/refactoring.lua:45. The plugin's README
documents this dep but our spec didn't list it, so first load of the
refactor module would fail with `module 'async' not found`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…0.12

The legacy `master` branch crashes with `attempt to call method 'range'
(a nil value)` because its query predicates use the deprecated
match-by-name API while Neovim 0.12 only supports match-by-integer-ID.
Symptoms surfaced via render-markdown.nvim and snacks.image both calling
into vim.treesitter.parse() and tripping over the broken predicates.

Migrating to `main` (the nvim-treesitter rewrite) aligns with current
core treesitter. Trade-offs:
- No bundled `incremental_selection` (the prior <CR>/<S-CR>/<BS> bindings)
- No bundled `indent` module
- Requires `tree-sitter` CLI on $PATH for parser installation
  (`sudo pacman -S tree-sitter` or `npm i -g tree-sitter-cli`)

Install is gated on CLI presence so first boot is quiet rather than
spamming ENOENT for every parser. A one-line :notify warns when the
CLI is missing so the install step is discoverable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Captures the post-fix state:
- async.nvim added (refactoring.nvim runtime dep)
- FixCursorHold.nvim added (neotest dep)
- nvim-treesitter pinned to current main branch tip
- fff.nvim, gitsigns.nvim drift from upstream master

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 10, 2026 08:03
@bolt-new-by-stackblitz
Copy link
Copy Markdown

Review PR in StackBlitz Codeflow Run & review this pull request in StackBlitz Codeflow.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR significantly expands the Neovim configuration into a more “distribution-like” setup with IDE features (LSP/DAP), per-language tooling, AI assistants, a docs site (VitePress + Pages workflow), and basic CI/test harness.

Changes:

  • Adds/updates plugin specs for LSP, DAP, Treesitter (migrated to nvim-treesitter main), testing (neotest + plenary), AI integrations, and editor productivity tools.
  • Introduces a VitePress docs site with a GitHub Pages deploy workflow and in-editor keymaps to open docs.
  • Adds minimal headless test harness (make test) and CI workflows for linting/tests.

Reviewed changes

Copilot reviewed 63 out of 109 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
tests/utils/docs_spec.lua Adds a small plenary test for the docs helper module.
tests/minimal_init.lua Minimal init to run plenary tests headlessly.
stylua.toml Adds StyLua formatting configuration.
README.md Adds “Highlights” section describing the new distro features.
Makefile Adds make test target for plenary tests.
lua/utils/snippets.lua Formatting/cleanup of snippet insertion helpers and keymaps.
lua/utils/docs.lua Adds a helper to open the hosted docs URL.
lua/utils/boiler_plates.lua Formatting/cleanup of boilerplate loader keymaps.
lua/plugins/which-key.lua Expands which-key groups/labels for new keymaps and features.
lua/plugins/trouble.lua Formatting-only change.
lua/plugins/treesitter.lua Migrates treesitter config to main branch + CLI-gated installs + vim.treesitter.start.
lua/plugins/tip.lua Formatting-only change.
lua/plugins/time/pomo.lua Adds pomo.nvim timer plugin config + keymaps.
lua/plugins/themes/themery.lua Formatting-only change for Themery + default theme autocmd.
lua/plugins/themes/rose-pine.lua Formatting-only change.
lua/plugins/themes/osmium.lua Formatting-only change.
lua/plugins/themes/kanagawa.lua Formatting-only change.
lua/plugins/themes/gruvbox.lua Formatting-only change.
lua/plugins/themes/chai.lua Formatting-only change.
lua/plugins/themes/catppuccin.lua Formatting-only change.
lua/plugins/terminal.lua Formatting-only change to toggleterm config and terminal definitions.
lua/plugins/telescope.lua Formatting-only change; includes snacks image preview + buffer validity workaround.
lua/plugins/snacks.lua Formatting-only change; keeps image + indent configuration.
lua/plugins/smear-cursor.lua Formatting-only change.
lua/plugins/render-markdown.lua Formatting-only change.
lua/plugins/project.lua Formatting-only change.
lua/plugins/nvim-tree.lua Formatting-only change.
lua/plugins/numb.lua Formatting-only change.
lua/plugins/notify.lua Formatting-only change.
lua/plugins/noice.lua Formatting-only change (keeps view/layout/LSP overrides).
lua/plugins/neotest.lua Adds neotest + adapters and keymaps.
lua/plugins/mini/mini-map.lua Formatting-only change.
lua/plugins/mini/mini-icons.lua Formatting-only change.
lua/plugins/mini/mini-cursorword.lua Formatting-only change.
lua/plugins/mason.lua Expands Mason tool installation list for multi-language IDE tooling.
lua/plugins/lualine.lua Adds pomo timer + clock segment to lualine.
lua/plugins/lspkind.lua Formatting-only change.
lua/plugins/lsp.lua Enables/configures additional LSP servers (pyright/gopls/clangd).
lua/plugins/leetcode.lua Formatting-only change.
lua/plugins/lang/rustaceanvim.lua Adds rustaceanvim configuration for Rust tooling.
lua/plugins/lang/lazydev.lua Adds lazydev for improved Lua/Neovim API completion/types.
lua/plugins/lang/go.lua Adds go.nvim with formatting/imports-on-save autocmd.
lua/plugins/lang/friendly-snippets.lua Adds friendly-snippets and loads local snippet paths.
lua/plugins/lang/clangd-extensions.lua Adds clangd_extensions with C/C++ helper commands/keymaps.
lua/plugins/git.lua Formatting-only change.
lua/plugins/fff.lua Formatting-only change.
lua/plugins/ferris.lua Formatting-only change.
lua/plugins/editor/zen-mode.lua Adds zen-mode config + toggle keymap.
lua/plugins/editor/undotree.lua Adds undotree config + toggle keymap.
lua/plugins/editor/twilight.lua Adds twilight config + toggle keymap.
lua/plugins/editor/todo-comments.lua Adds todo-comments with Trouble/Telescope integration keymaps.
lua/plugins/editor/refactoring.lua Adds refactoring.nvim with async.nvim dep + keymaps.
lua/plugins/editor/oil.lua Adds oil.nvim config and - keymap.
lua/plugins/editor/neogit.lua Adds neogit config + keymap.
lua/plugins/editor/mini-bufremove.lua Adds mini.bufremove with safer buffer-delete keymaps.
lua/plugins/editor/harpoon.lua Adds harpoon2 with keymaps (currently defined via keys = function()).
lua/plugins/editor/flash.lua Adds flash.nvim motion keymaps.
lua/plugins/editor/diffview.lua Adds diffview config + keymaps.
lua/plugins/dap.lua Expands DAP setup to Python/Go/JS + signs + UI configuration.
lua/plugins/crates.lua Formatting-only change.
lua/plugins/conform.lua Formatting-only change; keeps formatter mappings and per-ft config.
lua/plugins/compiler.lua Formatting-only change.
lua/plugins/cmp.lua Adds lazydev completion source + formatting cleanup.
lua/plugins/cellular-automation.lua Formatting-only change.
lua/plugins/bufferline.lua Formatting-only change.
lua/plugins/barbecue.lua Formatting-only change.
lua/plugins/autotag.lua Formatting-only change.
lua/plugins/autopairs.lua Formatting-only change.
lua/plugins/alpha.lua Formatting-only change in dashboard config.
lua/plugins/ai/opencode.lua Adds OpenCode integration + keymaps.
lua/plugins/ai/copilot.lua Adds copilot.lua + CopilotChat with <leader>i namespace keymaps.
lua/plugins/ai/claude-code.lua Adds claude-code.nvim integration + keymaps.
lua/plugins/aerial.lua Formatting-only change.
lua/lsps/ts_ls.lua Formatting-only change.
lua/lsps/ruby_lsp.lua Formatting-only change.
lua/lsps/pyright.lua Adds pyright settings.
lua/lsps/lua_ls.lua Formatting-only change.
lua/lsps/gopls.lua Adds gopls settings.
lua/lsps/csharp.lua Formatting-only change.
lua/lsps/clangd.lua Adds clangd command/init options.
lua/config/options.lua Formatting-only change.
lua/config/nvim-diagnostics.lua Formatting-only change.
lua/config/lazy.lua Expands lazy imports (lang/ai/editor/time) and formatting cleanup.
lua/config/keymaps/trouble.lua Formatting-only change.
lua/config/keymaps/terminal.lua Formatting-only change.
lua/config/keymaps/mini-tabline.lua Formatting-only change.
lua/config/keymaps/lsp.lua Major expansion of LSP-related keymaps (symbols, calls, inlay toggle, etc.).
lua/config/keymaps/init.lua Adds docs keymaps module require.
lua/config/keymaps/git.lua Formatting-only change.
lua/config/keymaps/general.lua Formatting-only change.
lua/config/keymaps/fff.lua Formatting-only change.
lua/config/keymaps/docs.lua Adds keymaps for opening online docs pages.
lua/config/keymaps/dap.lua Expands DAP keymaps (hover/scopes/frames/eval).
lua/config/keymaps/crates.lua Formatting-only change.
lua/config/keymaps/compiler.lua Formatting-only change.
lazy-lock.json Updates plugin pins to match new/changed plugin set.
docs-site/plugins.md Adds plugin reference page (currently includes an outdated stand.nvim entry).
docs-site/package.json Adds VitePress docs site package definition.
docs-site/languages.md Adds language support matrix.
docs-site/keymaps.md Adds keymap reference documentation.
docs-site/index.md Adds VitePress home page content.
docs-site/getting-started.md Adds installation/getting-started guide.
docs-site/ai.md Adds AI assistants documentation.
docs-site/.vitepress/config.mjs Adds VitePress site configuration (base, nav, sidebar, edit links).
.gitignore Ignores docs-site build/cache artifacts and node_modules.
.github/workflows/docs-deploy.yml Adds Pages deployment workflow for docs-site on dev pushes.
.github/workflows/ci.yml Adds CI lint (stylua/luacheck) and headless test job.
Files not reviewed (1)
  • docs-site/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lua/utils/docs.lua
Comment on lines +8 to +11
if vim.fn.has("mac") == 1 then
opener = "open"
elseif vim.fn.has("unix") == 1 then
opener = "xdg-open"
Comment thread lua/utils/docs.lua
Comment on lines +12 to +19
elseif vim.fn.has("win32") == 1 then
opener = "start"
else
vim.notify("Unsupported platform for opening URLs", vim.log.levels.WARN)
return
end
vim.fn.jobstart({ opener, url }, { detach = true })
vim.notify("Opened " .. url, vim.log.levels.INFO)
Comment thread lua/plugins/which-key.lua
Comment on lines +41 to +43
{ "<leader>q", desc = "Quit all" },
{ "<leader>r", group = "rust (ferris)" },
{ "<leader>s", group = "search/snippets" },
Comment on lines +5 to +8
keys = function()
local harpoon = require("harpoon")
harpoon:setup({})
local keys = {
Comment thread lua/plugins/dap.lua
Comment on lines +233 to +239
-- Python (debugpy)
local mason_path = vim.fn.stdpath("data") .. "/mason/packages"
dap.adapters.python = {
type = "executable",
command = mason_path .. "/debugpy/venv/bin/python",
args = { "-m", "debugpy.adapter" },
}
Comment thread tests/minimal_init.lua
Comment on lines +6 to +10
local plenary = vim.fn.stdpath("data") .. "/lazy/plenary.nvim"
if vim.fn.isdirectory(plenary) == 0 then
vim.fn.system({
"git", "clone", "--depth=1",
"https://github.com/nvim-lua/plenary.nvim",
Comment thread docs-site/plugins.md
Comment on lines +1 to +4
# Plugins

This page is generated from `lazy-lock.json`. See `:Lazy` in Neovim for live state.

Comment thread docs-site/plugins.md
## Time

- **pomo.nvim** — pomodoro timer in lualine
- **stand.nvim** — 50-min RSI reminder
Comment thread lua/plugins/treesitter.lua Outdated
Comment on lines +15 to +16
-- Requires the `tree-sitter` CLI on $PATH (`sudo pacman -S tree-sitter-cli`
-- or `npm i -g tree-sitter-cli`).
…tter

On Arch, `tree-sitter` is the C library only; the binary required by
nvim-treesitter `main` lives in the separate `tree-sitter-cli` package
(extra repo). Updated the runtime warning and file-header docs so users
don't lose time chasing the wrong package.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@yashksaini-coder
Copy link
Copy Markdown
Owner Author

Closing per request — taking the work in a different direction. Branch deleted. Local archive tag preserved at archive/ide-distro-overhaul-2026-05-10 if any commit needs to be cherry-picked later.

@yashksaini-coder yashksaini-coder deleted the feat/ide-distro-overhaul branch May 10, 2026 08:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants