Files
codetyper.nvim/README.md
2026-01-15 20:58:56 -05:00

19 KiB

🚀 Codetyper.nvim

AI-powered coding partner for Neovim - Write code faster with LLM assistance while staying in control of your logic.

License: MIT Neovim

Features

  • 📐 Split View: Work with your code and prompts side by side
  • 💬 Ask Panel: Chat interface for questions and explanations
  • 🤖 Agent Mode: Autonomous coding agent with tool use (read, edit, write, bash)
  • 🏷️ Tag-based Prompts: Use /@ and @/ tags to write natural language prompts
  • Transform Commands: Transform prompts inline without leaving your file
  • 🔌 Multiple LLM Providers: Claude, OpenAI, Gemini, Copilot, and Ollama (local)
  • 📋 Event-Driven Scheduler: Queue-based processing with optimistic execution
  • 🎯 Tree-sitter Scope Resolution: Smart context extraction for functions/methods
  • 🧠 Intent Detection: Understands complete, refactor, fix, add, document intents
  • 📊 Confidence Scoring: Automatic escalation from local to remote LLMs
  • 🛡️ Completion-Aware: Safe injection that doesn't fight with autocomplete
  • 📁 Auto-Index: Automatically create coder companion files on file open
  • 📜 Logs Panel: Real-time visibility into LLM requests and token usage
  • 💰 Cost Tracking: Persistent LLM cost estimation with session and all-time stats
  • 🔒 Git Integration: Automatically adds .coder.* files to .gitignore
  • 🌳 Project Tree Logging: Maintains a tree.log tracking your project structure
  • 🧠 Brain System: Knowledge graph that learns from your coding patterns

📚 Table of Contents


📋 Requirements

  • Neovim >= 0.8.0
  • curl (for API calls)
  • One of: Claude API key, OpenAI API key, Gemini API key, GitHub Copilot, or Ollama running locally

Required Plugins

Optional Plugins


📦 Installation

Using lazy.nvim

{
  "cargdev/codetyper.nvim",
  dependencies = {
    "nvim-lua/plenary.nvim", -- Required: async utilities
    "nvim-treesitter/nvim-treesitter", -- Required: scope detection
    "nvim-treesitter/nvim-treesitter-textobjects", -- Optional: text objects
    "MunifTanjim/nui.nvim", -- Optional: UI components
  },
  cmd = { "Coder", "CoderOpen", "CoderToggle", "CoderAgent" },
  keys = {
    { "<leader>co", "<cmd>Coder open<cr>", desc = "Coder: Open" },
    { "<leader>ct", "<cmd>Coder toggle<cr>", desc = "Coder: Toggle" },
    { "<leader>ca", "<cmd>CoderAgentToggle<cr>", desc = "Coder: Agent" },
  },
  config = function()
    require("codetyper").setup({
      llm = {
        provider = "claude", -- or "openai", "gemini", "copilot", "ollama"
      },
    })
  end,
}

Using packer.nvim

use {
  "cargdev/codetyper.nvim",
  config = function()
    require("codetyper").setup()
  end,
}

🚀 Quick Start

1. Open a file and start Coder:

:e src/utils.ts
:Coder open

2. Write a prompt in the coder file (left panel):

/@ Create a function to validate email addresses
using regex, return boolean @/

3. The LLM generates code and injects it into utils.ts (right panel)


⚙️ Configuration

