From 10c1de88436bba405cbeb803c8b54e002a4ab7da Mon Sep 17 00:00:00 2001 From: Carlos Gutierrez Date: Fri, 16 Jan 2026 11:52:46 -0500 Subject: [PATCH] Refactor: Restructure project into core, features, adapters, and config modules --- .../{ => adapters/nvim}/autocmds.lua | 32 ++--- .../nvim/cmp}/init.lua | 0 .../{ => adapters/nvim}/commands.lua | 136 +++++++++--------- .../ui.lua => adapters/nvim/ui/chat.lua} | 10 +- .../nvim/ui}/context_modal.lua | 2 +- .../nvim/ui}/diff_review.lua | 2 +- .../{agent => adapters/nvim/ui}/logs.lua | 0 .../{ => adapters/nvim/ui}/logs_panel.lua | 4 +- .../nvim/ui/switcher.lua} | 4 +- .../{window.lua => adapters/nvim/windows.lua} | 4 +- lua/codetyper/{ => config}/credentials.lua | 2 +- .../{config.lua => config/defaults.lua} | 0 lua/codetyper/{ => config}/preferences.lua | 2 +- .../{cost.lua => core/cost/init.lua} | 2 +- .../{agent => core/diff}/conflict.lua | 6 +- lua/codetyper/{agent => core/diff}/diff.lua | 2 +- lua/codetyper/{agent => core/diff}/patch.lua | 40 +++--- .../{agent => core/diff}/search_replace.lua | 0 .../{agent => core/events}/queue.lua | 2 +- .../intent.lua => core/intent/init.lua} | 0 .../{agent => core/llm}/confidence.lua | 2 +- lua/codetyper/{ => core}/llm/copilot.lua | 14 +- lua/codetyper/{ => core}/llm/gemini.lua | 10 +- lua/codetyper/{ => core}/llm/init.lua | 18 +-- lua/codetyper/{ => core}/llm/ollama.lua | 12 +- lua/codetyper/{ => core}/llm/openai.lua | 12 +- lua/codetyper/{agent => core/llm}/parser.lua | 0 lua/codetyper/{ => core}/llm/selector.lua | 10 +- .../{brain => core/memory}/delta/commit.lua | 8 +- .../{brain => core/memory}/delta/diff.lua | 2 +- .../{brain => core/memory}/delta/init.lua | 28 ++-- .../{brain => core/memory}/graph/edge.lua | 6 +- .../{brain => core/memory}/graph/init.lua | 10 +- .../{brain => core/memory}/graph/node.lua | 6 +- .../{brain => core/memory}/graph/query.lua | 8 +- lua/codetyper/{brain => core/memory}/hash.lua | 0 lua/codetyper/{brain => core/memory}/init.lua | 18 +-- .../memory}/learners/convention.lua | 2 +- .../memory}/learners/correction.lua | 2 +- .../{brain => core/memory}/learners/init.lua | 14 +- .../memory}/learners/pattern.lua | 2 +- .../memory}/output/formatter.lua | 2 +- .../{brain => core/memory}/output/init.lua | 8 +- .../{brain => core/memory}/storage.lua | 4 +- .../{brain => core/memory}/types.lua | 0 .../{agent => core/scheduler}/executor.lua | 4 +- .../{agent => core/scheduler}/loop.lua | 8 +- .../{agent => core/scheduler}/resume.lua | 2 +- .../{agent => core/scheduler}/scheduler.lua | 34 ++--- .../{agent => core/scheduler}/worker.lua | 26 ++-- .../{agent/scope.lua => core/scope/init.lua} | 0 lua/codetyper/{agent => core}/tools/base.lua | 0 lua/codetyper/{agent => core}/tools/bash.lua | 2 +- lua/codetyper/{agent => core}/tools/edit.lua | 2 +- lua/codetyper/{agent => core}/tools/glob.lua | 2 +- lua/codetyper/{agent => core}/tools/grep.lua | 2 +- .../{agent/tools.lua => core/tools/init.lua} | 0 .../init.lua => core/tools/registry.lua} | 12 +- lua/codetyper/{agent => core}/tools/view.lua | 2 +- lua/codetyper/{agent => core}/tools/write.lua | 2 +- .../agents}/context_builder.lua | 2 +- .../agents/engine.lua} | 16 +-- .../{agent => features/agents}/init.lua | 20 +-- .../{agent => features/agents}/linter.lua | 12 +- .../agents}/permissions.lua | 0 .../{ask.lua => features/ask/engine.lua} | 6 +- lua/codetyper/{ => features}/ask/explorer.lua | 2 +- lua/codetyper/{ => features}/ask/intent.lua | 0 .../{agent => features/completion}/inject.lua | 2 +- .../completion/inline.lua} | 2 +- .../completion/suggestion.lua} | 0 .../{ => features}/indexer/analyzer.lua | 4 +- lua/codetyper/{ => features}/indexer/init.lua | 16 +-- .../{ => features}/indexer/memory.lua | 2 +- .../{ => features}/indexer/scanner.lua | 2 +- lua/codetyper/init.lua | 24 ++-- lua/codetyper/inject.lua | 6 +- lua/codetyper/parser.lua | 2 +- lua/codetyper/{ => support}/gitignore.lua | 2 +- lua/codetyper/{ => support}/health.lua | 6 +- lua/codetyper/{utils => support}/langmap.lua | 0 lua/codetyper/{ => support}/tree.lua | 2 +- lua/codetyper/{ => support}/utils.lua | 0 83 files changed, 337 insertions(+), 337 deletions(-) rename lua/codetyper/{ => adapters/nvim}/autocmds.lua (98%) rename lua/codetyper/{cmp_source => adapters/nvim/cmp}/init.lua (100%) rename lua/codetyper/{ => adapters/nvim}/commands.lua (92%) rename lua/codetyper/{agent/ui.lua => adapters/nvim/ui/chat.lua} (99%) rename lua/codetyper/{agent => adapters/nvim/ui}/context_modal.lua (99%) rename lua/codetyper/{agent => adapters/nvim/ui}/diff_review.lua (99%) rename lua/codetyper/{agent => adapters/nvim/ui}/logs.lua (100%) rename lua/codetyper/{ => adapters/nvim/ui}/logs_panel.lua (99%) rename lua/codetyper/{chat_switcher.lua => adapters/nvim/ui/switcher.lua} (88%) rename lua/codetyper/{window.lua => adapters/nvim/windows.lua} (97%) rename lua/codetyper/{ => config}/credentials.lua (99%) rename lua/codetyper/{config.lua => config/defaults.lua} (100%) rename lua/codetyper/{ => config}/preferences.lua (99%) rename lua/codetyper/{cost.lua => core/cost/init.lua} (99%) rename lua/codetyper/{agent => core/diff}/conflict.lua (99%) rename lua/codetyper/{agent => core/diff}/diff.lua (99%) rename lua/codetyper/{agent => core/diff}/patch.lua (96%) rename lua/codetyper/{agent => core/diff}/search_replace.lua (100%) rename lua/codetyper/{agent => core/events}/queue.lua (99%) rename lua/codetyper/{agent/intent.lua => core/intent/init.lua} (100%) rename lua/codetyper/{agent => core/llm}/confidence.lua (98%) rename lua/codetyper/{ => core}/llm/copilot.lua (98%) rename lua/codetyper/{ => core}/llm/gemini.lua (97%) rename lua/codetyper/{ => core}/llm/init.lua (93%) rename lua/codetyper/{ => core}/llm/ollama.lua (97%) rename lua/codetyper/{ => core}/llm/openai.lua (97%) rename lua/codetyper/{agent => core/llm}/parser.lua (100%) rename lua/codetyper/{ => core}/llm/selector.lua (98%) rename lua/codetyper/{brain => core/memory}/delta/commit.lua (96%) rename lua/codetyper/{brain => core/memory}/delta/diff.lua (99%) rename lua/codetyper/{brain => core/memory}/delta/init.lua (87%) rename lua/codetyper/{brain => core/memory}/graph/edge.lua (98%) rename lua/codetyper/{brain => core/memory}/graph/init.lua (94%) rename lua/codetyper/{brain => core/memory}/graph/node.lua (98%) rename lua/codetyper/{brain => core/memory}/graph/query.lua (98%) rename lua/codetyper/{brain => core/memory}/hash.lua (100%) rename lua/codetyper/{brain => core/memory}/init.lua (91%) rename lua/codetyper/{brain => core/memory}/learners/convention.lua (99%) rename lua/codetyper/{brain => core/memory}/learners/correction.lua (99%) rename lua/codetyper/{brain => core/memory}/learners/init.lua (93%) rename lua/codetyper/{brain => core/memory}/learners/pattern.lua (98%) rename lua/codetyper/{brain => core/memory}/output/formatter.lua (99%) rename lua/codetyper/{brain => core/memory}/output/init.lua (94%) rename lua/codetyper/{brain => core/memory}/storage.lua (98%) rename lua/codetyper/{brain => core/memory}/types.lua (100%) rename lua/codetyper/{agent => core/scheduler}/executor.lua (99%) rename lua/codetyper/{agent => core/scheduler}/loop.lua (97%) rename lua/codetyper/{agent => core/scheduler}/resume.lua (98%) rename lua/codetyper/{agent => core/scheduler}/scheduler.lua (95%) rename lua/codetyper/{agent => core/scheduler}/worker.lua (97%) rename lua/codetyper/{agent/scope.lua => core/scope/init.lua} (100%) rename lua/codetyper/{agent => core}/tools/base.lua (100%) rename lua/codetyper/{agent => core}/tools/bash.lua (98%) rename lua/codetyper/{agent => core}/tools/edit.lua (99%) rename lua/codetyper/{agent => core}/tools/glob.lua (98%) rename lua/codetyper/{agent => core}/tools/grep.lua (97%) rename lua/codetyper/{agent/tools.lua => core/tools/init.lua} (100%) rename lua/codetyper/{agent/tools/init.lua => core/tools/registry.lua} (95%) rename lua/codetyper/{agent => core}/tools/view.lua (98%) rename lua/codetyper/{agent => core}/tools/write.lua (96%) rename lua/codetyper/{agent => features/agents}/context_builder.lua (99%) rename lua/codetyper/{agent/agentic.lua => features/agents/engine.lua} (97%) rename lua/codetyper/{agent => features/agents}/init.lua (96%) rename lua/codetyper/{agent => features/agents}/linter.lua (96%) rename lua/codetyper/{agent => features/agents}/permissions.lua (100%) rename lua/codetyper/{ask.lua => features/ask/engine.lua} (99%) rename lua/codetyper/{ => features}/ask/explorer.lua (99%) rename lua/codetyper/{ => features}/ask/intent.lua (100%) rename lua/codetyper/{agent => features/completion}/inject.lua (99%) rename lua/codetyper/{completion.lua => features/completion/inline.lua} (99%) rename lua/codetyper/{suggestion/init.lua => features/completion/suggestion.lua} (100%) rename lua/codetyper/{ => features}/indexer/analyzer.lua (99%) rename lua/codetyper/{ => features}/indexer/init.lua (96%) rename lua/codetyper/{ => features}/indexer/memory.lua (99%) rename lua/codetyper/{ => features}/indexer/scanner.lua (99%) rename lua/codetyper/{ => support}/gitignore.lua (99%) rename lua/codetyper/{ => support}/health.lua (92%) rename lua/codetyper/{utils => support}/langmap.lua (100%) rename lua/codetyper/{ => support}/tree.lua (99%) rename lua/codetyper/{ => support}/utils.lua (100%) diff --git a/lua/codetyper/autocmds.lua b/lua/codetyper/adapters/nvim/autocmds.lua similarity index 98% rename from lua/codetyper/autocmds.lua rename to lua/codetyper/adapters/nvim/autocmds.lua index b39f36c..676fd1d 100644 --- a/lua/codetyper/autocmds.lua +++ b/lua/codetyper/adapters/nvim/autocmds.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Autocommand group name local AUGROUP = "Codetyper" @@ -43,7 +43,7 @@ local function schedule_tree_update() end tree_update_timer = vim.defer_fn(function() - local tree = require("codetyper.tree") + local tree = require("codetyper.support.tree") tree.update_tree_log() tree_update_timer = nil end, TREE_UPDATE_DEBOUNCE_MS) @@ -179,7 +179,7 @@ function M.setup() group = group, pattern = "*.coder.*", callback = function(ev) - local window = require("codetyper.window") + local window = require("codetyper.adapters.nvim.windows") if window.is_open() then window.close_split() end @@ -397,11 +397,11 @@ function M.check_for_closed_prompt() if scheduler_enabled then -- Event-driven: emit to queue vim.schedule(function() - local queue = require("codetyper.agent.queue") - local patch_mod = require("codetyper.agent.patch") - local intent_mod = require("codetyper.agent.intent") - local scope_mod = require("codetyper.agent.scope") - local logs_panel = require("codetyper.logs_panel") + local queue = require("codetyper.core.events.queue") + local patch_mod = require("codetyper.core.diff.patch") + local intent_mod = require("codetyper.core.intent") + local scope_mod = require("codetyper.core.scope") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") -- Open logs panel to show progress logs_panel.ensure_open() @@ -543,7 +543,7 @@ end ---@param skip_processed_check? boolean Skip the processed check (for manual mode) function M.process_single_prompt(bufnr, prompt, current_file, skip_processed_check) local parser = require("codetyper.parser") - local scheduler = require("codetyper.agent.scheduler") + local scheduler = require("codetyper.core.scheduler.scheduler") if not prompt.content or prompt.content == "" then return @@ -567,11 +567,11 @@ function M.process_single_prompt(bufnr, prompt, current_file, skip_processed_che -- Process this prompt vim.schedule(function() - local queue = require("codetyper.agent.queue") - local patch_mod = require("codetyper.agent.patch") - local intent_mod = require("codetyper.agent.intent") - local scope_mod = require("codetyper.agent.scope") - local logs_panel = require("codetyper.logs_panel") + local queue = require("codetyper.core.events.queue") + local patch_mod = require("codetyper.core.diff.patch") + local intent_mod = require("codetyper.core.intent") + local scope_mod = require("codetyper.core.scope") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") -- Open logs panel to show progress logs_panel.ensure_open() @@ -840,7 +840,7 @@ local auto_opened_buffers = {} --- Auto-open target file when a coder file is opened directly function M.auto_open_target_file() - local window = require("codetyper.window") + local window = require("codetyper.adapters.nvim.windows") -- Skip if split is already open if window.is_open() then @@ -1508,7 +1508,7 @@ function M.open_coder_companion(open_split) if open_split then -- Use the window module to open split view - local window = require("codetyper.window") + local window = require("codetyper.adapters.nvim.windows") window.open_split(coder_path, filepath) else -- Just open the coder file diff --git a/lua/codetyper/cmp_source/init.lua b/lua/codetyper/adapters/nvim/cmp/init.lua similarity index 100% rename from lua/codetyper/cmp_source/init.lua rename to lua/codetyper/adapters/nvim/cmp/init.lua diff --git a/lua/codetyper/commands.lua b/lua/codetyper/adapters/nvim/commands.lua similarity index 92% rename from lua/codetyper/commands.lua rename to lua/codetyper/adapters/nvim/commands.lua index eb27810..d1f0878 100644 --- a/lua/codetyper/commands.lua +++ b/lua/codetyper/adapters/nvim/commands.lua @@ -2,8 +2,8 @@ local M = {} -local utils = require("codetyper.utils") -local window = require("codetyper.window") +local utils = require("codetyper.support.utils") +local window = require("codetyper.adapters.nvim.windows") --- Open coder view for current file or select one ---@param opts? table Command options @@ -108,7 +108,7 @@ end --- Process prompt at cursor and generate code local function cmd_process() local parser = require("codetyper.parser") - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") local bufnr = vim.api.nvim_get_current_buf() local current_file = vim.fn.expand("%:p") @@ -153,7 +153,7 @@ end local function cmd_status() local codetyper = require("codetyper") local config = codetyper.get_config() - local tree = require("codetyper.tree") + local tree = require("codetyper.support.tree") local stats = tree.get_stats() @@ -195,7 +195,7 @@ end --- Refresh tree.log manually local function cmd_tree() - local tree = require("codetyper.tree") + local tree = require("codetyper.support.tree") if tree.update_tree_log() then utils.notify("Tree log updated: " .. tree.get_tree_log_path()) else @@ -205,7 +205,7 @@ end --- Open tree.log file local function cmd_tree_view() - local tree = require("codetyper.tree") + local tree = require("codetyper.support.tree") local tree_log_path = tree.get_tree_log_path() if not tree_log_path then @@ -224,63 +224,63 @@ end --- Reset processed prompts to allow re-processing local function cmd_reset() - local autocmds = require("codetyper.autocmds") + local autocmds = require("codetyper.adapters.nvim.autocmds") autocmds.reset_processed() end --- Force update gitignore local function cmd_gitignore() - local gitignore = require("codetyper.gitignore") + local gitignore = require("codetyper.support.gitignore") gitignore.force_update() end --- Open ask panel (with optional visual selection) ---@param selection table|nil Visual selection info local function cmd_ask(selection) - local ask = require("codetyper.ask") + local ask = require("codetyper.features.ask.engine") ask.open(selection) end --- Close ask panel local function cmd_ask_close() - local ask = require("codetyper.ask") + local ask = require("codetyper.features.ask.engine") ask.close() end --- Toggle ask panel local function cmd_ask_toggle() - local ask = require("codetyper.ask") + local ask = require("codetyper.features.ask.engine") ask.toggle() end --- Clear ask history local function cmd_ask_clear() - local ask = require("codetyper.ask") + local ask = require("codetyper.features.ask.engine") ask.clear_history() end --- Open agent panel (with optional visual selection) ---@param selection table|nil Visual selection info local function cmd_agent(selection) - local agent_ui = require("codetyper.agent.ui") + local agent_ui = require("codetyper.adapters.nvim.ui.chat") agent_ui.open(selection) end --- Close agent panel local function cmd_agent_close() - local agent_ui = require("codetyper.agent.ui") + local agent_ui = require("codetyper.adapters.nvim.ui.chat") agent_ui.close() end --- Toggle agent panel local function cmd_agent_toggle() - local agent_ui = require("codetyper.agent.ui") + local agent_ui = require("codetyper.adapters.nvim.ui.chat") agent_ui.toggle() end --- Stop running agent local function cmd_agent_stop() - local agent = require("codetyper.agent") + local agent = require("codetyper.features.agents") if agent.is_running() then agent.stop() utils.notify("Agent stopped") @@ -293,9 +293,9 @@ end ---@param task string The task to accomplish ---@param agent_name? string Optional agent name local function cmd_agentic_run(task, agent_name) - local agentic = require("codetyper.agent.agentic") - local logs_panel = require("codetyper.logs_panel") - local logs = require("codetyper.agent.logs") + local agentic = require("codetyper.features.agents.engine") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") + local logs = require("codetyper.adapters.nvim.ui.logs") -- Open logs panel logs_panel.open() @@ -355,7 +355,7 @@ end --- List available agents local function cmd_agentic_list() - local agentic = require("codetyper.agent.agentic") + local agentic = require("codetyper.features.agents.engine") local agents = agentic.list_agents() local lines = { @@ -379,7 +379,7 @@ end --- Initialize .coder/agents/ and .coder/rules/ directories local function cmd_agentic_init() - local agentic = require("codetyper.agent.agentic") + local agentic = require("codetyper.features.agents.engine") agentic.init() local agents_dir = vim.fn.getcwd() .. "/.coder/agents" @@ -409,14 +409,14 @@ end --- Toggle logs panel local function cmd_logs_toggle() - local logs_panel = require("codetyper.logs_panel") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") logs_panel.toggle() end --- Show scheduler status and queue info local function cmd_queue_status() - local scheduler = require("codetyper.agent.scheduler") - local queue = require("codetyper.agent.queue") + local scheduler = require("codetyper.core.scheduler.scheduler") + local queue = require("codetyper.core.events.queue") local parser = require("codetyper.parser") local status = scheduler.status() @@ -455,8 +455,8 @@ end --- Manually trigger queue processing for current buffer local function cmd_queue_process() - local autocmds = require("codetyper.autocmds") - local logs_panel = require("codetyper.logs_panel") + local autocmds = require("codetyper.adapters.nvim.autocmds") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") -- Open logs panel to show progress logs_panel.open() @@ -487,9 +487,9 @@ end --- Uses the same processing logic as automatic mode for consistent results local function cmd_transform() local parser = require("codetyper.parser") - local autocmds = require("codetyper.autocmds") - local logs_panel = require("codetyper.logs_panel") - local logs = require("codetyper.agent.logs") + local autocmds = require("codetyper.adapters.nvim.autocmds") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") + local logs = require("codetyper.adapters.nvim.ui.logs") local bufnr = vim.api.nvim_get_current_buf() local filepath = vim.fn.expand("%:p") @@ -527,9 +527,9 @@ end ---@param end_line number End line (1-indexed) local function cmd_transform_range(start_line, end_line) local parser = require("codetyper.parser") - local autocmds = require("codetyper.autocmds") - local logs_panel = require("codetyper.logs_panel") - local logs = require("codetyper.agent.logs") + local autocmds = require("codetyper.adapters.nvim.autocmds") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") + local logs = require("codetyper.adapters.nvim.ui.logs") local bufnr = vim.api.nvim_get_current_buf() local filepath = vim.fn.expand("%:p") @@ -579,7 +579,7 @@ end --- Index the entire project local function cmd_index_project() - local indexer = require("codetyper.indexer") + local indexer = require("codetyper.features.indexer") utils.notify("Indexing project...", vim.log.levels.INFO) @@ -601,8 +601,8 @@ end --- Show index status local function cmd_index_status() - local indexer = require("codetyper.indexer") - local memory = require("codetyper.indexer.memory") + local indexer = require("codetyper.features.indexer") + local memory = require("codetyper.features.indexer.memory") local status = indexer.get_status() local mem_stats = memory.get_stats() @@ -639,7 +639,7 @@ end --- Show learned memories local function cmd_memories() - local memory = require("codetyper.indexer.memory") + local memory = require("codetyper.features.indexer.memory") local all = memory.get_all() local lines = { @@ -684,7 +684,7 @@ end --- Clear memories ---@param pattern string|nil Optional pattern to match local function cmd_forget(pattern) - local memory = require("codetyper.indexer.memory") + local memory = require("codetyper.features.indexer.memory") if not pattern or pattern == "" then -- Confirm before clearing all @@ -706,9 +706,9 @@ end --- Uses the same processing logic as automatic mode for consistent results local function cmd_transform_at_cursor() local parser = require("codetyper.parser") - local autocmds = require("codetyper.autocmds") - local logs_panel = require("codetyper.logs_panel") - local logs = require("codetyper.agent.logs") + local autocmds = require("codetyper.adapters.nvim.autocmds") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") + local logs = require("codetyper.adapters.nvim.ui.logs") local bufnr = vim.api.nvim_get_current_buf() local filepath = vim.fn.expand("%:p") @@ -741,7 +741,7 @@ end ---@param args table Command arguments --- Show LLM accuracy statistics local function cmd_llm_stats() - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") local stats = llm.get_accuracy_stats() local lines = { @@ -769,13 +769,13 @@ end --- Report feedback on last LLM response ---@param was_good boolean Whether the response was good local function cmd_llm_feedback(was_good) - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") -- Get the last used provider from logs or default local provider = "ollama" -- Default assumption -- Try to get actual last provider from logs pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local entries = logs.get(10) for i = #entries, 1, -1 do local entry = entries[i] @@ -793,7 +793,7 @@ end --- Reset LLM accuracy statistics local function cmd_llm_reset_stats() - local selector = require("codetyper.llm.selector") + local selector = require("codetyper.core.llm.selector") selector.reset_accuracy_stats() utils.notify("LLM accuracy statistics reset", vim.log.levels.INFO) end @@ -877,11 +877,11 @@ local function coder_cmd(args) ["llm-reset-stats"] = cmd_llm_reset_stats, -- Cost tracking commands ["cost"] = function() - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.toggle() end, ["cost-clear"] = function() - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.clear() end, -- Credentials management commands @@ -1069,7 +1069,7 @@ function M.setup() -- Index command - open coder companion for current file vim.api.nvim_create_user_command("CoderIndex", function() - local autocmds = require("codetyper.autocmds") + local autocmds = require("codetyper.adapters.nvim.autocmds") autocmds.open_coder_companion() end, { desc = "Open coder companion for current file" }) @@ -1137,7 +1137,7 @@ function M.setup() -- Brain feedback command - teach the brain from your experience vim.api.nvim_create_user_command("CoderFeedback", function(opts) - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if not brain.is_initialized() then vim.notify("Brain not initialized", vim.log.levels.WARN) return @@ -1197,7 +1197,7 @@ function M.setup() -- Brain stats command vim.api.nvim_create_user_command("CoderBrain", function(opts) - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if not brain.is_initialized() then vim.notify("Brain not initialized", vim.log.levels.WARN) return @@ -1251,7 +1251,7 @@ function M.setup() -- Cost estimation command vim.api.nvim_create_user_command("CoderCost", function() - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.toggle() end, { desc = "Show LLM cost estimation window" }) @@ -1315,14 +1315,14 @@ function M.setup() -- Conflict mode commands vim.api.nvim_create_user_command("CoderConflictToggle", function() - local patch = require("codetyper.agent.patch") + local patch = require("codetyper.core.diff.patch") local current = patch.is_conflict_mode() patch.configure({ use_conflict_mode = not current }) utils.notify("Conflict mode " .. (not current and "enabled" or "disabled"), vim.log.levels.INFO) end, { desc = "Toggle conflict mode for code changes" }) vim.api.nvim_create_user_command("CoderConflictResolveAll", function(opts) - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() local keep = opts.args ~= "" and opts.args or "theirs" if not vim.tbl_contains({ "ours", "theirs", "both", "none" }, keep) then @@ -1338,18 +1338,18 @@ function M.setup() }) vim.api.nvim_create_user_command("CoderConflictNext", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") conflict.goto_next(vim.api.nvim_get_current_buf()) end, { desc = "Go to next conflict" }) vim.api.nvim_create_user_command("CoderConflictPrev", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") conflict.goto_prev(vim.api.nvim_get_current_buf()) end, { desc = "Go to previous conflict" }) vim.api.nvim_create_user_command("CoderConflictStatus", function() - local conflict = require("codetyper.agent.conflict") - local patch = require("codetyper.agent.patch") + local conflict = require("codetyper.core.diff.conflict") + local patch = require("codetyper.core.diff.patch") local bufnr = vim.api.nvim_get_current_buf() local count = conflict.count_conflicts(bufnr) local mode = patch.is_conflict_mode() and "enabled" or "disabled" @@ -1357,7 +1357,7 @@ function M.setup() end, { desc = "Show conflict status" }) vim.api.nvim_create_user_command("CoderConflictMenu", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() -- Ensure conflicts are processed first (sets up highlights and keymaps) conflict.process(bufnr) @@ -1366,35 +1366,35 @@ function M.setup() -- Manual commands to accept conflicts vim.api.nvim_create_user_command("CoderConflictAcceptCurrent", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() conflict.process(bufnr) -- Ensure keymaps are set up conflict.accept_ours(bufnr) end, { desc = "Accept current (original) code" }) vim.api.nvim_create_user_command("CoderConflictAcceptIncoming", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() conflict.process(bufnr) -- Ensure keymaps are set up conflict.accept_theirs(bufnr) end, { desc = "Accept incoming (AI) code" }) vim.api.nvim_create_user_command("CoderConflictAcceptBoth", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() conflict.process(bufnr) conflict.accept_both(bufnr) end, { desc = "Accept both versions" }) vim.api.nvim_create_user_command("CoderConflictAcceptNone", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local bufnr = vim.api.nvim_get_current_buf() conflict.process(bufnr) conflict.accept_none(bufnr) end, { desc = "Delete conflict (accept none)" }) vim.api.nvim_create_user_command("CoderConflictAutoMenu", function() - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") local conf = conflict.get_config() local new_state = not conf.auto_show_menu conflict.configure({ auto_show_menu = new_state, auto_show_next_menu = new_state }) @@ -1402,12 +1402,12 @@ function M.setup() end, { desc = "Toggle auto-show conflict menu after code injection" }) -- Initialize conflict module - local conflict = require("codetyper.agent.conflict") + local conflict = require("codetyper.core.diff.conflict") conflict.setup() -- Linter validation commands vim.api.nvim_create_user_command("CoderLintCheck", function() - local linter = require("codetyper.agent.linter") + local linter = require("codetyper.features.agents.linter") local bufnr = vim.api.nvim_get_current_buf() linter.validate_after_injection(bufnr, nil, nil, function(result) if result then @@ -1419,7 +1419,7 @@ function M.setup() end, { desc = "Check current buffer for lint errors" }) vim.api.nvim_create_user_command("CoderLintFix", function() - local linter = require("codetyper.agent.linter") + local linter = require("codetyper.features.agents.linter") local bufnr = vim.api.nvim_get_current_buf() local line_count = vim.api.nvim_buf_line_count(bufnr) local result = linter.check_region(bufnr, 1, line_count) @@ -1431,7 +1431,7 @@ function M.setup() end, { desc = "Request AI to fix lint errors in current buffer" }) vim.api.nvim_create_user_command("CoderLintQuickfix", function() - local linter = require("codetyper.agent.linter") + local linter = require("codetyper.features.agents.linter") local bufnr = vim.api.nvim_get_current_buf() local line_count = vim.api.nvim_buf_line_count(bufnr) local result = linter.check_region(bufnr, 1, line_count) @@ -1443,8 +1443,8 @@ function M.setup() end, { desc = "Show lint errors in quickfix list" }) vim.api.nvim_create_user_command("CoderLintToggleAuto", function() - local conflict = require("codetyper.agent.conflict") - local linter = require("codetyper.agent.linter") + local conflict = require("codetyper.core.diff.conflict") + local linter = require("codetyper.features.agents.linter") local linter_config = linter.get_config() local new_state = not linter_config.auto_save linter.configure({ auto_save = new_state }) diff --git a/lua/codetyper/agent/ui.lua b/lua/codetyper/adapters/nvim/ui/chat.lua similarity index 99% rename from lua/codetyper/agent/ui.lua rename to lua/codetyper/adapters/nvim/ui/chat.lua index 6ae9709..0b697c3 100644 --- a/lua/codetyper/agent/ui.lua +++ b/lua/codetyper/adapters/nvim/ui/chat.lua @@ -4,9 +4,9 @@ local M = {} -local agent = require("codetyper.agent") -local logs = require("codetyper.agent.logs") -local utils = require("codetyper.utils") +local agent = require("codetyper.features.agents") +local logs = require("codetyper.adapters.nvim.ui.logs") +local utils = require("codetyper.support.utils") ---@class AgentUIState ---@field chat_buf number|nil Chat buffer @@ -321,7 +321,7 @@ local function submit_input() vim.bo[state.chat_buf].modifiable = false end -- Also clear collected diffs - local diff_review = require("codetyper.agent.diff_review") + local diff_review = require("codetyper.adapters.nvim.ui.diff_review") diff_review.clear() return end @@ -387,7 +387,7 @@ local function submit_input() current_file = vim.fn.expand("%:p") end - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") local context = {} if current_file ~= "" and vim.fn.filereadable(current_file) == 1 then diff --git a/lua/codetyper/agent/context_modal.lua b/lua/codetyper/adapters/nvim/ui/context_modal.lua similarity index 99% rename from lua/codetyper/agent/context_modal.lua rename to lua/codetyper/adapters/nvim/ui/context_modal.lua index ea515e1..be772e7 100644 --- a/lua/codetyper/agent/context_modal.lua +++ b/lua/codetyper/adapters/nvim/ui/context_modal.lua @@ -304,7 +304,7 @@ function M.open(original_event, llm_response, callback, suggested_commands) -- Log pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Context modal opened - waiting for user input", diff --git a/lua/codetyper/agent/diff_review.lua b/lua/codetyper/adapters/nvim/ui/diff_review.lua similarity index 99% rename from lua/codetyper/agent/diff_review.lua rename to lua/codetyper/adapters/nvim/ui/diff_review.lua index cbe8cf0..ff71c0f 100644 --- a/lua/codetyper/agent/diff_review.lua +++ b/lua/codetyper/adapters/nvim/ui/diff_review.lua @@ -5,7 +5,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") local prompts = require("codetyper.prompts.agent.diff") diff --git a/lua/codetyper/agent/logs.lua b/lua/codetyper/adapters/nvim/ui/logs.lua similarity index 100% rename from lua/codetyper/agent/logs.lua rename to lua/codetyper/adapters/nvim/ui/logs.lua diff --git a/lua/codetyper/logs_panel.lua b/lua/codetyper/adapters/nvim/ui/logs_panel.lua similarity index 99% rename from lua/codetyper/logs_panel.lua rename to lua/codetyper/adapters/nvim/ui/logs_panel.lua index 789b127..25cdfb4 100644 --- a/lua/codetyper/logs_panel.lua +++ b/lua/codetyper/adapters/nvim/ui/logs_panel.lua @@ -4,8 +4,8 @@ local M = {} -local logs = require("codetyper.agent.logs") -local queue = require("codetyper.agent.queue") +local logs = require("codetyper.adapters.nvim.ui.logs") +local queue = require("codetyper.core.events.queue") ---@class LogsPanelState ---@field buf number|nil Logs buffer diff --git a/lua/codetyper/chat_switcher.lua b/lua/codetyper/adapters/nvim/ui/switcher.lua similarity index 88% rename from lua/codetyper/chat_switcher.lua rename to lua/codetyper/adapters/nvim/ui/switcher.lua index 09f9bef..c65ad05 100644 --- a/lua/codetyper/chat_switcher.lua +++ b/lua/codetyper/adapters/nvim/ui/switcher.lua @@ -20,8 +20,8 @@ function M.show() end -- Close current panel first - local ask = require("codetyper.ask") - local agent_ui = require("codetyper.agent.ui") + local ask = require("codetyper.features.ask.engine") + local agent_ui = require("codetyper.adapters.nvim.ui.chat") if ask.is_open() then ask.close() diff --git a/lua/codetyper/window.lua b/lua/codetyper/adapters/nvim/windows.lua similarity index 97% rename from lua/codetyper/window.lua rename to lua/codetyper/adapters/nvim/windows.lua index 27d2ce4..31b04dc 100644 --- a/lua/codetyper/window.lua +++ b/lua/codetyper/adapters/nvim/windows.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") ---@type number|nil Current coder window ID M._coder_win = nil @@ -43,7 +43,7 @@ function M.open_split(target_path, coder_path) utils.write_file(coder_path, "") -- Ensure gitignore is updated when creating a new coder file - local gitignore = require("codetyper.gitignore") + local gitignore = require("codetyper.support.gitignore") gitignore.ensure_ignored() end diff --git a/lua/codetyper/credentials.lua b/lua/codetyper/config/credentials.lua similarity index 99% rename from lua/codetyper/credentials.lua rename to lua/codetyper/config/credentials.lua index 18f9880..837b9e4 100644 --- a/lua/codetyper/credentials.lua +++ b/lua/codetyper/config/credentials.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Get the credentials file path ---@return string Path to credentials file diff --git a/lua/codetyper/config.lua b/lua/codetyper/config/defaults.lua similarity index 100% rename from lua/codetyper/config.lua rename to lua/codetyper/config/defaults.lua diff --git a/lua/codetyper/preferences.lua b/lua/codetyper/config/preferences.lua similarity index 99% rename from lua/codetyper/preferences.lua rename to lua/codetyper/config/preferences.lua index ec28f4f..0c3c0da 100644 --- a/lua/codetyper/preferences.lua +++ b/lua/codetyper/config/preferences.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") ---@class CoderPreferences ---@field auto_process boolean Whether to auto-process /@ @/ tags (default: nil = ask) diff --git a/lua/codetyper/cost.lua b/lua/codetyper/core/cost/init.lua similarity index 99% rename from lua/codetyper/cost.lua rename to lua/codetyper/core/cost/init.lua index 33c3442..e304998 100644 --- a/lua/codetyper/cost.lua +++ b/lua/codetyper/core/cost/init.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Cost history file name local COST_HISTORY_FILE = "cost_history.json" diff --git a/lua/codetyper/agent/conflict.lua b/lua/codetyper/core/diff/conflict.lua similarity index 99% rename from lua/codetyper/agent/conflict.lua rename to lua/codetyper/core/diff/conflict.lua index 141b593..f5bfb52 100644 --- a/lua/codetyper/agent/conflict.lua +++ b/lua/codetyper/core/diff/conflict.lua @@ -19,7 +19,7 @@ local params = require("codetyper.params.agent.conflict") --- Lazy load linter module local function get_linter() - return require("codetyper.agent.linter") + return require("codetyper.features.agents.linter") end --- Configuration @@ -66,7 +66,7 @@ local function validate_after_accept(bufnr, start_line, end_line, accepted_type) -- If errors found and auto-fix is enabled, queue fix automatically if result.has_errors and config.auto_fix_lint_errors then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Auto-queuing fix for lint errors...", @@ -954,7 +954,7 @@ function M.process(bufnr) -- Log pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.info(string.format("Found %d conflict(s) - use co/ct/cb/cn to resolve, [x/]x to navigate", #conflicts)) end) else diff --git a/lua/codetyper/agent/diff.lua b/lua/codetyper/core/diff/diff.lua similarity index 99% rename from lua/codetyper/agent/diff.lua rename to lua/codetyper/core/diff/diff.lua index 1dde651..2870436 100644 --- a/lua/codetyper/agent/diff.lua +++ b/lua/codetyper/core/diff/diff.lua @@ -178,7 +178,7 @@ end ---@param command string The bash command to approve ---@param callback fun(result: BashApprovalResult) Called with user decision function M.show_bash_approval(command, callback) - local permissions = require("codetyper.agent.permissions") + local permissions = require("codetyper.features.agents.permissions") -- Check if command is auto-approved local perm_result = permissions.check_bash_permission(command) diff --git a/lua/codetyper/agent/patch.lua b/lua/codetyper/core/diff/patch.lua similarity index 96% rename from lua/codetyper/agent/patch.lua rename to lua/codetyper/core/diff/patch.lua index fdb5d43..97916e7 100644 --- a/lua/codetyper/agent/patch.lua +++ b/lua/codetyper/core/diff/patch.lua @@ -12,17 +12,17 @@ local params = require("codetyper.params.agent.patch") --- Lazy load inject module to avoid circular requires local function get_inject_module() - return require("codetyper.agent.inject") + return require("codetyper.inject") end --- Lazy load search_replace module local function get_search_replace_module() - return require("codetyper.agent.search_replace") + return require("codetyper.core.diff.search_replace") end --- Lazy load conflict module local function get_conflict_module() - return require("codetyper.agent.conflict") + return require("codetyper.core.diff.conflict") end --- Configuration for patch behavior @@ -170,7 +170,7 @@ function M.queue_patch(patch) -- Log patch creation pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "patch", message = string.format( @@ -236,14 +236,14 @@ function M.create_from_event(event, generated_code, confidence, strategy) if use_search_replace then injection_strategy = "search_replace" pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Using SEARCH/REPLACE mode with %d block(s)", #sr_blocks), }) end) elseif not injection_strategy and event.intent then - local intent_mod = require("codetyper.agent.intent") + local intent_mod = require("codetyper.core.intent") if intent_mod.is_replacement(event.intent) then injection_strategy = "replace" @@ -255,7 +255,7 @@ function M.create_from_event(event, generated_code, confidence, strategy) end_line = event.range.end_line, } pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Inline prompt: will replace tag region (lines %d-%d)", @@ -273,7 +273,7 @@ function M.create_from_event(event, generated_code, confidence, strategy) end_line = event.range.end_line, } pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = "No scope found, using tag range as fallback", @@ -510,7 +510,7 @@ function M.apply(patch) M.mark_stale(patch.id, stale_reason) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = string.format("Patch %s is stale: %s", patch.id, stale_reason or "unknown"), @@ -549,7 +549,7 @@ function M.apply(patch) pcall(function() if tags_removed > 0 then - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local source_name = vim.api.nvim_buf_get_name(source_bufnr) logs.add({ type = "info", @@ -573,7 +573,7 @@ function M.apply(patch) tags_removed = remove_prompt_tags(source_bufnr) if tags_removed > 0 then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Removed %d prompt tag(s)", tags_removed), @@ -589,7 +589,7 @@ function M.apply(patch) M.mark_applied(patch.id) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "success", message = string.format("Patch %s applied via SEARCH/REPLACE (%d block(s))", @@ -603,7 +603,7 @@ function M.apply(patch) -- Learn from successful code generation pcall(function() - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if brain.is_initialized() then local intent_type = patch.intent and patch.intent.type or "unknown" brain.learn({ @@ -624,7 +624,7 @@ function M.apply(patch) else -- SEARCH/REPLACE failed, log the error pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = string.format("SEARCH/REPLACE failed: %s. Falling back to line-based injection.", err or "unknown"), @@ -723,7 +723,7 @@ function M.apply(patch) -- Log inline prompt handling if is_inline_prompt then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Inline prompt: replacing lines %d-%d", @@ -738,7 +738,7 @@ function M.apply(patch) -- Log injection details pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") if inject_result.imports_added > 0 then logs.add({ type = "info", @@ -766,7 +766,7 @@ function M.apply(patch) M.mark_applied(patch.id) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "success", message = string.format("Patch %s applied successfully", patch.id), @@ -780,7 +780,7 @@ function M.apply(patch) -- Learn from successful code generation - this builds neural pathways -- The more code is successfully applied, the better the brain becomes pcall(function() - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if brain.is_initialized() then -- Learn the successful pattern local intent_type = patch.intent and patch.intent.type or "unknown" @@ -1010,7 +1010,7 @@ function M.apply_with_conflict(patch) M.mark_applied(patch.id) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "success", message = string.format( @@ -1044,7 +1044,7 @@ function M.apply_with_conflict(patch) M.mark_applied(patch.id) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "success", message = "Created conflict for review - use co/ct/cb/cn to resolve", diff --git a/lua/codetyper/agent/search_replace.lua b/lua/codetyper/core/diff/search_replace.lua similarity index 100% rename from lua/codetyper/agent/search_replace.lua rename to lua/codetyper/core/diff/search_replace.lua diff --git a/lua/codetyper/agent/queue.lua b/lua/codetyper/core/events/queue.lua similarity index 99% rename from lua/codetyper/agent/queue.lua rename to lua/codetyper/core/events/queue.lua index 9c763c1..002cd3b 100644 --- a/lua/codetyper/agent/queue.lua +++ b/lua/codetyper/core/events/queue.lua @@ -194,7 +194,7 @@ function M.enqueue(event) -- Log to agent logs if available pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "queue", message = string.format("Event queued: %s (priority: %d)", event.id, event.priority), diff --git a/lua/codetyper/agent/intent.lua b/lua/codetyper/core/intent/init.lua similarity index 100% rename from lua/codetyper/agent/intent.lua rename to lua/codetyper/core/intent/init.lua diff --git a/lua/codetyper/agent/confidence.lua b/lua/codetyper/core/llm/confidence.lua similarity index 98% rename from lua/codetyper/agent/confidence.lua rename to lua/codetyper/core/llm/confidence.lua index 4be2b3b..1ac14c8 100644 --- a/lua/codetyper/agent/confidence.lua +++ b/lua/codetyper/core/llm/confidence.lua @@ -74,7 +74,7 @@ local function score_syntax(response) local score = 1.0 -- Check bracket balance - if not require("codetyper.utils").check_brackets(response) then + if not require("codetyper.support.utils").check_brackets(response) then score = score - 0.4 end diff --git a/lua/codetyper/llm/copilot.lua b/lua/codetyper/core/llm/copilot.lua similarity index 98% rename from lua/codetyper/llm/copilot.lua rename to lua/codetyper/core/llm/copilot.lua index b7fd44e..17ecc1b 100644 --- a/lua/codetyper/llm/copilot.lua +++ b/lua/codetyper/core/llm/copilot.lua @@ -2,8 +2,8 @@ local M = {} -local utils = require("codetyper.utils") -local llm = require("codetyper.llm") +local utils = require("codetyper.support.utils") +local llm = require("codetyper.core.llm") --- Copilot API endpoints local AUTH_URL = "https://api.github.com/copilot_internal/v2/token" @@ -296,7 +296,7 @@ local function make_request(token, body, callback) -- Record usage for cost tracking if usage.prompt_tokens or usage.completion_tokens then - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.record_usage( get_model(), usage.prompt_tokens or 0, @@ -348,7 +348,7 @@ end ---@param context table Context information ---@param callback fun(response: string|nil, error: string|nil) function M.generate(prompt, context, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") ensure_initialized() @@ -414,7 +414,7 @@ end ---@param tool_definitions table Tool definitions ---@param callback fun(response: table|nil, error: string|nil) function M.generate_with_tools(messages, context, tool_definitions, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") ensure_initialized() @@ -436,7 +436,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) return end - local tools_module = require("codetyper.agent.tools") + local tools_module = require("codetyper.core.tools") local agent_prompts = require("codetyper.prompts.agent") -- Build system prompt with agent instructions and project context @@ -634,7 +634,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) logs.response(response.usage.prompt_tokens or 0, response.usage.completion_tokens or 0, "stop") -- Record usage for cost tracking - local cost_tracker = require("codetyper.cost") + local cost_tracker = require("codetyper.core.cost") cost_tracker.record_usage( get_model(), response.usage.prompt_tokens or 0, diff --git a/lua/codetyper/llm/gemini.lua b/lua/codetyper/core/llm/gemini.lua similarity index 97% rename from lua/codetyper/llm/gemini.lua rename to lua/codetyper/core/llm/gemini.lua index d6ebdef..20c081d 100644 --- a/lua/codetyper/llm/gemini.lua +++ b/lua/codetyper/core/llm/gemini.lua @@ -2,8 +2,8 @@ local M = {} -local utils = require("codetyper.utils") -local llm = require("codetyper.llm") +local utils = require("codetyper.support.utils") +local llm = require("codetyper.core.llm") --- Gemini API endpoint local API_URL = "https://generativelanguage.googleapis.com/v1beta/models" @@ -167,7 +167,7 @@ end ---@param context table Context information ---@param callback fun(response: string|nil, error: string|nil) Callback function function M.generate(prompt, context, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local model = get_model() -- Log the request @@ -217,7 +217,7 @@ end ---@param tool_definitions table Tool definitions ---@param callback fun(response: table|nil, error: string|nil) Callback with raw response function M.generate_with_tools(messages, context, tool_definitions, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local model = get_model() logs.request("gemini", model) @@ -230,7 +230,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) return end - local tools_module = require("codetyper.agent.tools") + local tools_module = require("codetyper.core.tools") local agent_prompts = require("codetyper.prompts.agent") -- Build system prompt with agent instructions diff --git a/lua/codetyper/llm/init.lua b/lua/codetyper/core/llm/init.lua similarity index 93% rename from lua/codetyper/llm/init.lua rename to lua/codetyper/core/llm/init.lua index 8e9f003..4a6f5a2 100644 --- a/lua/codetyper/llm/init.lua +++ b/lua/codetyper/core/llm/init.lua @@ -1,8 +1,8 @@ ---@mod codetyper.llm LLM interface for Codetyper.nvim local M = {} -local lang_map = require("codetyper.utils.langmap") -local utils = require("codetyper.utils") +local lang_map = require("codetyper.support.langmap") +local utils = require("codetyper.support.utils") --- Get the appropriate LLM client based on configuration ---@return table LLM client module @@ -11,13 +11,13 @@ function M.get_client() local config = codetyper.get_config() if config.llm.provider == "ollama" then - return require("codetyper.llm.ollama") + return require("codetyper.core.llm.ollama") elseif config.llm.provider == "openai" then - return require("codetyper.llm.openai") + return require("codetyper.core.llm.openai") elseif config.llm.provider == "gemini" then - return require("codetyper.llm.gemini") + return require("codetyper.core.llm.gemini") elseif config.llm.provider == "copilot" then - return require("codetyper.llm.copilot") + return require("codetyper.core.llm.copilot") else error("Unknown LLM provider: " .. config.llm.provider) end @@ -39,14 +39,14 @@ end ---@param context table Context information ---@param callback fun(response: string|nil, error: string|nil, metadata: table|nil) Callback function M.smart_generate(prompt, context, callback) - local selector = require("codetyper.llm.selector") + local selector = require("codetyper.core.llm.selector") selector.smart_generate(prompt, context, callback) end --- Get accuracy statistics for providers ---@return table Statistics for each provider function M.get_accuracy_stats() - local selector = require("codetyper.llm.selector") + local selector = require("codetyper.core.llm.selector") return selector.get_accuracy_stats() end @@ -54,7 +54,7 @@ end ---@param provider string Which provider generated the response ---@param was_correct boolean Whether the response was good function M.report_feedback(provider, was_correct) - local selector = require("codetyper.llm.selector") + local selector = require("codetyper.core.llm.selector") selector.report_feedback(provider, was_correct) end diff --git a/lua/codetyper/llm/ollama.lua b/lua/codetyper/core/llm/ollama.lua similarity index 97% rename from lua/codetyper/llm/ollama.lua rename to lua/codetyper/core/llm/ollama.lua index 1033c99..aea3fc6 100644 --- a/lua/codetyper/llm/ollama.lua +++ b/lua/codetyper/core/llm/ollama.lua @@ -2,8 +2,8 @@ local M = {} -local utils = require("codetyper.utils") -local llm = require("codetyper.llm") +local utils = require("codetyper.support.utils") +local llm = require("codetyper.core.llm") --- Get Ollama host from stored credentials or config ---@return string Host URL @@ -137,7 +137,7 @@ end ---@param context table Context information ---@param callback fun(response: string|nil, error: string|nil) Callback function function M.generate(prompt, context, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local model = get_model() -- Log the request @@ -217,9 +217,9 @@ end ---@param tool_definitions table Tool definitions ---@param callback fun(response: table|nil, error: string|nil) Callback with Claude-like response format function M.generate_with_tools(messages, context, tool_definitions, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local agent_prompts = require("codetyper.prompts.agent") - local tools_module = require("codetyper.agent.tools") + local tools_module = require("codetyper.core.tools") logs.request("ollama", get_model()) logs.thinking("Preparing agent request...") @@ -322,7 +322,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) logs.response(response.prompt_eval_count or 0, response.eval_count or 0, "stop") -- Record usage for cost tracking (free for local models) - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.record_usage( get_model(), response.prompt_eval_count or 0, diff --git a/lua/codetyper/llm/openai.lua b/lua/codetyper/core/llm/openai.lua similarity index 97% rename from lua/codetyper/llm/openai.lua rename to lua/codetyper/core/llm/openai.lua index 4933945..cb5be26 100644 --- a/lua/codetyper/llm/openai.lua +++ b/lua/codetyper/core/llm/openai.lua @@ -2,8 +2,8 @@ local M = {} -local utils = require("codetyper.utils") -local llm = require("codetyper.llm") +local utils = require("codetyper.support.utils") +local llm = require("codetyper.core.llm") --- OpenAI API endpoint local API_URL = "https://api.openai.com/v1/chat/completions" @@ -158,7 +158,7 @@ end ---@param context table Context information ---@param callback fun(response: string|nil, error: string|nil) Callback function function M.generate(prompt, context, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local model = get_model() -- Log the request @@ -208,7 +208,7 @@ end ---@param tool_definitions table Tool definitions ---@param callback fun(response: table|nil, error: string|nil) Callback with raw response function M.generate_with_tools(messages, context, tool_definitions, callback) - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local model = get_model() logs.request("openai", model) @@ -221,7 +221,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) return end - local tools_module = require("codetyper.agent.tools") + local tools_module = require("codetyper.core.tools") local agent_prompts = require("codetyper.prompts.agent") -- Build system prompt with agent instructions @@ -310,7 +310,7 @@ function M.generate_with_tools(messages, context, tool_definitions, callback) logs.response(response.usage.prompt_tokens or 0, response.usage.completion_tokens or 0, "stop") -- Record usage for cost tracking - local cost = require("codetyper.cost") + local cost = require("codetyper.core.cost") cost.record_usage( model, response.usage.prompt_tokens or 0, diff --git a/lua/codetyper/agent/parser.lua b/lua/codetyper/core/llm/parser.lua similarity index 100% rename from lua/codetyper/agent/parser.lua rename to lua/codetyper/core/llm/parser.lua diff --git a/lua/codetyper/llm/selector.lua b/lua/codetyper/core/llm/selector.lua similarity index 98% rename from lua/codetyper/llm/selector.lua rename to lua/codetyper/core/llm/selector.lua index aebc21c..429b146 100644 --- a/lua/codetyper/llm/selector.lua +++ b/lua/codetyper/core/llm/selector.lua @@ -296,7 +296,7 @@ end ---@param callback fun(result: PonderResult) Callback with pondering result function M.ponder(prompt, context, ollama_response, callback) -- Use Copilot as verifier - local copilot = require("codetyper.llm.copilot") + local copilot = require("codetyper.core.llm.copilot") -- Build verification prompt local verify_prompt = prompt @@ -393,7 +393,7 @@ function M.smart_generate(prompt, context, callback) -- Log selection pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format( @@ -408,9 +408,9 @@ function M.smart_generate(prompt, context, callback) -- Get the selected client local client if selection.provider == "ollama" then - client = require("codetyper.llm.ollama") + client = require("codetyper.core.llm.ollama") else - client = require("codetyper.llm.copilot") + client = require("codetyper.core.llm.copilot") end -- Generate response @@ -419,7 +419,7 @@ function M.smart_generate(prompt, context, callback) -- Fallback on error if selection.provider == "ollama" then -- Try Copilot as fallback - local copilot = require("codetyper.llm.copilot") + local copilot = require("codetyper.core.llm.copilot") copilot.generate(prompt, context, function(fallback_response, fallback_error) callback(fallback_response, fallback_error, { provider = "copilot", diff --git a/lua/codetyper/brain/delta/commit.lua b/lua/codetyper/core/memory/delta/commit.lua similarity index 96% rename from lua/codetyper/brain/delta/commit.lua rename to lua/codetyper/core/memory/delta/commit.lua index 9afd60d..d84dad5 100644 --- a/lua/codetyper/brain/delta/commit.lua +++ b/lua/codetyper/core/memory/delta/commit.lua @@ -1,10 +1,10 @@ --- Brain Delta Commit Operations --- Git-like commit creation and management -local storage = require("codetyper.brain.storage") -local hash_mod = require("codetyper.brain.hash") -local diff_mod = require("codetyper.brain.delta.diff") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local hash_mod = require("codetyper.core.memory.hash") +local diff_mod = require("codetyper.core.memory.delta.diff") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/delta/diff.lua b/lua/codetyper/core/memory/delta/diff.lua similarity index 99% rename from lua/codetyper/brain/delta/diff.lua rename to lua/codetyper/core/memory/delta/diff.lua index b1d63d6..aeb4213 100644 --- a/lua/codetyper/brain/delta/diff.lua +++ b/lua/codetyper/core/memory/delta/diff.lua @@ -1,7 +1,7 @@ --- Brain Delta Diff Computation --- Field-level diff algorithms for delta versioning -local hash = require("codetyper.brain.hash") +local hash = require("codetyper.core.memory.hash") local M = {} diff --git a/lua/codetyper/brain/delta/init.lua b/lua/codetyper/core/memory/delta/init.lua similarity index 87% rename from lua/codetyper/brain/delta/init.lua rename to lua/codetyper/core/memory/delta/init.lua index 7efa8e5..cde1d89 100644 --- a/lua/codetyper/brain/delta/init.lua +++ b/lua/codetyper/core/memory/delta/init.lua @@ -1,10 +1,10 @@ --- Brain Delta Coordinator --- Git-like versioning system for brain state -local storage = require("codetyper.brain.storage") -local commit_mod = require("codetyper.brain.delta.commit") -local diff_mod = require("codetyper.brain.delta.diff") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local commit_mod = require("codetyper.core.memory.delta.commit") +local diff_mod = require("codetyper.core.memory.delta.diff") +local types = require("codetyper.core.memory.types") local M = {} @@ -17,7 +17,7 @@ M.diff = diff_mod ---@param trigger? string Trigger source ---@return string|nil Delta hash function M.commit(message, trigger) - local graph = require("codetyper.brain.graph") + local graph = require("codetyper.core.memory.graph") local changes = graph.get_pending_changes() if #changes == 0 then @@ -87,7 +87,7 @@ end --- Apply changes to current state ---@param changes table[] Changes to apply function M.apply_changes(changes) - local node_mod = require("codetyper.brain.graph.node") + local node_mod = require("codetyper.core.memory.graph.node") for _, change in ipairs(changes) do local parts = vim.split(change.path, ".", { plain = true }) @@ -117,7 +117,7 @@ function M.apply_changes(changes) end elseif parts[1] == "graph" then -- Handle graph/edge changes - local edge_mod = require("codetyper.brain.graph.edge") + local edge_mod = require("codetyper.core.memory.graph.edge") if parts[2] == "edges" and #parts >= 3 then local edge_id = parts[3] if change.op == types.DELTA_OPS.ADD then @@ -168,17 +168,17 @@ end --- Check if there are uncommitted changes ---@return boolean function M.has_pending() - local graph = require("codetyper.brain.graph") - local node_pending = require("codetyper.brain.graph.node").pending - local edge_pending = require("codetyper.brain.graph.edge").pending + local graph = require("codetyper.core.memory.graph") + local node_pending = require("codetyper.core.memory.graph.node").pending + local edge_pending = require("codetyper.core.memory.graph.edge").pending return #node_pending > 0 or #edge_pending > 0 end --- Get status (like git status) ---@return table Status info function M.status() - local node_pending = require("codetyper.brain.graph.node").pending - local edge_pending = require("codetyper.brain.graph.edge").pending + local node_pending = require("codetyper.core.memory.graph.node").pending + local edge_pending = require("codetyper.core.memory.graph.edge").pending local adds = 0 local mods = 0 @@ -268,8 +268,8 @@ function M.reset() }) -- Clear pending - require("codetyper.brain.graph.node").pending = {} - require("codetyper.brain.graph.edge").pending = {} + require("codetyper.core.memory.graph.node").pending = {} + require("codetyper.core.memory.graph.edge").pending = {} storage.flush_all() return true diff --git a/lua/codetyper/brain/graph/edge.lua b/lua/codetyper/core/memory/graph/edge.lua similarity index 98% rename from lua/codetyper/brain/graph/edge.lua rename to lua/codetyper/core/memory/graph/edge.lua index 0b81c92..026b2f0 100644 --- a/lua/codetyper/brain/graph/edge.lua +++ b/lua/codetyper/core/memory/graph/edge.lua @@ -1,9 +1,9 @@ --- Brain Graph Edge Operations --- CRUD operations for node connections -local storage = require("codetyper.brain.storage") -local hash = require("codetyper.brain.hash") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local hash = require("codetyper.core.memory.hash") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/graph/init.lua b/lua/codetyper/core/memory/graph/init.lua similarity index 94% rename from lua/codetyper/brain/graph/init.lua rename to lua/codetyper/core/memory/graph/init.lua index 004652c..d31dcc6 100644 --- a/lua/codetyper/brain/graph/init.lua +++ b/lua/codetyper/core/memory/graph/init.lua @@ -1,11 +1,11 @@ --- Brain Graph Coordinator --- High-level graph operations -local node = require("codetyper.brain.graph.node") -local edge = require("codetyper.brain.graph.edge") -local query = require("codetyper.brain.graph.query") -local storage = require("codetyper.brain.storage") -local types = require("codetyper.brain.types") +local node = require("codetyper.core.memory.graph.node") +local edge = require("codetyper.core.memory.graph.edge") +local query = require("codetyper.core.memory.graph.query") +local storage = require("codetyper.core.memory.storage") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/graph/node.lua b/lua/codetyper/core/memory/graph/node.lua similarity index 98% rename from lua/codetyper/brain/graph/node.lua rename to lua/codetyper/core/memory/graph/node.lua index eb30ec6..83606da 100644 --- a/lua/codetyper/brain/graph/node.lua +++ b/lua/codetyper/core/memory/graph/node.lua @@ -1,9 +1,9 @@ --- Brain Graph Node Operations --- CRUD operations for learning nodes -local storage = require("codetyper.brain.storage") -local hash = require("codetyper.brain.hash") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local hash = require("codetyper.core.memory.hash") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/graph/query.lua b/lua/codetyper/core/memory/graph/query.lua similarity index 98% rename from lua/codetyper/brain/graph/query.lua rename to lua/codetyper/core/memory/graph/query.lua index b685c58..1761c80 100644 --- a/lua/codetyper/brain/graph/query.lua +++ b/lua/codetyper/core/memory/graph/query.lua @@ -1,18 +1,18 @@ --- Brain Graph Query Engine --- Multi-dimensional traversal and relevance scoring -local storage = require("codetyper.brain.storage") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local types = require("codetyper.core.memory.types") local M = {} --- Lazy load dependencies to avoid circular requires local function get_node_module() - return require("codetyper.brain.graph.node") + return require("codetyper.core.memory.graph.node") end local function get_edge_module() - return require("codetyper.brain.graph.edge") + return require("codetyper.core.memory.graph.edge") end --- Compute text similarity (simple keyword matching) diff --git a/lua/codetyper/brain/hash.lua b/lua/codetyper/core/memory/hash.lua similarity index 100% rename from lua/codetyper/brain/hash.lua rename to lua/codetyper/core/memory/hash.lua diff --git a/lua/codetyper/brain/init.lua b/lua/codetyper/core/memory/init.lua similarity index 91% rename from lua/codetyper/brain/init.lua rename to lua/codetyper/core/memory/init.lua index 863ea30..86a0940 100644 --- a/lua/codetyper/brain/init.lua +++ b/lua/codetyper/core/memory/init.lua @@ -1,8 +1,8 @@ --- Brain Learning System --- Graph-based knowledge storage with delta versioning -local storage = require("codetyper.brain.storage") -local types = require("codetyper.brain.types") +local storage = require("codetyper.core.memory.storage") +local types = require("codetyper.core.memory.types") local M = {} @@ -72,7 +72,7 @@ function M.learn(event) return nil end - local learners = require("codetyper.brain.learners") + local learners = require("codetyper.core.memory.learners") local node_id = learners.process(event) if node_id then @@ -96,7 +96,7 @@ function M.query(opts) return { nodes = {}, edges = {}, stats = {}, truncated = false } end - local query_engine = require("codetyper.brain.graph.query") + local query_engine = require("codetyper.core.memory.graph.query") return query_engine.execute(opts) end @@ -112,7 +112,7 @@ function M.get_context_for_llm(opts) opts.max_tokens = opts.max_tokens or config.output.max_tokens local result = M.query(opts) - local formatter = require("codetyper.brain.output.formatter") + local formatter = require("codetyper.core.memory.output.formatter") if config.output.format == "json" then return formatter.to_json(result, opts) @@ -129,7 +129,7 @@ function M.commit(message) return nil end - local delta_mgr = require("codetyper.brain.delta") + local delta_mgr = require("codetyper.core.memory.delta") return delta_mgr.commit(message) end @@ -141,7 +141,7 @@ function M.rollback(delta_hash) return false end - local delta_mgr = require("codetyper.brain.delta") + local delta_mgr = require("codetyper.core.memory.delta") return delta_mgr.rollback(delta_hash) end @@ -153,7 +153,7 @@ function M.get_history(limit) return {} end - local delta_mgr = require("codetyper.brain.delta") + local delta_mgr = require("codetyper.core.memory.delta") return delta_mgr.get_history(limit or 50) end @@ -170,7 +170,7 @@ function M.prune(opts) unused_days = config.prune.unused_days, }, opts or {}) - local graph = require("codetyper.brain.graph") + local graph = require("codetyper.core.memory.graph") return graph.prune(opts) end diff --git a/lua/codetyper/brain/learners/convention.lua b/lua/codetyper/core/memory/learners/convention.lua similarity index 99% rename from lua/codetyper/brain/learners/convention.lua rename to lua/codetyper/core/memory/learners/convention.lua index 9e8f097..3f1c139 100644 --- a/lua/codetyper/brain/learners/convention.lua +++ b/lua/codetyper/core/memory/learners/convention.lua @@ -1,7 +1,7 @@ --- Brain Convention Learner --- Learns project conventions and coding standards -local types = require("codetyper.brain.types") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/learners/correction.lua b/lua/codetyper/core/memory/learners/correction.lua similarity index 99% rename from lua/codetyper/brain/learners/correction.lua rename to lua/codetyper/core/memory/learners/correction.lua index 9a94f2a..42c3677 100644 --- a/lua/codetyper/brain/learners/correction.lua +++ b/lua/codetyper/core/memory/learners/correction.lua @@ -1,7 +1,7 @@ --- Brain Correction Learner --- Learns from user corrections and edits -local types = require("codetyper.brain.types") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/learners/init.lua b/lua/codetyper/core/memory/learners/init.lua similarity index 93% rename from lua/codetyper/brain/learners/init.lua rename to lua/codetyper/core/memory/learners/init.lua index 936313e..3291126 100644 --- a/lua/codetyper/brain/learners/init.lua +++ b/lua/codetyper/core/memory/learners/init.lua @@ -1,21 +1,21 @@ --- Brain Learners Coordinator --- Routes learning events to appropriate learners -local types = require("codetyper.brain.types") +local types = require("codetyper.core.memory.types") local M = {} -- Lazy load learners local function get_pattern_learner() - return require("codetyper.brain.learners.pattern") + return require("codetyper.core.memory.learners.pattern") end local function get_correction_learner() - return require("codetyper.brain.learners.correction") + return require("codetyper.core.memory.learners.correction") end local function get_convention_learner() - return require("codetyper.brain.learners.convention") + return require("codetyper.core.memory.learners.convention") end --- All available learners @@ -99,7 +99,7 @@ function M.create_learning(learner, data, event) local params = learner.create_node_params(data) -- Get graph module - local graph = require("codetyper.brain.graph") + local graph = require("codetyper.core.memory.graph") -- Find related nodes local related_ids = {} @@ -125,7 +125,7 @@ end ---@return string|nil Created node ID function M.process_feedback(event) local data = event.data or {} - local graph = require("codetyper.brain.graph") + local graph = require("codetyper.core.memory.graph") local content = { s = "Feedback: " .. (data.feedback or "unknown"), @@ -167,7 +167,7 @@ end ---@return string|nil Created node ID function M.process_session(event) local data = event.data or {} - local graph = require("codetyper.brain.graph") + local graph = require("codetyper.core.memory.graph") local content = { s = event.type == "session_start" and "Session started" or "Session ended", diff --git a/lua/codetyper/brain/learners/pattern.lua b/lua/codetyper/core/memory/learners/pattern.lua similarity index 98% rename from lua/codetyper/brain/learners/pattern.lua rename to lua/codetyper/core/memory/learners/pattern.lua index eabbb57..c9b09e1 100644 --- a/lua/codetyper/brain/learners/pattern.lua +++ b/lua/codetyper/core/memory/learners/pattern.lua @@ -1,7 +1,7 @@ --- Brain Pattern Learner --- Detects and learns code patterns -local types = require("codetyper.brain.types") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/output/formatter.lua b/lua/codetyper/core/memory/output/formatter.lua similarity index 99% rename from lua/codetyper/brain/output/formatter.lua rename to lua/codetyper/core/memory/output/formatter.lua index 6a627ea..0919dbe 100644 --- a/lua/codetyper/brain/output/formatter.lua +++ b/lua/codetyper/core/memory/output/formatter.lua @@ -1,7 +1,7 @@ --- Brain Output Formatter --- LLM-optimized output formatting -local types = require("codetyper.brain.types") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/output/init.lua b/lua/codetyper/core/memory/output/init.lua similarity index 94% rename from lua/codetyper/brain/output/init.lua rename to lua/codetyper/core/memory/output/init.lua index 1009561..b484c6d 100644 --- a/lua/codetyper/brain/output/init.lua +++ b/lua/codetyper/core/memory/output/init.lua @@ -1,7 +1,7 @@ --- Brain Output Coordinator --- Manages LLM context generation -local formatter = require("codetyper.brain.output.formatter") +local formatter = require("codetyper.core.memory.output.formatter") local M = {} @@ -17,7 +17,7 @@ local DEFAULT_MAX_TOKENS = 4000 function M.generate(opts) opts = opts or {} - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if not brain.is_initialized() then return "" end @@ -138,7 +138,7 @@ end --- Check if context is available ---@return boolean function M.has_context() - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if not brain.is_initialized() then return false end @@ -150,7 +150,7 @@ end --- Get context stats ---@return table Stats function M.stats() - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if not brain.is_initialized() then return { available = false } end diff --git a/lua/codetyper/brain/storage.lua b/lua/codetyper/core/memory/storage.lua similarity index 98% rename from lua/codetyper/brain/storage.lua rename to lua/codetyper/core/memory/storage.lua index 6433f7b..8f776dc 100644 --- a/lua/codetyper/brain/storage.lua +++ b/lua/codetyper/core/memory/storage.lua @@ -1,8 +1,8 @@ --- Brain Storage Layer --- Cache + disk persistence with lazy loading -local utils = require("codetyper.utils") -local types = require("codetyper.brain.types") +local utils = require("codetyper.support.utils") +local types = require("codetyper.core.memory.types") local M = {} diff --git a/lua/codetyper/brain/types.lua b/lua/codetyper/core/memory/types.lua similarity index 100% rename from lua/codetyper/brain/types.lua rename to lua/codetyper/core/memory/types.lua diff --git a/lua/codetyper/agent/executor.lua b/lua/codetyper/core/scheduler/executor.lua similarity index 99% rename from lua/codetyper/agent/executor.lua rename to lua/codetyper/core/scheduler/executor.lua index 32e8ef7..ddb5d32 100644 --- a/lua/codetyper/agent/executor.lua +++ b/lua/codetyper/core/scheduler/executor.lua @@ -3,8 +3,8 @@ --- Executes tools requested by the LLM and returns results. local M = {} -local utils = require("codetyper.utils") -local logs = require("codetyper.agent.logs") +local utils = require("codetyper.support.utils") +local logs = require("codetyper.adapters.nvim.ui.logs") ---@class ExecutionResult ---@field success boolean Whether the execution succeeded diff --git a/lua/codetyper/agent/loop.lua b/lua/codetyper/core/scheduler/loop.lua similarity index 97% rename from lua/codetyper/agent/loop.lua rename to lua/codetyper/core/scheduler/loop.lua index afba6a7..1889b18 100644 --- a/lua/codetyper/agent/loop.lua +++ b/lua/codetyper/core/scheduler/loop.lua @@ -144,8 +144,8 @@ end --- Execute the agent loop ---@param opts AgentLoopOpts function M.run(opts) - local tools_mod = require("codetyper.agent.tools") - local llm = require("codetyper.llm") + local tools_mod = require("codetyper.core.tools") + local llm = require("codetyper.core.llm") -- Get tools local tools = opts.tools or tools_mod.list() @@ -280,7 +280,7 @@ function M.run(opts) local tool_opts = { on_log = function(msg) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "tool", message = msg }) end) end, @@ -363,7 +363,7 @@ function M.dispatch(prompt, on_complete, opts) opts = opts or {} -- Sub-agents get limited tools by default - local tools_mod = require("codetyper.agent.tools") + local tools_mod = require("codetyper.core.tools") local safe_tools = tools_mod.list(function(tool) return tool.name == "view" or tool.name == "grep" or tool.name == "glob" end) diff --git a/lua/codetyper/agent/resume.lua b/lua/codetyper/core/scheduler/resume.lua similarity index 98% rename from lua/codetyper/agent/resume.lua rename to lua/codetyper/core/scheduler/resume.lua index ef44dd5..fcf3052 100644 --- a/lua/codetyper/agent/resume.lua +++ b/lua/codetyper/core/scheduler/resume.lua @@ -4,7 +4,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Get the resume context directory ---@return string|nil diff --git a/lua/codetyper/agent/scheduler.lua b/lua/codetyper/core/scheduler/scheduler.lua similarity index 95% rename from lua/codetyper/agent/scheduler.lua rename to lua/codetyper/core/scheduler/scheduler.lua index a344154..4c5b8ce 100644 --- a/lua/codetyper/agent/scheduler.lua +++ b/lua/codetyper/core/scheduler/scheduler.lua @@ -6,11 +6,11 @@ local M = {} -local queue = require("codetyper.agent.queue") -local patch = require("codetyper.agent.patch") -local worker = require("codetyper.agent.worker") -local confidence_mod = require("codetyper.agent.confidence") -local context_modal = require("codetyper.agent.context_modal") +local queue = require("codetyper.core.events.queue") +local patch = require("codetyper.core.diff.patch") +local worker = require("codetyper.core.scheduler.worker") +local confidence_mod = require("codetyper.core.llm.confidence") +local context_modal = require("codetyper.adapters.nvim.ui.context_modal") local params = require("codetyper.params.agent.scheduler") -- Setup context modal cleanup on exit @@ -138,7 +138,7 @@ local function retry_with_context(original_event, additional_context, attached_f -- Log the retry pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Retrying with additional context (original: %s)", original_event.id), @@ -229,7 +229,7 @@ local function handle_worker_result(event, result) -- Check if LLM needs more context if result.needs_context then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Event %s: LLM needs more context, opening modal", event.id), @@ -285,7 +285,7 @@ local function handle_worker_result(event, result) end if requested and #requested > 0 then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Auto-attaching %d requested file(s)", #requested) }) end) @@ -328,7 +328,7 @@ local function handle_worker_result(event, result) -- Failed - try escalation if this was ollama if result.worker_type == "ollama" and event.attempt_count < 2 then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format( @@ -358,7 +358,7 @@ local function handle_worker_result(event, result) if needs_escalation and result.worker_type == "ollama" and event.attempt_count < 2 then -- Low confidence from ollama - escalate to remote pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format( @@ -383,7 +383,7 @@ local function handle_worker_result(event, result) -- Schedule patch application after delay (gives user time to review/cancel) local delay = state.config.apply_delay_ms or 5000 pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Code ready. Applying in %.1f seconds...", delay / 1000), @@ -416,7 +416,7 @@ local function dispatch_next() local should_skip, skip_reason = queue.check_precedence(event) if should_skip then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = string.format("Event %s skipped: %s", event.id, skip_reason or "conflict"), @@ -432,7 +432,7 @@ local function dispatch_next() -- Log dispatch with intent/scope info pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") local intent_info = event.intent and event.intent.type or "unknown" local scope_info = event.scope and event.scope.type ~= "file" and string.format("%s:%s", event.scope.type, event.scope.name or "anon") @@ -474,7 +474,7 @@ function M.schedule_patch_flush() local applied, stale = patch.flush_pending_smart() if applied > 0 or stale > 0 then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Patches flushed: %d applied, %d stale", applied, stale), @@ -487,7 +487,7 @@ function M.schedule_patch_flush() if not waiting_to_flush then waiting_to_flush = true pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Waiting for user to finish typing before applying code...", @@ -628,7 +628,7 @@ function M.start(config) scheduler_loop() pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Scheduler started", @@ -660,7 +660,7 @@ function M.stop() end pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Scheduler stopped", diff --git a/lua/codetyper/agent/worker.lua b/lua/codetyper/core/scheduler/worker.lua similarity index 97% rename from lua/codetyper/agent/worker.lua rename to lua/codetyper/core/scheduler/worker.lua index 7d520a9..7b15c66 100644 --- a/lua/codetyper/agent/worker.lua +++ b/lua/codetyper/core/scheduler/worker.lua @@ -7,7 +7,7 @@ local M = {} local params = require("codetyper.params.agent.worker") -local confidence = require("codetyper.agent.confidence") +local confidence = require("codetyper.core.llm.confidence") ---@class WorkerResult ---@field success boolean Whether the request succeeded @@ -399,7 +399,7 @@ end ---@return string prompt ---@return table context local function build_prompt(event) - local intent_mod = require("codetyper.agent.intent") + local intent_mod = require("codetyper.core.intent") -- Get target file content for context local target_content = "" @@ -420,7 +420,7 @@ local function build_prompt(event) local indexed_context = nil local indexed_content = "" pcall(function() - local indexer = require("codetyper.indexer") + local indexer = require("codetyper.features.indexer") indexed_context = indexer.get_context_for({ file = event.target_path, intent = event.intent, @@ -439,7 +439,7 @@ local function build_prompt(event) -- Get brain memories - contextual recall based on current task local brain_context = "" pcall(function() - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") if brain.is_initialized() then -- Query brain for relevant memories based on: -- 1. Current file (file-specific patterns) @@ -726,7 +726,7 @@ function M.create(event, worker_type, callback) -- Log worker creation pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "worker", message = string.format("Worker %s started (%s)", worker.id, worker_type), @@ -756,7 +756,7 @@ function M.start(worker) active_workers[worker.id] = nil pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = string.format("Worker %s timed out after %dms", worker.id, worker.timeout_ms), @@ -810,7 +810,7 @@ function M.start(worker) -- Log if pondering occurred if usage_or_metadata.pondered then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format( @@ -828,7 +828,7 @@ function M.start(worker) -- Use smart selection or direct client if use_smart_selection then - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") llm.smart_generate(prompt, context, handle_response) else -- Get client and execute directly @@ -854,7 +854,7 @@ function M.complete(worker, response, error, usage) active_workers[worker.id] = nil pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "error", message = string.format("Worker %s failed: %s", worker.id, error), @@ -880,7 +880,7 @@ function M.complete(worker, response, error, usage) active_workers[worker.id] = nil pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Worker %s: LLM needs more context", worker.id), @@ -904,7 +904,7 @@ function M.complete(worker, response, error, usage) -- Log the full raw LLM response (for debugging) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "response", message = "--- LLM Response ---", @@ -925,7 +925,7 @@ function M.complete(worker, response, error, usage) active_workers[worker.id] = nil pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "success", message = string.format( @@ -972,7 +972,7 @@ function M.cancel(worker_id) active_workers[worker_id] = nil pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = string.format("Worker %s cancelled", worker_id), diff --git a/lua/codetyper/agent/scope.lua b/lua/codetyper/core/scope/init.lua similarity index 100% rename from lua/codetyper/agent/scope.lua rename to lua/codetyper/core/scope/init.lua diff --git a/lua/codetyper/agent/tools/base.lua b/lua/codetyper/core/tools/base.lua similarity index 100% rename from lua/codetyper/agent/tools/base.lua rename to lua/codetyper/core/tools/base.lua diff --git a/lua/codetyper/agent/tools/bash.lua b/lua/codetyper/core/tools/bash.lua similarity index 98% rename from lua/codetyper/agent/tools/bash.lua rename to lua/codetyper/core/tools/bash.lua index 7421209..c5d0bbb 100644 --- a/lua/codetyper/agent/tools/bash.lua +++ b/lua/codetyper/core/tools/bash.lua @@ -3,7 +3,7 @@ --- Tool for executing shell commands with safety checks. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") local description = require("codetyper.prompts.agent.bash").description local params = require("codetyper.params.agent.bash").params local returns = require("codetyper.params.agent.bash").returns diff --git a/lua/codetyper/agent/tools/edit.lua b/lua/codetyper/core/tools/edit.lua similarity index 99% rename from lua/codetyper/agent/tools/edit.lua rename to lua/codetyper/core/tools/edit.lua index 8a485f2..dfac9b2 100644 --- a/lua/codetyper/agent/tools/edit.lua +++ b/lua/codetyper/core/tools/edit.lua @@ -5,7 +5,7 @@ --- Multi-strategy approach for reliable editing. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") local description = require("codetyper.prompts.agent.edit").description local params = require("codetyper.params.agent.edit").params local returns = require("codetyper.params.agent.edit").returns diff --git a/lua/codetyper/agent/tools/glob.lua b/lua/codetyper/core/tools/glob.lua similarity index 98% rename from lua/codetyper/agent/tools/glob.lua rename to lua/codetyper/core/tools/glob.lua index 7ede066..3355f1f 100644 --- a/lua/codetyper/agent/tools/glob.lua +++ b/lua/codetyper/core/tools/glob.lua @@ -3,7 +3,7 @@ --- Tool for finding files by glob pattern. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") ---@class CoderTool local M = setmetatable({}, Base) diff --git a/lua/codetyper/agent/tools/grep.lua b/lua/codetyper/core/tools/grep.lua similarity index 97% rename from lua/codetyper/agent/tools/grep.lua rename to lua/codetyper/core/tools/grep.lua index 1f34b97..b16afed 100644 --- a/lua/codetyper/agent/tools/grep.lua +++ b/lua/codetyper/core/tools/grep.lua @@ -3,7 +3,7 @@ --- Tool for searching file contents using ripgrep. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") local description = require("codetyper.params.agent.grep").description local params = require("codetyper.prompts.agents.grep").params local returns = require("codetyper.prompts.agents.grep").returns diff --git a/lua/codetyper/agent/tools.lua b/lua/codetyper/core/tools/init.lua similarity index 100% rename from lua/codetyper/agent/tools.lua rename to lua/codetyper/core/tools/init.lua diff --git a/lua/codetyper/agent/tools/init.lua b/lua/codetyper/core/tools/registry.lua similarity index 95% rename from lua/codetyper/agent/tools/init.lua rename to lua/codetyper/core/tools/registry.lua index d6259ca..fddfa88 100644 --- a/lua/codetyper/agent/tools/init.lua +++ b/lua/codetyper/core/tools/registry.lua @@ -162,27 +162,27 @@ end --- Load built-in tools function M.load_builtins() -- View file tool - local view = require("codetyper.agent.tools.view") + local view = require("codetyper.core.tools.view") M.register(view) -- Bash tool - local bash = require("codetyper.agent.tools.bash") + local bash = require("codetyper.core.tools.bash") M.register(bash) -- Grep tool - local grep = require("codetyper.agent.tools.grep") + local grep = require("codetyper.core.tools.grep") M.register(grep) -- Glob tool - local glob = require("codetyper.agent.tools.glob") + local glob = require("codetyper.core.tools.glob") M.register(glob) -- Write file tool - local write = require("codetyper.agent.tools.write") + local write = require("codetyper.core.tools.write") M.register(write) -- Edit tool - local edit = require("codetyper.agent.tools.edit") + local edit = require("codetyper.core.tools.edit") M.register(edit) end diff --git a/lua/codetyper/agent/tools/view.lua b/lua/codetyper/core/tools/view.lua similarity index 98% rename from lua/codetyper/agent/tools/view.lua rename to lua/codetyper/core/tools/view.lua index a3eb641..a7251da 100644 --- a/lua/codetyper/agent/tools/view.lua +++ b/lua/codetyper/core/tools/view.lua @@ -3,7 +3,7 @@ --- Tool for reading file contents with line range support. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") ---@class CoderTool local M = setmetatable({}, Base) diff --git a/lua/codetyper/agent/tools/write.lua b/lua/codetyper/core/tools/write.lua similarity index 96% rename from lua/codetyper/agent/tools/write.lua rename to lua/codetyper/core/tools/write.lua index 946a1bb..1480a84 100644 --- a/lua/codetyper/agent/tools/write.lua +++ b/lua/codetyper/core/tools/write.lua @@ -3,7 +3,7 @@ --- Tool for creating or overwriting files. ---@brief ]] -local Base = require("codetyper.agent.tools.base") +local Base = require("codetyper.core.tools.base") local description = require("codetyper.prompts.agents.write").description local params = require("codetyper.params.agents.write") diff --git a/lua/codetyper/agent/context_builder.lua b/lua/codetyper/features/agents/context_builder.lua similarity index 99% rename from lua/codetyper/agent/context_builder.lua rename to lua/codetyper/features/agents/context_builder.lua index 4e1df44..62ad83b 100644 --- a/lua/codetyper/agent/context_builder.lua +++ b/lua/codetyper/features/agents/context_builder.lua @@ -5,7 +5,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") local params = require("codetyper.params.agent.context") --- Get project structure as a tree string diff --git a/lua/codetyper/agent/agentic.lua b/lua/codetyper/features/agents/engine.lua similarity index 97% rename from lua/codetyper/agent/agentic.lua rename to lua/codetyper/features/agents/engine.lua index 6164555..f67c288 100644 --- a/lua/codetyper/agent/agentic.lua +++ b/lua/codetyper/features/agents/engine.lua @@ -31,7 +31,7 @@ local M = {} ---@field on_complete? fun(result: string|nil, error: string|nil) Called when done ---@field on_status? fun(status: string) Status updates -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Load agent definition ---@param name string Agent name @@ -177,7 +177,7 @@ end ---@param provider string "openai"|"claude" ---@return table[] Formatted tools local function build_tools(tool_names, provider) - local tools_mod = require("codetyper.agent.tools") + local tools_mod = require("codetyper.core.tools") local tools = {} for _, name in ipairs(tool_names) do @@ -234,7 +234,7 @@ end ---@return string result ---@return string|nil error local function execute_tool(tool_call, opts) - local tools_mod = require("codetyper.agent.tools") + local tools_mod = require("codetyper.core.tools") local name = tool_call["function"].name local args = tool_call["function"].arguments @@ -363,7 +363,7 @@ local function call_llm(messages, tools, system_prompt, provider, model, callbac -- Use native tool calling APIs if provider == "copilot" then - local client = require("codetyper.llm.copilot") + local client = require("codetyper.core.llm.copilot") -- Copilot's generate_with_tools expects messages in a specific format -- Convert to the format it expects @@ -406,7 +406,7 @@ local function call_llm(messages, tools, system_prompt, provider, model, callbac callback(result, nil) end) elseif provider == "openai" then - local client = require("codetyper.llm.openai") + local client = require("codetyper.core.llm.openai") -- OpenAI's generate_with_tools local converted_messages = {} @@ -447,7 +447,7 @@ local function call_llm(messages, tools, system_prompt, provider, model, callbac callback(result, nil) end) elseif provider == "ollama" then - local client = require("codetyper.llm.ollama") + local client = require("codetyper.core.llm.ollama") -- Ollama's generate_with_tools (text-based tool calling) local converted_messages = {} @@ -468,7 +468,7 @@ local function call_llm(messages, tools, system_prompt, provider, model, callbac end) else -- Fallback for other providers (ollama, etc.) - use text-based parsing - local client = require("codetyper.llm." .. provider) + local client = require("codetyper.core.llm." .. provider) -- Build prompt from messages local prompts = require("codetyper.prompts.agent") @@ -578,7 +578,7 @@ function M.run(opts) local tool_names = agent.tools or { "view", "edit", "write", "grep", "glob", "bash" } -- Ensure tools are loaded - local tools_mod = require("codetyper.agent.tools") + local tools_mod = require("codetyper.core.tools") tools_mod.setup() -- Build tools for API diff --git a/lua/codetyper/agent/init.lua b/lua/codetyper/features/agents/init.lua similarity index 96% rename from lua/codetyper/agent/init.lua rename to lua/codetyper/features/agents/init.lua index 1bc001f..858f15c 100644 --- a/lua/codetyper/agent/init.lua +++ b/lua/codetyper/features/agents/init.lua @@ -4,14 +4,14 @@ local M = {} -local tools = require("codetyper.agent.tools") -local executor = require("codetyper.agent.executor") -local parser = require("codetyper.agent.parser") -local diff = require("codetyper.agent.diff") -local diff_review = require("codetyper.agent.diff_review") -local resume = require("codetyper.agent.resume") -local utils = require("codetyper.utils") -local logs = require("codetyper.agent.logs") +local tools = require("codetyper.core.tools") +local executor = require("codetyper.core.scheduler.executor") +local parser = require("codetyper.core.llm.parser") +local diff = require("codetyper.core.diff.diff") +local diff_review = require("codetyper.adapters.nvim.ui.diff_review") +local resume = require("codetyper.core.scheduler.resume") +local utils = require("codetyper.support.utils") +local logs = require("codetyper.adapters.nvim.ui.logs") ---@class AgentState ---@field conversation table[] Message history for multi-turn @@ -107,7 +107,7 @@ function M.agent_loop(context, callbacks) return end - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") local client = llm.get_client() -- Check if client supports tools @@ -416,7 +416,7 @@ function M.continue_session(callbacks) state.current_callbacks = callbacks -- Build context from current state - local llm = require("codetyper.llm") + local llm = require("codetyper.core.llm") local context = {} local current_file = vim.fn.expand("%:p") if current_file ~= "" and vim.fn.filereadable(current_file) == 1 then diff --git a/lua/codetyper/agent/linter.lua b/lua/codetyper/features/agents/linter.lua similarity index 96% rename from lua/codetyper/agent/linter.lua rename to lua/codetyper/features/agents/linter.lua index 1355126..b9afcb1 100644 --- a/lua/codetyper/agent/linter.lua +++ b/lua/codetyper/features/agents/linter.lua @@ -60,7 +60,7 @@ local function save_buffer(bufnr) if not ok then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "warning", message = "Failed to save buffer: " .. tostring(err), @@ -185,7 +185,7 @@ function M.validate_after_injection(bufnr, start_line, end_line, callback) -- Log results pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") if result.has_errors then logs.add({ type = "error", @@ -332,9 +332,9 @@ function M.request_ai_fix(bufnr, result) ) -- Queue the fix through the scheduler - local scheduler = require("codetyper.agent.scheduler") - local queue = require("codetyper.agent.queue") - local patch_mod = require("codetyper.agent.patch") + local scheduler = require("codetyper.core.scheduler.scheduler") + local queue = require("codetyper.core.events.queue") + local patch_mod = require("codetyper.core.diff.patch") -- Ensure scheduler is running if not scheduler.status().running then @@ -370,7 +370,7 @@ function M.request_ai_fix(bufnr, result) }) pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.add({ type = "info", message = "Queued AI fix request for lint errors", diff --git a/lua/codetyper/agent/permissions.lua b/lua/codetyper/features/agents/permissions.lua similarity index 100% rename from lua/codetyper/agent/permissions.lua rename to lua/codetyper/features/agents/permissions.lua diff --git a/lua/codetyper/ask.lua b/lua/codetyper/features/ask/engine.lua similarity index 99% rename from lua/codetyper/ask.lua rename to lua/codetyper/features/ask/engine.lua index 16c8962..c7458e3 100644 --- a/lua/codetyper/ask.lua +++ b/lua/codetyper/features/ask/engine.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") ---@class AskState ---@field input_buf number|nil Input buffer @@ -345,7 +345,7 @@ local function setup_log_listener() -- Remove existing listener if any if state.log_listener_id then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.remove_listener(state.log_listener_id) end) state.log_listener_id = nil @@ -362,7 +362,7 @@ end local function remove_log_listener() if state.log_listener_id then pcall(function() - local logs = require("codetyper.agent.logs") + local logs = require("codetyper.adapters.nvim.ui.logs") logs.remove_listener(state.log_listener_id) end) state.log_listener_id = nil diff --git a/lua/codetyper/ask/explorer.lua b/lua/codetyper/features/ask/explorer.lua similarity index 99% rename from lua/codetyper/ask/explorer.lua rename to lua/codetyper/features/ask/explorer.lua index cc03f4a..8c199ce 100644 --- a/lua/codetyper/ask/explorer.lua +++ b/lua/codetyper/features/ask/explorer.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") ---@class ExplorationState ---@field is_exploring boolean diff --git a/lua/codetyper/ask/intent.lua b/lua/codetyper/features/ask/intent.lua similarity index 100% rename from lua/codetyper/ask/intent.lua rename to lua/codetyper/features/ask/intent.lua diff --git a/lua/codetyper/agent/inject.lua b/lua/codetyper/features/completion/inject.lua similarity index 99% rename from lua/codetyper/agent/inject.lua rename to lua/codetyper/features/completion/inject.lua index e2bdbc5..8ff4f9c 100644 --- a/lua/codetyper/agent/inject.lua +++ b/lua/codetyper/features/completion/inject.lua @@ -17,7 +17,7 @@ local M = {} ---@field body string[] Non-import code lines ---@field import_lines table Map of line numbers that are imports -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") local languages = require("codetyper.params.agent.languages") local import_patterns = languages.import_patterns diff --git a/lua/codetyper/completion.lua b/lua/codetyper/features/completion/inline.lua similarity index 99% rename from lua/codetyper/completion.lua rename to lua/codetyper/features/completion/inline.lua index c66f39b..a4fbf97 100644 --- a/lua/codetyper/completion.lua +++ b/lua/codetyper/features/completion/inline.lua @@ -5,7 +5,7 @@ local M = {} local parser = require("codetyper.parser") -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Get list of files for completion ---@param prefix string Prefix to filter files diff --git a/lua/codetyper/suggestion/init.lua b/lua/codetyper/features/completion/suggestion.lua similarity index 100% rename from lua/codetyper/suggestion/init.lua rename to lua/codetyper/features/completion/suggestion.lua diff --git a/lua/codetyper/indexer/analyzer.lua b/lua/codetyper/features/indexer/analyzer.lua similarity index 99% rename from lua/codetyper/indexer/analyzer.lua rename to lua/codetyper/features/indexer/analyzer.lua index 2babd95..dfc5de5 100644 --- a/lua/codetyper/indexer/analyzer.lua +++ b/lua/codetyper/features/indexer/analyzer.lua @@ -6,8 +6,8 @@ local M = {} -local utils = require("codetyper.utils") -local scanner = require("codetyper.indexer.scanner") +local utils = require("codetyper.support.utils") +local scanner = require("codetyper.features.indexer.scanner") --- Language-specific query patterns for Tree-sitter local TS_QUERIES = { diff --git a/lua/codetyper/indexer/init.lua b/lua/codetyper/features/indexer/init.lua similarity index 96% rename from lua/codetyper/indexer/init.lua rename to lua/codetyper/features/indexer/init.lua index 69a065e..4172b46 100644 --- a/lua/codetyper/indexer/init.lua +++ b/lua/codetyper/features/indexer/init.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Index schema version for migrations local INDEX_VERSION = 1 @@ -194,8 +194,8 @@ end ---@param callback? fun(index: ProjectIndex) ---@return ProjectIndex|nil function M.index_project(callback) - local scanner = require("codetyper.indexer.scanner") - local analyzer = require("codetyper.indexer.analyzer") + local scanner = require("codetyper.features.indexer.scanner") + local analyzer = require("codetyper.features.indexer.analyzer") local index = create_empty_index() local root = utils.get_project_root() @@ -256,7 +256,7 @@ function M.index_project(callback) M.save_index(index) -- Store memories - local memory = require("codetyper.indexer.memory") + local memory = require("codetyper.features.indexer.memory") memory.store_index_summary(index) -- Sync project summary to brain @@ -331,8 +331,8 @@ end ---@param filepath string ---@return FileIndex|nil function M.index_file(filepath) - local analyzer = require("codetyper.indexer.analyzer") - local memory = require("codetyper.indexer.memory") + local analyzer = require("codetyper.features.indexer.analyzer") + local memory = require("codetyper.features.indexer.memory") local root = utils.get_project_root() if not root then @@ -475,7 +475,7 @@ function M.schedule_index_file(filepath) end -- Check if file should be indexed - local scanner = require("codetyper.indexer.scanner") + local scanner = require("codetyper.features.indexer.scanner") if not scanner.should_index(filepath, config) then return end @@ -496,7 +496,7 @@ end ---@param opts {file: string, intent: table|nil, prompt: string, scope: string|nil} ---@return table Context information function M.get_context_for(opts) - local memory = require("codetyper.indexer.memory") + local memory = require("codetyper.features.indexer.memory") local index = M.load_index() local context = { diff --git a/lua/codetyper/indexer/memory.lua b/lua/codetyper/features/indexer/memory.lua similarity index 99% rename from lua/codetyper/indexer/memory.lua rename to lua/codetyper/features/indexer/memory.lua index 9b45cbc..e020623 100644 --- a/lua/codetyper/indexer/memory.lua +++ b/lua/codetyper/features/indexer/memory.lua @@ -6,7 +6,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Memory directories local MEMORIES_DIR = "memories" diff --git a/lua/codetyper/indexer/scanner.lua b/lua/codetyper/features/indexer/scanner.lua similarity index 99% rename from lua/codetyper/indexer/scanner.lua rename to lua/codetyper/features/indexer/scanner.lua index 1846ebf..f1a767e 100644 --- a/lua/codetyper/indexer/scanner.lua +++ b/lua/codetyper/features/indexer/scanner.lua @@ -5,7 +5,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Project type markers local PROJECT_MARKERS = { diff --git a/lua/codetyper/init.lua b/lua/codetyper/init.lua index 4335d07..191dbe0 100644 --- a/lua/codetyper/init.lua +++ b/lua/codetyper/init.lua @@ -22,16 +22,16 @@ function M.setup(opts) return end - local config = require("codetyper.config") + local config = require("codetyper.config.defaults") M.config = config.setup(opts) -- Initialize modules - local commands = require("codetyper.commands") - local gitignore = require("codetyper.gitignore") - local autocmds = require("codetyper.autocmds") - local tree = require("codetyper.tree") - local completion = require("codetyper.completion") - local logs_panel = require("codetyper.logs_panel") + local commands = require("codetyper.adapters.nvim.commands") + local gitignore = require("codetyper.support.gitignore") + local autocmds = require("codetyper.adapters.nvim.autocmds") + local tree = require("codetyper.support.tree") + local completion = require("codetyper.features.completion.inline") + local logs_panel = require("codetyper.adapters.nvim.ui.logs_panel") -- Register commands commands.setup() @@ -53,25 +53,25 @@ function M.setup(opts) -- Initialize project indexer if enabled if M.config.indexer and M.config.indexer.enabled then - local indexer = require("codetyper.indexer") + local indexer = require("codetyper.features.indexer") indexer.setup(M.config.indexer) end -- Initialize brain learning system if enabled if M.config.brain and M.config.brain.enabled then - local brain = require("codetyper.brain") + local brain = require("codetyper.core.memory") brain.setup(M.config.brain) end -- Setup inline ghost text suggestions (Copilot-style) if M.config.suggestion and M.config.suggestion.enabled then - local suggestion = require("codetyper.suggestion") + local suggestion = require("codetyper.features.completion.suggestion") suggestion.setup(M.config.suggestion) end -- Start the event-driven scheduler if enabled if M.config.scheduler and M.config.scheduler.enabled then - local scheduler = require("codetyper.agent.scheduler") + local scheduler = require("codetyper.core.scheduler.scheduler") scheduler.start(M.config.scheduler) end @@ -80,7 +80,7 @@ function M.setup(opts) -- Auto-open Ask panel after a short delay (to let UI settle) if M.config.auto_open_ask then vim.defer_fn(function() - local ask = require("codetyper.ask") + local ask = require("codetyper.features.ask.engine") if not ask.is_open() then ask.open() end diff --git a/lua/codetyper/inject.lua b/lua/codetyper/inject.lua index 8ced0ed..886c7e6 100644 --- a/lua/codetyper/inject.lua +++ b/lua/codetyper/inject.lua @@ -2,14 +2,14 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Inject generated code into target file ---@param target_path string Path to target file ---@param code string Generated code ---@param prompt_type string Type of prompt (refactor, add, document, etc.) function M.inject_code(target_path, code, prompt_type) - local window = require("codetyper.window") + local window = require("codetyper.adapters.nvim.windows") -- Normalize the target path target_path = vim.fn.fnamemodify(target_path, ":p") @@ -109,7 +109,7 @@ function M.inject_add(bufnr, code) local lines = vim.split(code, "\n", { plain = true }) -- Get cursor position in target window - local window = require("codetyper.window") + local window = require("codetyper.adapters.nvim.windows") local target_win = window.get_target_win() local insert_line diff --git a/lua/codetyper/parser.lua b/lua/codetyper/parser.lua index fe5978f..f8aca6a 100644 --- a/lua/codetyper/parser.lua +++ b/lua/codetyper/parser.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Get config with safe fallback ---@return table config diff --git a/lua/codetyper/gitignore.lua b/lua/codetyper/support/gitignore.lua similarity index 99% rename from lua/codetyper/gitignore.lua rename to lua/codetyper/support/gitignore.lua index 170a144..9105209 100644 --- a/lua/codetyper/gitignore.lua +++ b/lua/codetyper/support/gitignore.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Patterns to add to .gitignore local IGNORE_PATTERNS = { diff --git a/lua/codetyper/health.lua b/lua/codetyper/support/health.lua similarity index 92% rename from lua/codetyper/health.lua rename to lua/codetyper/support/health.lua index 45dafd3..34cd4b0 100644 --- a/lua/codetyper/health.lua +++ b/lua/codetyper/support/health.lua @@ -41,7 +41,7 @@ function M.check() health.info("Ollama model: " .. config.llm.ollama.model) -- Try to check Ollama connectivity - local ollama = require("codetyper.llm.ollama") + local ollama = require("codetyper.core.llm.ollama") ollama.health_check(function(is_ok, err) if is_ok then vim.schedule(function() @@ -64,8 +64,8 @@ function M.check() end -- Check .gitignore configuration - local utils = require("codetyper.utils") - local gitignore = require("codetyper.gitignore") + local utils = require("codetyper.support.utils") + local gitignore = require("codetyper.support.gitignore") local root = utils.get_project_root() if root then diff --git a/lua/codetyper/utils/langmap.lua b/lua/codetyper/support/langmap.lua similarity index 100% rename from lua/codetyper/utils/langmap.lua rename to lua/codetyper/support/langmap.lua diff --git a/lua/codetyper/tree.lua b/lua/codetyper/support/tree.lua similarity index 99% rename from lua/codetyper/tree.lua rename to lua/codetyper/support/tree.lua index d2e08fe..4ad38d5 100644 --- a/lua/codetyper/tree.lua +++ b/lua/codetyper/support/tree.lua @@ -2,7 +2,7 @@ local M = {} -local utils = require("codetyper.utils") +local utils = require("codetyper.support.utils") --- Name of the coder folder local CODER_FOLDER = ".coder" diff --git a/lua/codetyper/utils.lua b/lua/codetyper/support/utils.lua similarity index 100% rename from lua/codetyper/utils.lua rename to lua/codetyper/support/utils.lua