feat: add ThePrimeagen/99 AI agent plugin
- Configured with OpenCodeProvider (default, matches opencode environment)
- blink.cmp as completion source for # rules and @ file references
- tmp_dir = ./tmp (per-project, keeps opencode permission happy)
- Auto-injects AGENT.md files from file location up to project root
- Keymaps under <leader>9 group:
9v (visual) replace selection with AI result
9s search project → quickfix list
9x stop all in-flight requests
9c clear previous results
9l view debug logs
9m telescope model picker
9p telescope provider picker
- Added AI [9]9 group to which-key
This commit is contained in:
56
lua/plugins/extras/ai.lua
Normal file
56
lua/plugins/extras/ai.lua
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
-- lua/plugins/extras/ai.lua
|
||||||
|
-- ThePrimeagen/99 — AI agent for Neovim
|
||||||
|
-- Augments coding via opencode (default provider) with two core workflows:
|
||||||
|
-- search → AI project-wide search, results in quickfix list
|
||||||
|
-- visual → replace visual selection with AI-generated result
|
||||||
|
-- https://github.com/ThePrimeagen/99
|
||||||
|
|
||||||
|
return {
|
||||||
|
'ThePrimeagen/99',
|
||||||
|
config = function()
|
||||||
|
local _99 = require '99'
|
||||||
|
local basename = vim.fs.basename(vim.uv.cwd())
|
||||||
|
|
||||||
|
_99.setup {
|
||||||
|
-- OpenCodeProvider is the default; matches the opencode environment
|
||||||
|
logger = {
|
||||||
|
level = _99.DEBUG,
|
||||||
|
path = '/tmp/' .. basename .. '.99.debug',
|
||||||
|
print_on_error = true,
|
||||||
|
},
|
||||||
|
-- tmp_dir must be inside CWD so opencode has write permission
|
||||||
|
tmp_dir = './tmp',
|
||||||
|
-- Auto-inject AGENT.md files found between the open file and project root
|
||||||
|
md_files = { 'AGENT.md' },
|
||||||
|
completion = {
|
||||||
|
source = 'blink', -- blink.cmp is your completion engine
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Visual selection → AI replacement
|
||||||
|
-- Intentionally v-mode only: avoids accidentally using a stale selection
|
||||||
|
vim.keymap.set('v', '<leader>9v', _99.visual, { desc = 'AI: replace visual selection' })
|
||||||
|
|
||||||
|
-- Project-wide AI search → quickfix list
|
||||||
|
vim.keymap.set('n', '<leader>9s', _99.search, { desc = 'AI: search project' })
|
||||||
|
|
||||||
|
-- Cancel all in-flight requests
|
||||||
|
vim.keymap.set('n', '<leader>9x', _99.stop_all_requests, { desc = 'AI: stop all requests' })
|
||||||
|
|
||||||
|
-- Clear previous search/visual results
|
||||||
|
vim.keymap.set('n', '<leader>9c', _99.clear_previous_requests, { desc = 'AI: clear previous requests' })
|
||||||
|
|
||||||
|
-- View debug logs for the last run
|
||||||
|
vim.keymap.set('n', '<leader>9l', _99.view_logs, { desc = 'AI: view logs' })
|
||||||
|
|
||||||
|
-- Telescope: switch model on the fly (persists for the session)
|
||||||
|
vim.keymap.set('n', '<leader>9m', function()
|
||||||
|
require('99.extensions.telescope').select_model()
|
||||||
|
end, { desc = 'AI: select model' })
|
||||||
|
|
||||||
|
-- Telescope: switch provider (OpenCode / Claude / Cursor / Gemini)
|
||||||
|
vim.keymap.set('n', '<leader>9p', function()
|
||||||
|
require('99.extensions.telescope').select_provider()
|
||||||
|
end, { desc = 'AI: select provider' })
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@ return {
|
|||||||
{ '<leader>t', group = '[T]oggle' },
|
{ '<leader>t', group = '[T]oggle' },
|
||||||
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
{ '<leader>h', group = 'Git [H]unk', mode = { 'n', 'v' } },
|
||||||
{ '<leader>d', group = '[D]ebug' },
|
{ '<leader>d', group = '[D]ebug' },
|
||||||
|
{ '<leader>9', group = 'AI [9]9' },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user