require("codetyper").setup({
  -- LLM Provider Configuration
  llm = {
    provider = "claude", -- "claude", "openai", "gemini", "copilot", or "ollama"

    -- Claude (Anthropic) settings
    claude = {
      api_key = nil, -- Uses ANTHROPIC_API_KEY env var if nil
      model = "claude-sonnet-4-20250514",
    },

    -- OpenAI settings
    openai = {
      api_key = nil, -- Uses OPENAI_API_KEY env var if nil
      model = "gpt-4o",
      endpoint = nil, -- Custom endpoint (Azure, OpenRouter, etc.)
    },

    -- Google Gemini settings
    gemini = {
      api_key = nil, -- Uses GEMINI_API_KEY env var if nil
      model = "gemini-2.0-flash",
    },

    -- GitHub Copilot settings (uses copilot.lua/copilot.vim auth)
    copilot = {
      model = "gpt-4o",
    },

    -- Ollama (local) settings
    ollama = {
      host = "http://localhost:11434",
      model = "deepseek-coder:6.7b",
    },
  },

  -- Window Configuration
  window = {
    width = 25, -- Percentage of screen width (25 = 25%)
    position = "left",
    border = "rounded",
  },

  -- Prompt Tag Patterns
  patterns = {
    open_tag = "/@",
    close_tag = "@/",
    file_pattern = "*.coder.*",
  },

  -- Auto Features
  auto_gitignore = true, -- Automatically add coder files to .gitignore
  auto_open_ask = true, -- Auto-open Ask panel on startup
  auto_index = false, -- Auto-create coder companion files on file open

  -- Event-Driven Scheduler
  scheduler = {
    enabled = true, -- Enable event-driven prompt processing
    ollama_scout = true, -- Use Ollama for first attempt (fast local)
    escalation_threshold = 0.7, -- Below this confidence, escalate to remote
    max_concurrent = 2, -- Max parallel workers
    completion_delay_ms = 100, -- Delay injection after completion popup
    apply_delay_ms = 5000, -- Wait before applying code (ms), allows review
  },
})

Environment Variables

Variable Description
ANTHROPIC_API_KEY Claude API key
OPENAI_API_KEY OpenAI API key
GEMINI_API_KEY Google Gemini API key

Credentials Management

Instead of storing API keys in your config (which may be committed to git), you can use the credentials system:

:CoderAddApiKey

This command interactively prompts for:

  1. Provider selection (Claude, OpenAI, Gemini, Copilot, Ollama)
  2. API key (for cloud providers)
  3. Model name
  4. Custom endpoint (for OpenAI-compatible APIs)

Credentials are stored securely in ~/.local/share/nvim/codetyper/configuration.json (not in your config files).

Priority order for credentials:

  1. Stored credentials (via :CoderAddApiKey)
  2. Config file settings
  3. Environment variables

Other credential commands:

  • :CoderCredentials - View configured providers
  • :CoderSwitchProvider - Switch between configured providers
  • :CoderRemoveApiKey - Remove stored credentials

🔌 LLM Providers

Claude (Anthropic)

Best for complex reasoning and code generation.

llm = {
  provider = "claude",
  claude = { model = "claude-sonnet-4-20250514" },
}

OpenAI

Supports custom endpoints for Azure, OpenRouter, etc.

llm = {
  provider = "openai",
  openai = {
    model = "gpt-4o",
    endpoint = "https://api.openai.com/v1/chat/completions", -- optional
  },
}

Google Gemini

Fast and capable.

llm = {
  provider = "gemini",
  gemini = { model = "gemini-2.0-flash" },
}

GitHub Copilot

Uses your existing Copilot subscription (requires copilot.lua or copilot.vim).

llm = {
  provider = "copilot",
  copilot = { model = "gpt-4o" },
}

Ollama (Local)

Run models locally with no API costs.

llm = {
  provider = "ollama",
  ollama = {
    host = "http://localhost:11434",
    model = "deepseek-coder:6.7b",
  },
}

📝 Commands Reference

All commands can be invoked via :Coder {subcommand} or their dedicated command aliases.

Core Commands

Command Alias Description
:Coder open :CoderOpen Open the coder split view
:Coder close :CoderClose Close the coder split view
:Coder toggle :CoderToggle Toggle the coder split view
:Coder process :CoderProcess Process the last prompt in coder file
:Coder status - Show plugin status and configuration
:Coder focus - Switch focus between coder and target windows
:Coder reset - Reset processed prompts to allow re-processing
:Coder gitignore - Force update .gitignore with coder patterns

Ask Panel (Chat Interface)

Command Alias Description
:Coder ask :CoderAsk Open the Ask panel
:Coder ask-toggle :CoderAskToggle Toggle the Ask panel
:Coder ask-close - Close the Ask panel
:Coder ask-clear :CoderAskClear Clear chat history

Agent Mode (Autonomous Coding)

