feat(nvim,telemetry): implement ADR-0102 circuit breaker and ADR-0103 knowledge graph projection
This commit is contained in:
1 parent
3d77e60a02
commit
ec977c24dd
7 files changed
+692
-11
No files matched your search
+117
@@ -94,7 +94,123 @@ function M.prompt_user(prompt_text, options, request_id)
|
||||
end
|
||||
|
||||
local ns_id = vim.api.nvim_create_namespace("gemini_ghost_text")
|
||||
local knowledge_ns = vim.api.nvim_create_namespace("gemini_knowledge_projection")
|
||||
local active_diffs = {}
|
||||
local active_knowledge = {}
|
||||
|
||||
function M.project_knowledge(tech_debts, adrs, bufnr)
|
||||
bufnr = (bufnr == 0 or bufnr == nil) and vim.api.nvim_get_current_buf() or bufnr
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then return end
|
||||
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, knowledge_ns, 0, -1)
|
||||
active_knowledge[bufnr] = {
|
||||
tech_debts = tech_debts or {},
|
||||
adrs = adrs or {},
|
||||
file = vim.api.nvim_buf_get_name(bufnr)
|
||||
}
|
||||
|
||||
local line_count = vim.api.nvim_buf_line_count(bufnr)
|
||||
|
||||
-- 1. Project Tech Debts
|
||||
if tech_debts and #tech_debts > 0 then
|
||||
for _, debt in ipairs(tech_debts) do
|
||||
local target_line = 0
|
||||
if debt.line_range then
|
||||
local num = tonumber(string.match(debt.line_range, "%d+"))
|
||||
if num and num > 0 then
|
||||
target_line = num - 1
|
||||
end
|
||||
end
|
||||
target_line = math.max(0, math.min(target_line, line_count - 1))
|
||||
|
||||
local sev = debt.severity or "debt"
|
||||
local hl = (sev == "critical" or sev == "high") and "DiagnosticError" or "DiagnosticWarn"
|
||||
vim.api.nvim_buf_set_extmark(bufnr, knowledge_ns, target_line, 0, {
|
||||
virt_text = {{" ⚡ [" .. sev:upper() .. " DEBT] " .. debt.description, hl}},
|
||||
virt_text_pos = "eol",
|
||||
hl_mode = "combine",
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
-- 2. Project ADRs
|
||||
if adrs and #adrs > 0 then
|
||||
for _, adr in ipairs(adrs) do
|
||||
vim.api.nvim_buf_set_extmark(bufnr, knowledge_ns, 0, 0, {
|
||||
virt_text = {{" 📜 [" .. adr.id .. "] " .. adr.title, "DiagnosticInfo"}},
|
||||
virt_text_pos = "eol",
|
||||
hl_mode = "combine",
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function M.show_knowledge()
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local data = active_knowledge[bufnr]
|
||||
if not data or ((#data.tech_debts == 0) and (#data.adrs == 0)) then
|
||||
print("No active Tech Debt or ADRs found for this file.")
|
||||
return
|
||||
end
|
||||
|
||||
local lines = {}
|
||||
table.insert(lines, "# Antigravity Knowledge Graph Projection")
|
||||
table.insert(lines, "File: " .. (data.file or vim.api.nvim_buf_get_name(bufnr)))
|
||||
table.insert(lines, string.rep("=", 50))
|
||||
table.insert(lines, "")
|
||||
|
||||
if #data.tech_debts > 0 then
|
||||
table.insert(lines, "## Active Tech Debts (" .. #data.tech_debts .. ")")
|
||||
for _, d in ipairs(data.tech_debts) do
|
||||
table.insert(lines, string.format("- [%s] (%s): %s", d.id, d.severity or "unspecified", d.description))
|
||||
if d.line_range then
|
||||
table.insert(lines, " Lines: " .. d.line_range)
|
||||
end
|
||||
if d.ideal_solution and d.ideal_solution ~= "" then
|
||||
table.insert(lines, " Ideal Solution: " .. d.ideal_solution)
|
||||
end
|
||||
end
|
||||
table.insert(lines, "")
|
||||
end
|
||||
|
||||
if #data.adrs > 0 then
|
||||
table.insert(lines, "## Architectural Decision Records (ADRs) (" .. #data.adrs .. ")")
|
||||
for _, a in ipairs(data.adrs) do
|
||||
table.insert(lines, string.format("- [%s] %s (Status: %s)", a.id, a.title, a.status))
|
||||
table.insert(lines, " Decision: " .. a.decision)
|
||||
end
|
||||
table.insert(lines, "")
|
||||
end
|
||||
|
||||
local kbuf = vim.api.nvim_create_buf(false, true)
|
||||
vim.api.nvim_buf_set_lines(kbuf, 0, -1, false, lines)
|
||||
vim.bo[kbuf].filetype = "markdown"
|
||||
|
||||
local width = math.min(math.floor(vim.o.columns * 0.7), 90)
|
||||
local height = math.min(#lines + 2, math.floor(vim.o.lines * 0.6))
|
||||
local row = math.floor((vim.o.lines - height) / 2)
|
||||
local col = math.floor((vim.o.columns - width) / 2)
|
||||
|
||||
local kwin = vim.api.nvim_open_win(kbuf, true, {
|
||||
relative = 'editor',
|
||||
width = width,
|
||||
height = height,
|
||||
row = row,
|
||||
col = col,
|
||||
style = 'minimal',
|
||||
border = 'rounded',
|
||||
title = ' Antigravity Knowledge Projection ',
|
||||
title_pos = 'center'
|
||||
})
|
||||
|
||||
local function close_kwin()
|
||||
if kwin and vim.api.nvim_win_is_valid(kwin) then
|
||||
vim.api.nvim_win_close(kwin, true)
|
||||
end
|
||||
end
|
||||
vim.keymap.set('n', 'q', close_kwin, { buffer = kbuf, noremap = true, silent = true })
|
||||
vim.keymap.set('n', '<Esc>', close_kwin, { buffer = kbuf, noremap = true, silent = true })
|
||||
end
|
||||
|
||||
function M.preview_diff(diff_id, bufnr, start_row, end_row, new_lines)
|
||||
bufnr = (bufnr == 0 or bufnr == nil) and vim.api.nvim_get_current_buf() or bufnr
|
||||
@@ -195,6 +311,7 @@ function M.setup()
|
||||
|
||||
vim.keymap.set('n', '<leader>aa', M.accept_diff, { desc = "Accept Agent Diff", noremap = true, silent = true })
|
||||
vim.keymap.set('n', '<leader>ar', M.reject_diff, { desc = "Reject Agent Diff", noremap = true, silent = true })
|
||||
vim.keymap.set('n', '<leader>ak', M.show_knowledge, { desc = "Show Knowledge (Tech Debt & ADRs)", noremap = true, silent = true })
|
||||
end
|
||||
|
||||
function M.send_to_terminal(command)
|
||||
|
||||
Reference in new issue
Block a user