- Replace the old install script with a real CLI in
bin/ - Add a dedicated test runner under
tests/ - Rename
TODOtoTODO.md - Remove exploratory Lua files not used by the runtime config
- Decide whether
.tmux.confbelongs in this repository - Add
LICENSE.mdafter validating the license choice
- Add a first failing smoke-level CLI test suite
- Make the initial CLI tests pass
- Add a Neovim startup smoke test for
init.lua - Add regression tests for startup failures fixed in the config
- Fix invalid
null-lssources - Remove or replace deprecated
nvim-treeoptions - Migrate legacy
kyazdani42plugin namespaces to maintained repositories - Replace
null-ls.nvimwith the maintainednone-ls.nvimrepository - Remove references to plugins or features that are not installed
- Consolidate diagnostics UX on
trouble.nvimand removediaglist - Audit keymaps that depend on optional plugins
- Replace
nvim-lsp-installerwith a maintained setup - Update deprecated LSP capability and formatting calls
- Define an explicit maintained baseline for default LSP servers
- Validate
nvim-cmpandLuaSnipend-to-end - Add regression coverage for LSP bootstrap failures
- Migrate LSP config to mason-lspconfig v2 API (
setup_handlersremoved in v2.0.0)
- Replace
ensure_installed = 'all'with an explicit parser list - Remove unsupported Treesitter modules or add the missing plugins
- Verify
lualine,bufferline,telescope, andtroublestartup paths - Migrate Trouble keymaps from v1 API (
workspace_diagnostics,document_diagnostics) to current API - Replace
nvim-treewithneo-tree.nvim - Decide whether
nvim-gpsshould be replaced withnvim-navicoraerial.nvim - Remove
lsp-colors.nvim(redundant with Neovim 0.9+ built-in diagnostic highlights) - Audit Telescope extensions and remove unused or redundant integrations
- Write a keybindings cheatsheet covering all custom mappings and plugin shortcuts
- Write extended usage documentation (LSP workflow, completion, diagnostics, telescope, bufferline)
- Add
<Leader>?keymap to open Telescope keymaps picker (in-Neovim discoverability) - Annotate which-key groups with descriptions (
<Leader>f= Find,<Leader>d= Diagnostics, etc.)
- Add bash completion support to the CLI
- Add zsh completion support to the CLI
- Add fish completion support to the CLI
- Rewrite
installto cover symlink/bootstrap flows explicitly - Document external dependencies required by the Neovim config
- Document bootstrap limitations in sandboxed or Snap-based environments
- Add
install nvim [--snap|--apt]subcommand (snap by default, checks if already installed) - Extend
install allto includeinstall nvimin the full bootstrap chain - Add
update nvimsubcommand (snap refresh or apt upgrade depending on install method) - Add
update pluginssubcommand (headlessLazy! syncvia nvim --headless) - Add
updatesubcommand dispatching toupdate nvim+update plugins - Document Neovim installation (minimum version, recommended method per platform)
- Document first-run initialization sequence (lazy.nvim bootstrap → plugin install → Mason LSP server install)
- Document full end-to-end setup flow for a new machine in README
- Decide whether to keep
packer.nvimor migrate to a maintained plugin manager - Normalize plugin declarations and config loading patterns
- Reduce eager startup side effects where not needed
- Design project profiles so Neovim can enable only relevant tooling per repository
- Decide whether the CLI should manage project profiles or only bootstrap them
- Add in-Neovim profile switcher:
:NvimProfile <name>user command + Telescope picker (depends on profile design) - Move frontend-only tooling such as
emmet-vimbehind project profiles - Move Node-specific Telescope integrations behind project profiles
- Decide whether
none-ls.nvimshould remain global or have profile-driven sources
Two interchangeable UI variants:
classic(current stack) andmodern(snacks.nvim suite). Variant chosen at Neovim startup. Default isclassicunless.nvim-uiexists at the config root. CLI manages the file;.nvim-uiis gitignored.Design: Option B — independent of the profile system. Layout: lua/ui/variant.lua — reads .nvim-ui, returns 'classic' (default) or 'modern' lua/ui/shared.lua — colorscheme, lualine, bufferline, nvim-navic (common to both variants) lua/ui/classic.lua — telescope (fzf + node_modules extensions), which-key, trouble lua/ui/modern.lua — snacks.nvim (picker, notifier, dashboard)
Evaluation result: snacks.nvim has no statusline or breadcrumb module. lualine and nvim-navic stay in shared.lua for both variants. The visible difference: picker (snacks vs telescope) and notifications.
CLI: nvim-config ui set classic|modern / nvim-config ui unset
- Evaluate
snacks.nvimas the modern variant foundation (picker, statusline, notifier, dashboard, breadcrumb) - Implement
lua/ui/structure (variant, shared, classic, modern) - Move current UI plugins into
lua/ui/classic.lua - Implement
lua/ui/modern.luaonce evaluation is done - Add
nvim-config ui set|unsetCLI subcommand - Add
.nvim-uito.gitignore
- Split
tests/nvim-config.batsby domain (CLI, profiles, LSP/completion, UI/plugins, docs) for readability
Incremental improvements with high daily value, low implementation cost. Ordered by recommended priority.
- Clear search highlight —
<Leader><CR>in normal mode to call:noh - Auto-save on focus loss — autocmd
FocusLost/BufLeave→:silent! wa -
gitsigns.nvim— inline diff signs, line blame, hunk navigation (]h/[h), stage/reset hunk - Line number toggle —
<Leader>tncycles absolute → relative → none; new<Leader>tToggle group
-
:w!!sudo save — write system files without relaunching Neovim as root -
:Cheatpicker —:Cheatwith no argument opensvim.ui.select(variant-agnostic); with argument opens directly - Session restore —
persistence.nvim: auto-restore on startup (no args),<Leader>qsrestore,<Leader>qdstop
- Persistent colorscheme system —
lua/ui/theme.lua,.nvim-theme(gitignored), 14 dark themes - 4 new colorscheme plugins — catppuccin (3 variants), tokyonight (3), kanagawa (2), gruvbox-material
-
theme-initlazy.nvim spec atpriority=0— applies active colorscheme after all plugins, prevents flash -
:Theme [name]user command — applies and persists colorscheme, tab-completion on all 14 names -
nvim-config theme set|unsetCLI subcommand — mirrorsuicommand; bash and zsh completions updated -
render-markdown.nvim— in-buffer markdown rendering (headings, code blocks, bullets, checkboxes, tables); lazy-loaded onft=markdown - Bash shebang detection — extensionless files with
#!/.../bin/bashor#!/.../env bashauto-detected asshviavim.filetype.add - Keymaps cleanup —
<C-s>added in normal mode;<C-z>and<C-r>removed from insert mode (terminal conflicts, native Vim override) - Test coverage — 43 new tests (229 total) covering all Phase 12 additions
-
harpoon(ThePrimeagen/harpoon2) — mark/jump to 4-5 key files per project (<Leader>ha,<Leader>hh,<C-1..4>) -
vim-illuminate— auto-highlight all occurrences of the word under cursor
-
friendly-snippets— already wired as LuaSnip dependency with lazy_load() -
nvim-spectre— project-wide search/replace (<Leader>sr,<Leader>sw) -
mini.ai— extended text objects: function args, brackets across lines (ia/aa), n_lines=500
-
diffview.nvim— enhanced diff view (<Leader>gv) and per-file git history (<Leader>gH); complements gitsigns -
lazygit.nvim— open lazygit in a floating terminal window from inside Neovim
-
todo-comments.nvim— colorise TODO/FIXME/HACK/NOTE in code; list all via Telescope (<Leader>ft) -
indent-blankline.nvim— visual indent guides (essential for YAML, Python, nested Lua)
-
neotest— run and visualise test results inside Neovim (bats, phpunit, jest...)-
neotest-bashadapter — bats-core support - Profile-driven adapters:
neotest-vitest(web),neotest-phpunit(php/laravel),neotest-rust(rust) — loaded viaprofiles.get_neotest_adapters()+ profileneotest_adaptersfield
-
-
nvim-dap+nvim-dap-ui— interactive debugger with breakpoints and UI-
nvim-dap-virtual-text— inline variable values during debug -
one-small-step-for-vimkind— Lua DAP adapter (built-in, no Mason install) - Profile-driven adapters: pwa-node/JS-TS (web), Xdebug/PHP (php/laravel), codelldb/Rust (rust)
- Auto-install DAP Mason packages at startup via
profiles.get_dap_mason_packages()+ Mason registry
-
-
zen-mode.nvim— distraction-free fullscreen mode (<Leader>tz)
-
toggleterm.nvim— floating terminal (<C-\>,<Leader>tt); dedicated Claude Code (<Leader>tC) and Codex CLI (<Leader>tX) instances -
install claudeCLI subcommand — install Claude Code CLI (npm install -g @anthropic-ai/claude-code); skips if present; errors if npm missing -
install codexCLI subcommand — install OpenAI Codex CLI (npm install -g @openai/codex); same guards -
codeium.nvim— free inline AI completion; nvim-cmp source[AI];:Codeium Authon first use -
avante.nvim— Cursor-like AI assistant (chat + inline edits);auth_type = "pro"authenticates via Claude Pro subscription (browser OAuth, no API key required); also supports GPT-4o - Gemini CLI —
@google/gemini-cli(npm); free tier via Google account;install geminiCLI subcommand + dedicated toggleterm terminal<Leader>tG
-
nvim-config status— summary: active variant, theme, profile, Neovim version -
nvim-config doctor— health check: Neovim, required binaries (git, make, rg, fdfind, node, npm), optional tools (lazygit, tmux, claude, codex, gemini, cargo, gcc) -
nvim-config theme info— current active theme (reads.nvim-theme) -
nvim-config ui info— current active UI variant (reads.nvim-ui) -
nvim-config profile info— active profile + associated LSP servers and DAP packages (parsed from profile lua file)
-
nvim-config theme list— list all 14 available themes, mark the active one with* -
nvim-config profile list— list all available profiles, mark active with*; skip internal files (init, picker) -
nvim-config keymaps— opendocs/keymaps.mdin$PAGER
-
nvim-config update dap-adapters— show DAP packages for active profile, trigger Mason install headlessly
-
conform.nvim— modern formatter replacing none-ls formatting sources; per-filetype formatter chains;format_on_saveoption -
nvim-lint— modern linter replacing none-ls diagnostic sources; event-driven (BufWritePost,InsertLeave) - Migrate profiles to use conform/nvim-lint sources instead of none-ls (additive, keep none-ls as fallback during transition)
-
noice.nvim— floating cmdline (cmdline_popup), popup messages, LSP progress;notify.enabledfalse in modern variant (snacks ownsvim.notify); LSP hover/signature kept native -
nvim-ufo— LSP/treesitter-aware folding;zRopen all,zMclose all,Kpeek fold (falls back to LSP hover); provider chain: lsp → treesitter → indent
-
oil.nvim— edit filesystem as a buffer (rename, move, delete via normal editing);-to open parent dir;default_file_explorer = falseto coexist with neo-tree
-
marks.nvim— visual marks in sign column withm[a-z]gutter indicators;]'/['line jumps,]`/[`column jumps; builtin marks (. < > ^) shown
-
Termux profile (
lua/profiles/termux.lua) — environment profile for Android ARM: -
Python language profile (
lua/profiles/python.lua) — auto-detected frompyproject.toml,setup.py,setup.cfg,requirements.txt; LSP:pyright; conform:ruff_format+black; lint:ruff,mypy; neotest:neotest-python; DAP:debugpy(Mason)- (details in
.private/termux.md)
- (details in
-
mcphub.nvim— MCP client hub;<Leader>amUI; avante integration; disabled on Termux → https://github.com/ravitemer/mcphub.nvim -
mcp-server-git(official Anthropic) — git operations via MCP (uvx mcp-server-git) → https://github.com/modelcontextprotocol/servers/tree/main/src/git -
mcp-diagnostics.nvim— LSP diagnostics exposed to AI via MCP; bundled Node.js server registered in mcphub config; pending live validation → https://github.com/georgeharker/mcp-diagnostics.nvim -
Context7(Upstash) — versioned library docs injected into LLM prompts (@upstash/context7-mcp) → https://github.com/upstash/context7
- Benchmark
codecompanion.nvimvsavante.nvim— plugin installed alongside avante;<Leader>cc/<Leader>cx; evaluation pending on a real project → https://github.com/olimorris/codecompanion.nvim - AI profile — opt-in
aiprofile (lua/profiles/ai.lua) activating avante, codecompanion, codeium, mcphub, mcp-diagnostics viacond = is_active('ai')(implemented)
-
nvim-config install mise— curl + GPG-signature-verified installer (official mise release key), idempotent -
install nvim— interactive cascade: mise (if present, else prompt to install) → snap (if present, else prompt to install snapd) → apt fallback; prompts auto-decline outside a TTY, under--quiet, or under--dry-run -
update nvim— prefermiseautomatically when Neovim was installed through it (mise use -g neovim@latest); snap/apt auto-detection unchanged otherwise -
--mise/--snap/--aptflags bypass the cascade and fail fast with a clear error if the corresponding tool is missing -
nvim-config doctor—miseadded to the optional tools check - Fix:
install nvim/install allno longer crash withsudo: snap: command not foundon systems without snap - Fix:
log_messageno longer double-prints ERROR lines (stdout + stderr) — ERROR now goes to stderr only - Fix: cascade no longer aborts on a failed optional step (mise/snapd) — falls through to the next fallback instead
- Fix:
install allruns deps/config independently of the nvim step's outcome instead of aborting on first failure - Fix:
install depsinstallsgnupg, required byinstall mise - Fix: the "install mise?" prompt lists and offers to install every missing prerequisite (
curl,gnupg) via apt in the same step, instead of failing after the user already opted in - Fix:
tmp_dir: unbound variablecrash at script exit —run_install_mise's cleanup trap is now explicitly cleared before returning instead of lingering process-wide - All
apt installcalls now pass-y— the user already confirmed via the CLI invocation or an interactive prompt, apt shouldn't ask again -
install nvim --mise/--snapnow bootstrap mise/snapd on the spot instead of erroring and leaving nothing installed (explicit flag = consent, no need for a separateinstall miserun first) - mise shell activation: prompt to add the activation line to the user's shell rc (bash/zsh/fish) after a fresh
install mise, idempotent (skips if already present), with a reload reminder;--activate/--no-activateflags to force either outcome unattended (for automated installs) -
install nvim --mise: auto-installs missing prerequisites (curl/gnupg) via apt with no extra prompt, since--miseis already explicit consent - Fix:
set -eis silently suppressed for the whole call subtree when a function is used as the left side of||(asrun_install_nvimalways is, frominstall all) — every fallible step in_install_nvim_via,_install_nvim_auto, andrun_install_depsis now explicitly guarded instead of relying on implicit propagation - Fix:
run_install_misenow adds~/.local/binto its own PATH right after a successful install somise use -g neovim@latestworks immediately in the same run, without waiting for a shell reload - The mise activation "reload your shell" reminder is now repeated once more at the very end of
install nvim/install mise/install all, so it isn't buried under later apt output - Fix: the activation line used bare
mise activate bash, which needsmiseon PATH just to run — chicken-and-egg, still broken aftersource ~/.bashrc. Now uses the absolute mise binary path (matching mise's own installer recommendation), plus an explicit~/.local/binPATH guard line as defense in depth - Fix: that PATH guard line is now idempotent at shell-startup time (bash/zsh:
case ":$PATH:" in ...check; fish: built-infish_add_path), not just at file-write time — re-sourcing the rc file no longer accumulates duplicate PATH entries - Fix:
gitis a mandatory prerequisite (lazy.nvim bootstrap) but was only documented as "assumed present", never actually installed —install depsnow installs it.lua/plugins.luaalso checksvim.fn.executable('git')before bootstrapping and prints one clear actionable message instead of letting Neovim crash with a rawE475: Invalid value for argument cmd: 'git' is not executable
- Fix: noice.nvim routed list-style command output (
:scriptnames,:marks,:registers,:highlight,:map,:autocmd,:command,:buffers, ...) through the samenotifyview as:echo/:echomsg, withopts.replace = true; once the prior nvim-notify toast auto-dismissed, replaying the same or another list-style command tried to replace an expired notification and silently showed nothing.list_cmd-kind messages now route to asplitview instead
- Fix:
makeis checked bynvim-config doctorunder "Required binaries" but was never installed byinstall deps, silently breakingtelescope-fzf-native.nvim's native build on a fresh machine — same class of oversight as thegitfix (Phase 17) - Fix:
makealone isn't enough fortelescope-fzf-native.nvim— its Makefile also needscc.install depsnow installsgcc, anddoctormoves it from optional "Build tools" to "Required binaries" (cargostays optional) -
install depsinstallswl-clipboardalongsidexsel/xclip— no Wayland clipboard support previously. Installed unconditionally (not auto-detected) since session-type detection is unreliable wheninstall depsruns over SSH or before any graphical session starts; Neovim's clipboard provider already picks the right tool at runtime
- Fix:
vim.opt.clipboard = 'unnamedplus'made every yank/delete/put shell out to the system clipboard tool, laggy enough on slower setups (containers) that holdingx/pdown only registered the first press. Removed —YY/XX/PPalready give explicit, on-demand clipboard access, making automatic sync both redundant and the source of the lag
- Fix:
jsonlsauto-install failed on every startup with a Mason error (Could not find executable "npm" in PATH) on machines without Node.js, sincejson-lspis an npm package and Node.js is intentionally opt-in (install deps --with-node). Now gated onvim.fn.executable('npm'), skipped silently instead of retrying a known failure;lua_ls(standalone binary) is unaffected
- Fix:
nvim-treesitterfailed to build parsers on first launch (ENOENT ... 'tree-sitter') — the vendored CLI (nvim-config update tree-sitter→vendor/tree-sitter/) was never added to Neovim'sPATH, and the command was undocumented.lua/config/treesitter.luanow prepends the vendor dir toPATHwhen present;install allnow also runsupdate tree-sitterautomatically (idempotent) so it works out of the box on a fresh install
- Full code/doc consistency audit:
--helpverified complete against the actual command dispatch (no command, subcommand, or flag missing or stale) — no gaps found - Fix: bash completion offered
list detect set unset create info(profile's subcommands) afterui set/theme setinstead ofclassic modern/ theme names —set/unset/infoare shared across profile/ui/theme and matching on the previous word alone picked profile's pattern first; a dedicatedclassic|modern)case existed but was dead code, unreachable due to case ordering. Bash completion now dispatches on the top-level command first - zsh gained the missing third-level completion (
ui set→ classic/modern,theme set→ theme names) — it only completed two levels deep before - fish gained theme-name completion after
theme set, for parity with theui/set/classic-modern completion it already had - Theme names are now injected into all 3 generated completion scripts from the single
VALID_THEMESarray (placeholder substitution inshow_completion()) instead of being hand-duplicated — one source of truth
- Fix:
.private/andvendor/were only ignored via the maintainer's personal global~/.gitignore, not the project's own — a blind spot for anyone else cloning the repo. Added explicitly, plus the missing.nvim-profileentry (third local override file, siblings.nvim-ui/.nvim-themewere already covered) and standard OS/editor artifacts - Added
SECURITY.mdandCONTRIBUTING.mdahead of making the repo public (0.7.1) - CI triggers scoped down:
pushlimited tomain/develop/conventional branch prefixes (no more tags, no more scratch branches),pull_requestlimited to PRs targetingmain; addedworkflow_dispatchand aconcurrencygroup (already required by this project's own CI conventions, previously missing) -
detect-changesjob skipslint/test(via job-levelif:, not a trigger-levelpaths-ignore) when a push/PR only touched**/*.md/docs/**/.editorconfig— the workflow still always runs so required status checks are never left stuck waiting
-
nvim-config uninstall [config|nvim|mise|deps|all]— reverses the correspondinginstallsubcommand(s): removes the~/.config/nvimsymlink (only if it points at this repository), removes Neovim (detects mise/snap/apt, same detection asupdate nvim, asks for confirmation), removes the mise binary and the shell activation linesinstall miseadded (identified by its own marker comment; tools mise managed are left untouched) -
uninstall depsnever runsapt remove— the packagesinstall depsinstalls are shared system dependencies other tools may also rely on; it only prints the manual removal command.uninstall allfollows the same policy and excludesdeps -
uninstall nvim/uninstall miseare gated behind_confirm, auto-declining under--dry-run/--quiet/outside a TTY, consistent with every other confirmation prompt in this CLI - Shell completion (bash/zsh/fish) and
--helpupdated for the new command; README gained an "Uninstalling" section documenting the deps policy explicitly
- Fix:
gc/gccprinted[Comment.nvim] niland commented nothing in any buffer without a treesitter parser (ssh config, php) — Comment.nvim assumesvim.treesitter.get_parser()raises when no parser exists, but on Neovim 0.12 it returnsnil; the plugin is unmaintained since June 2024 - Replace Comment.nvim with Neovim's native commenting (
gc/gcc, counts,dgc); minimum Neovim raised to 0.10; php buffers keep//comments via acommentstringoverride - Profiles can declare
treesitter_parsers(php→php,laravel→blade,web→tsx/vue/svelte,rust→rust/toml,python→python/toml); installed at startup and on runtime:NvimProfileactivation;ssh_configadded to the global parser list - Commenting documented in
docs/cheatsheets/editing.md(count and motions included)
-
update/update tree-sitterexited 1 without a message when the GitHub release lookup failed (offline or rate limited) —set -eended the script inside a$(curl | grep | sed)assignment before the error was logged; now a clear error -
--dry-runno longer depends on the network for that lookup (warns and succeeds), which had made four unrelated tests fail whenever the anonymous API quota was exhausted - tree-sitter download checked step by step (no more "updated" message after a failed
download); a vendored binary that cannot run is replaced instead of aborting;
uninstall nvimno longer aborts silently whenmise currentfails -
uninstall nvim|mise --dry-runprints the removal plan instead of "Skipped" (the consent prompt is skipped in dry-run only); covered by tests with fakemise/snap/nvim
-
shellprofile: shellcheck (nvim-lint) and shfmt (conform) forshbuffers (which covers.sh,.bash,.batsand shebang scripts); auto-detected from.shellcheckrc, a root-level*.sh/*.bashortests/*.bats, otherwise opt-in; no language server (deferred, see below) - shfmt runs on demand only: conform no longer formats
shbuffers on save — measured on this repo, savingbin/nvim-configwould have rewritten ~970 of 1930 lines (2 470 with the tabs default of a.editorconfigthat does not match the file) -
nvim-config profile detectmirrored the Lua detection only partly: it ignoredpythonandtermux; now complete, plusshell -
nvim-config doctorlists shellcheck and shfmt under "Shell tools (optional)"
-
devopsprofile: hadolint (Dockerfile) and actionlint (GitHub workflows) through nvim-lint,dockerfileparser; auto-detected from a Dockerfile, a compose file or.github/workflows/ - New generic profile field
mason_packages(+profiles.get_mason_packages()andinstall_mason_packages()): Mason-installed tools that are not in apt, installed at startup and on runtime:NvimProfileactivation, skipped on Termux; a test checks every declared name exists in the Mason registry - Workflow files get the compound filetype
yaml.githubso actionlint never runs on arbitrary YAML (nvim-lint and conform split compound filetypes on the dot, soyamltooling is unchanged) -
nvim-config doctorlists actionlint and hadolint, looking in Neovim's Masonbindirectory as well as the shellPATH;profile detectmirrors the new detector
Order agreed with the maintainer; each item is its own branch and PR.
-
tests/runclearsXDG_*so a local run behaves like CI - CI runs once per commit:
pushlimited tomain, topic branches tested through their pull request (it used to run for the push and again for the PR);tests/ci.batsguards the triggers - Documented minimum Neovim corrected from 0.10 to 0.11 (README + a test tying it to the APIs
lua/uses). Found by starting the real config on 0.10.4 / 0.11.0 / 0.11.7 / 0.12.0 - CI: Neovim installed from a pinned version with a verified SHA-256 (
scripts/ci-install-neovim), bats-core pinned by commit SHA (rules/ci.md) -
tests/full-startup+ CI jobStartup(oldest supported Neovim and the Test job's version): the only end-to-end test of the real config; the suite alone passes on Neovim 0.10.4 where the config cannot start - Neovim version guard in
init.lua(lua/minimum_version.lua): clear message and stop on Neovim < 0.11 -
:Cheatextension points: user directories (~/.config/nvim-cheatsheets,$NVIM_CHEATSHEET_DIRS) and acheatsheetsfield a profile can declare; theshellanddevopsprofiles ship a sheet each - Yazi: yazi.nvim loaded only when the
yazibinary is present,<Leader>-, listed bydoctor; no automatic install. A real yazi/neo-tree switch (like.nvim-ui) would come later, see Deferred - Docs / code consistency audit before 0.10.0: wrong
]t/[tclaims,install alldescription, debugpy, shellcheck command, logging docs, zsh completion locals; the findings that are behaviour rather than docs (CLI paths ignoringXDG_*, daily log overwritten at each run) are the next item -
]t/[tnavigation between TODO comments (todo-comments), replacing the unused tag-stack motions - Dry-run wording: "Removed" / "Linked" become "would remove" / "would link"; found on the way that
--install-completion --dry-runreally wrote the file (fixed), and a sweep test now guards every mutating command - XDG compliance of the CLI's own paths (log directory, config link, completions, fish rc file, nvm) and
the zsh completion in
${XDG_DATA_HOME:-~/.local/share}/zsh/completions(the directory the maintainer's dotfiles put onfpath), with a warning about a leftover~/.zfunccopy - The daily log is appended to, with a file-only
Run:header line per run -
install tmuxrefuses to write through a symlinked~/.tmux.conf(dotfiles-managed) and says which line to add
Order agreed with the maintainer on 2026-10-22; each item is its own branch and PR.
-
tests/runhands bats a minimal environment (env -iwith a whitelist:PATH,HOME,TERM,TMPDIR,NVIM_HEADLESS_TESTS_SKIP, fixed locale) so a test cannot depend on the machine that runs it - CI pins up to date:
actions/checkoutv4.4.0 to v7.0.1 (Node 20 is deprecated), Neovim v0.12.5 to v0.12.6 with its SHA-256 checked against the downloaded archive; procedure in CONTRIBUTING.md "Updating the pinned Neovim", and a new "Updating a pinned action" section - Release guard rails:
scripts/extract-changelog.sh(cited byrules/release.md, absent until now) andtests/release.bats, which checks thatVERSION, the[X.Y.Z]CHANGELOG sections and the compare links agree; the CI lint step must cover every script underscripts/ - npm-gated language servers with one shared mechanism (
lua/lsp_requirements.lua, replacing the ad hocjsonlsgate and covering the web, php and python servers too):bash-language-serverforshell,yaml-language-serveranddockerfile-language-serverfordevops. Checked with the real servers: bashls with its own shellcheck off (nvim-lint keeps it), yamlls on schemastore and off theyaml.githubbuffers, dockerls leaving three rules to hadolint - Language servers installed when a profile is switched on at runtime (
:NvimProfile), not only at the next startup; found while doing the previous item. Checked with the real Mason -
nvim-config doctorlists the language servers left out becausenpmis missing (read fromlua/lsp_requirements.lua) - Missing treesitter parsers installed on the fly, after a confirmation prompt (
lua/treesitter_prompt.lua: Install / Not now / Never, "Never" kept in the state directory). Checked with the real nvim-treesitter, which also showed that a parser installed in the session that createssitewas not found untilruntimepathis assigned again
Order agreed with the maintainer on 2026-10-26; each item is its own branch and PR, and the Termux check comes last, on the commit that will be tagged.
-
.nvim-profilenaming several profiles (web,php) is read as Neovim reads it byprofile info,profile listandupdate dap-adapters(they failed on it), andprofile setaccepts a list and refuses an unknown name (a typo such aswbewas written silently and listed as active by Neovim) - The parsers installed at startup are found in the first session on a fresh machine (the
sitedirectory did not exist at startup, so Neovim does not search it untilruntimepathis assigned again): the startup install now goes throughlua/treesitter_install.lua, shared with the parser menu; checked with the real nvim-treesitter - Optional, to discuss: a CI job that installs the configuration on a clean runner and starts it (not a required check; network, duration, instability), since every defect of the last cycle came from a fresh-state condition
- Refresh the pinned plugins of
lazy-lock.json(:Lazy checkfirst, thentests/full-startup): six plugins that follow their branch, 20 commits, none breaking; the three tag-pinned ones were already on their latest tag. Checked at the new commits with the real Mason, mason-lspconfig, nvim-lspconfig and nvim-treesitter - Lists read from a profile file (
profile info,update dap-adapters) return only the quoted names, andupdate dap-adaptershands Neovim one+MasonInstall <package>argument per package: found while preparing the Termux check (stray},lines), then a second defect behind it (the command installed nothing since it was written); checked with the real Mason - Check the release candidate on Termux (
doctor,:NvimProfile, the parser menu), a declared target that has not been verified since 0.11.0 touched its branches
Items intentionally set aside — not yet prioritised or waiting for a relevant project context.
-
AI profile — implemented in Phase 16; both avante and codecompanion shipped; benchmark ongoing on real projects
-
copilot.lua(zbirenbaum) — inline AI completions via GitHub Copilot subscription; deferred —codeium.nvimcovers the free inline completion use case → https://github.com/zbirenbaum/copilot.lua -
Avante auth-mode picker — extend
<Leader>aPprovider picker with a second level to select the authentication mode per provider (OAuth Max, OAuth Pro, API key); REST providers (claude,claude-opus,gemini) support multipleauth_typevalues; ACP providers (claude-code, gemini-cli, codex) manage their own auth via CLI; requires building a two-step Telescope picker and a runtimeConfig.override({ providers = { … } })call
-
mcp-server-filesystem(official Anthropic) — secure file read/write; access scoped to CWD → https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem -
mcp-server-fetch(official Anthropic) — web fetch + HTML→Markdown viauvx→ https://github.com/modelcontextprotocol/servers/tree/main/src/fetch -
mcp-neovim-server— exposes Neovim buffers, cursor, registers and vim commands to external MCP clients (Claude Desktop, etc.) via node-client; inverse direction from mcphub → https://github.com/bigcodegen/mcp-neovim-server
- neotest profile-driven adapters —
neotest-jest(web, when Jest is preferred over Vitest),neotest-busted(Lua/busted projects); deferred until relevant project context
- yazi / neo-tree switch: let a setting (like
.nvim-ui) make yazi the file explorer instead of neo-tree (open_for_directories = true,<Leader>nopening yazi). The coexisting integration shipped in Phase 30; this only matters if neo-tree stops being wanted → https://yazi-rs.github.io → https://github.com/mikavilpas/yazi.nvim
-
luaprofile: StyLua through conform. Its defaults (tabs, double quotes) differ from this repository's style (4 spaces, single quotes) and there is nostylua.tomlhere, so it only makes sense withrequire_cwd(format only where astylua.tomlexists) — which would leave the profile inert in this repo.lua_lsalready covers diagnostics andluacheckneeds luarocks. Revisit when a Lua project with astylua.tomlshows up (e.g. a WezTerm config) -
goprofile —gopls, parsersgogomodgosumgowork, Delve for DAP, formatter (gofumpt/goimports) and linter (golangci-lint) through conform/nvim-lint; detected bygo.mod. Mason package names to confirm when implementing. Deferred until Go is actually used -
javaprofile —jdtls, parserjava, java-debug-adapter / java-test for DAP and tests, formatter; detected bypom.xml,build.gradle(.kts)orsettings.gradle.jdtlsneeds a JDK and workspace handling that the other profiles don't, so it is the heavier of the two. Deferred until Java is actually used (ajenvinstall on the maintainer'sPATHhints at it but doesn't confirm it)
-
mason-nvim-dap.nvim— declarative DAP adapter installation via Mason (alternative to current manual registry approach); evaluate if the current approach proves insufficient
-
uninstallcommand is missing counterparts forinstall tmux|claude|codex|gemini— scoped out of the 0.8.0 uninstall work (config|nvim|mise|deps|allonly, matching the original backlog item) to keep that release tight; revisit if the asymmetry becomes a real pain point rather than fixing it speculatively
-
nvim-config install config --preset <name|url>— extendinstall configto support alternative Neovim distributions as presets; back up existing~/.config/nvimbefore switching; supported presets to evaluate:nvchad→ https://nvchad.comlazyvim→ https://www.lazyvim.orgastronvim→ https://astronvim.com<url>→ any git repository (generic clone)default→ this config (current behaviour, always available)- CLI clones the target repo, symlinks
~/.config/nvim, documents prerequisites per preset