Command Alias Description
:Coder agent :CoderAgent Open the Agent panel
:Coder agent-toggle :CoderAgentToggle Toggle the Agent panel
:Coder agent-close - Close the Agent panel
:Coder agent-stop :CoderAgentStop Stop the running agent

Agentic Mode (IDE-like Multi-file Agent)

Command Alias Description
:Coder agentic-run <task> :CoderAgenticRun <task> Run an agentic task (multi-file changes)
:Coder agentic-list :CoderAgenticList List available agents
:Coder agentic-init :CoderAgenticInit Initialize .coder/agents/ and .coder/rules/

Transform Commands (Inline Tag Processing)

Command Alias Description
:Coder transform :CoderTransform Transform all /@ @/ tags in file
:Coder transform-cursor :CoderTransformCursor Transform tag at cursor position
- :CoderTransformVisual Transform selected tags (visual mode)

Project & Index Commands

Command Alias Description
- :CoderIndex Open coder companion for current file
:Coder index-project :CoderIndexProject Index the entire project
:Coder index-status :CoderIndexStatus Show project index status

Tree & Structure Commands

Command Alias Description
:Coder tree :CoderTree Refresh .coder/tree.log
:Coder tree-view :CoderTreeView View .coder/tree.log in split

Queue & Scheduler Commands

Command Alias Description
:Coder queue-status :CoderQueueStatus Show scheduler and queue status
:Coder queue-process :CoderQueueProcess Manually trigger queue processing

Processing Mode Commands

Command Alias Description
:Coder auto-toggle :CoderAutoToggle Toggle automatic/manual prompt processing
:Coder auto-set <mode> :CoderAutoSet <mode> Set processing mode (auto/manual)

Memory & Learning Commands

Command Alias Description
:Coder memories :CoderMemories Show learned memories
:Coder forget [pattern] :CoderForget [pattern] Clear memories (optionally matching pattern)

Brain Commands (Knowledge Graph)

Command Alias Description
- :CoderBrain [action] Brain management (stats/commit/flush/prune)
- :CoderFeedback <type> Give feedback to brain (good/bad/stats)

LLM Statistics & Feedback

Command Description
:Coder llm-stats Show LLM provider accuracy statistics
:Coder llm-feedback-good Report positive feedback on last response
:Coder llm-feedback-bad Report negative feedback on last response
:Coder llm-reset-stats Reset LLM accuracy statistics

Cost Tracking

Command Alias Description
:Coder cost :CoderCost Show LLM cost estimation window
:Coder cost-clear - Clear session cost tracking

Credentials Management

Command Alias Description
:Coder add-api-key :CoderAddApiKey Add or update LLM provider API key
:Coder remove-api-key :CoderRemoveApiKey Remove LLM provider credentials
:Coder credentials :CoderCredentials Show credentials status
:Coder switch-provider :CoderSwitchProvider Switch active LLM provider

UI Commands

Command Alias Description
:Coder type-toggle :CoderType Show Ask/Agent mode switcher
:Coder logs-toggle :CoderLogs Toggle logs panel

📖 Usage Guide

Tag-Based Prompts

Write prompts in your coder file using /@ and @/ tags:

/@ Create a Button component with the following props:
- variant: 'primary' | 'secondary' | 'danger'
- size: 'sm' | 'md' | 'lg'
- disabled: boolean
Use Tailwind CSS for styling @/

When you close the tag with @/, the prompt is automatically processed.

Transform Commands

Transform prompts inline without the split view:

// In your source file:
/@ Add input validation for email and password @/

// Run :CoderTransformCursor to transform the prompt at cursor

Prompt Types

The plugin auto-detects prompt type:

Keywords Type Behavior
complete, finish, implement, todo Complete Completes function body (replaces scope)
refactor, rewrite, simplify Refactor Replaces code
fix, debug, bug, error Fix Fixes bugs (replaces scope)
add, create, generate Add Inserts new code
document, comment, jsdoc Document Adds documentation
optimize, performance, faster Optimize Optimizes code (replaces scope)
explain, what, how Explain Shows explanation only

Function Completion

