_ _ __ _
__ _ __ _ ___ _ __ | |_(_)/ _|_ _ _ ____ _(_)_ __ ___
/ _` |/ _` |/ _ \ '_ \| __| | |_| | | | | '_ \ \ / / | '_ ` _ \
| (_| | (_| | __/ | | | |_| | _| |_| |_| | | \ V /| | | | | | |
\__,_|\__, |\___|_| |_|\__|_|_| \__, (_)_| |_|\_/ |_|_| |_| |_|
|___/ |___/
agentify.nvim is a Codex-backed inline completion plugin for Neovim 0.10+.
It is built for people who want useful completions without leaving insert mode. The plugin keeps the flow lightweight: it can reuse nearby code and LSP context for fast suggestions, then lean on Codex when the line needs real intent instead of simple suffix matching.
- Inline ghost-text completions that stay inside your normal editing flow
- Uses your existing local
codexCLI session, so there is no extra auth UI inside Neovim - Pulls signal from the current line, nearby code, LSP context, symbol names, and related open buffers
- Supports full accept, word-by-word accept, dismiss, and manual trigger
- Optimized for practical latency with fast local/template suggestions and Codex upgrades when needed
- Filling in function bodies from descriptive names such as
convertArrayToString - Expanding common editing patterns like JS/TS arrow-function blocks
- Helping with quick debug statements such as
console.log(...)andprint(...) - Reusing identifiers and repeated lines from the current buffer
- Staying out of the way when the cursor moves or the buffer changes
This project is intentionally narrow right now:
- one provider: Codex through
codex app-server - plugin-managed local
stdiotransport - existing Codex CLI authentication on the machine
- inline suggestions only, with multiline suggestions only at end-of-line
- Neovim
0.10+
- Neovim
0.10+ codexonPATH- an authenticated Codex CLI session on the same machine
With lazy.nvim:
{
"ixigo/agentify.nvim",
config = function()
require("agentify").setup()
end,
}A practical setup with common keymaps:
require("agentify").setup({
debounce_ms = 175,
filetypes = {
allow = { "lua", "python", "javascript", "typescript" },
deny = {},
},
})
vim.keymap.set("i", "<C-l>", function()
require("agentify").accept()
end)
vim.keymap.set("i", "<M-w>", function()
require("agentify").accept_word()
end)
vim.keymap.set("i", "<M-]>", function()
require("agentify").dismiss()
end)- Start typing in insert mode and wait for the debounce window to pass.
- Accept the whole suggestion with
require("agentify").accept(). - Accept the next word with
require("agentify").accept_word(). - Dismiss the current suggestion with
require("agentify").dismiss(). - Use
:AgentifySuggestwhen you want to force a manual Codex request. - Use
:AgentifyStatuswhen something feels off. - Use
:AgentifySetupwhen you want actionable setup guidance.
:AgentifyStatusshows provider readiness, auth visibility, transport state, rate-limit info, and whether the current buffer is eligible.:AgentifySetupprints focused setup help when the CLI or auth state is missing.:AgentifySuggestmanually requests a suggestion at the cursor.
Most people only need to adjust a small number of options:
debounce_mscontrols how quickly auto-suggestions appear.filetypes.allowandfiletypes.denydecide where Agentify runs.suggestion.multilineandsuggestion.max_linescontrol multi-line completions.codex.model,codex.effort, andcodex.warmup_on_insertcontrol Codex behavior.logging.levelhelps with troubleshooting.
Full defaults live in lua/agentify/config.lua.
A more opinionated example:
require("agentify").setup({
debounce_ms = 140,
suggestion = {
multiline = true,
max_lines = 4,
},
codex = {
effort = "none",
warmup_on_insert = true,
},
logging = {
level = "warn",
},
})If :AgentifyStatus says the CLI is missing:
codex app-server --helpIf authentication is missing:
codex loginIf the transport is running but suggestions do not show up:
- confirm the buffer filetype is allowlisted
- confirm you are in insert mode
- run
:AgentifySuggestto bypass debounce - set
logging.level = "debug"and run:AgentifyStatusagain
make testFor a headless smoke run:
nvim --headless -u tests/minimal_init.lua "+luafile scripts/smoke.lua"agentify.nvim is actively developed and used day to day. Issues and PRs are welcome.
This project is licensed under the MIT License.