When you write a prompt inside a function body, the plugin uses Tree-sitter to detect the enclosing scope and automatically switches to "complete" mode:

function getUserById(id: number): User | null {
  /@ return the user from the database by id, handle not found case @/
}

The LLM will complete the function body while keeping the exact same signature. The entire function scope is replaced with the completed version.


📊 Logs Panel

The logs panel provides real-time visibility into LLM operations:

Features

  • Generation Logs: Shows all LLM requests, responses, and token usage
  • Queue Display: Shows pending and processing prompts
  • Full Response View: Complete LLM responses are logged for debugging
  • Auto-cleanup: Logs panel and queue windows automatically close when exiting Neovim

Opening the Logs Panel

:CoderLogs

The logs panel opens automatically when processing prompts with the scheduler enabled.

Keymaps

Key Description
q Close logs panel
<Esc> Close logs panel

💰 Cost Tracking

Track your LLM API costs across sessions with the Cost Estimation window.

Features

  • Session Tracking: Monitor current session token usage and costs
  • All-Time Tracking: Persistent cost history stored per-project in .coder/cost_history.json
  • Model Breakdown: See costs by individual model
  • Pricing Database: Built-in pricing for 50+ models (GPT, Claude, Gemini, O-series, etc.)

Opening the Cost Window

:CoderCost

Cost Window Keymaps

Key Description
q / <Esc> Close window
r Refresh display
c Clear session costs
C Clear all history

Supported Models

The cost tracker includes pricing for:

  • OpenAI: GPT-4, GPT-4o, GPT-4o-mini, O1, O3, O4-mini, and more
  • Anthropic: Claude 3 Opus, Sonnet, Haiku, Claude 3.5 Sonnet/Haiku
  • Local: Ollama models (free, but usage tracked)
  • Copilot: Usage tracked (included in subscription)

🤖 Agent Mode

The Agent mode provides an autonomous coding assistant with tool access:

Available Tools

  • read_file: Read file contents
  • edit_file: Edit files with find/replace
  • write_file: Create or overwrite files
  • bash: Execute shell commands

Using Agent Mode

  1. Open the agent panel: :CoderAgent or <leader>ca
  2. Describe what you want to accomplish
  3. The agent will use tools to complete the task
  4. Review changes before they're applied

Agent Keymaps

Key Description
<CR> Submit message
Ctrl+c Stop agent execution
q Close agent panel

⌨️ Keymaps

Default Keymaps (auto-configured)

Key Mode Description
<leader>ctt Normal Transform tag at cursor
<leader>ctt Visual Transform selected tags
<leader>ctT Normal Transform all tags in file
<leader>ca Normal Toggle Agent panel
<leader>ci Normal Open coder companion (index)

Ask Panel Keymaps

Key Description
@ Attach/reference a file
Ctrl+Enter Submit question
Ctrl+n Start new chat
Ctrl+f Add current file as context
q Close panel
Y Copy last response

Suggested Additional Keymaps

local map = vim.keymap.set

map("n", "<leader>co", "<cmd>Coder open<cr>", { desc = "Coder: Open" })
map("n", "<leader>cc", "<cmd>Coder close<cr>", { desc = "Coder: Close" })
map("n", "<leader>ct", "<cmd>Coder toggle<cr>", { desc = "Coder: Toggle" })
map("n", "<leader>cp", "<cmd>Coder process<cr>", { desc = "Coder: Process" })
map("n", "<leader>cs", "<cmd>Coder status<cr>", { desc = "Coder: Status" })

🏥 Health Check

Verify your setup:

:checkhealth codetyper

This checks:

  • Neovim version
  • curl availability
  • LLM configuration
  • API key status
  • Telescope availability (optional)

📁 File Structure

your-project/
├── .coder/                    # Auto-created, gitignored
│   └── tree.log              # Project structure log
├── src/
│   ├── index.ts              # Your source file
│   ├── index.coder.ts        # Coder file (gitignored)
└── .gitignore                # Auto-updated with coder patterns

🤝 Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.


📄 License

MIT License - see LICENSE for details.


👨‍💻 Author

cargdev


Made with ❤️ for the Neovim community