### Added
- **Smart Scope Resolution** — Tree-sitter + indentation context for
selections
- `resolve_selection_context()` in `scope/init.lua` handles partial
functions,
whole functions, multi-function spans, indent blocks, and whole-file
selections
- Enclosing function automatically sent as context when selecting code
inside one
- Whole-file selection (>=80% of lines) triggers project tree as
context
- Indentation-based fallback when Tree-sitter is unavailable
- **Explain-to-Document Intent** — "explain" prompts generate
documentation
- Detects prompts like "explain this", "tell me about", "what does",
"question"
- Generates documentation comments and inserts them above selected
code
- Shows notification if nothing is selected
- Updated intent action from "none" to "insert" for explain intent
- **Granular LLM Status Notifications** — Real-time progress reporting
- Inline virtual text and floating status window show current stage
- Stages: "Reading context...", "Searching index...", "Gathering
context...",
"Recalling patterns...", "Building prompt...", "Sending to
[provider]...",
"Processing response...", "Generating patch...", "Applying code..."
- `update_inline_status()` in `thinking_placeholder.lua`
- `update_stage()` in `thinking.lua`
- **Thinking Placeholder Positioning** — "Implementing..." appears above
selection
- Uses `virt_lines_above = true` on extmark at selection start line
- Dynamic status text updates during LLM processing
### Changed
- **Providers reduced to Copilot and Ollama only**
- Removed Claude, OpenAI, and Gemini provider integrations
- Deleted `llm/openai.lua` and `llm/gemini.lua`
- Cleaned `llm/init.lua`, `config/defaults.lua`, `types.lua`,
`credentials.lua`,
`cost/init.lua`, and `events/queue.lua` of all references
- `valid_providers` now only includes "copilot" and "ollama"
- **Removed timer-based delayed processing** — Prompts are processed
instantly
- Removed `timer` field, `timeout_ms`, and timer setup/cancellation
from `worker.lua`
- **Removed chat/agent/split window UI**
- Deleted `ui/chat.lua`, `windows.lua`, `ui/switcher.lua`
- Removed `CoderOpen`, `CoderClose`, `CoderToggle` commands
- Removed window management from `autocmds.lua`, `inject.lua`,
`executor.lua`
- Removed auto-open companion file logic
- **Commands removed from menu** (code retained with TODOs for
re-enabling)
- `CoderAddApiKey`, `CoderRemoveApiKey`, `CoderBrain`,
`CoderFeedback`,
`CoderMemories`, `CoderForget`, `CoderProcess`
- Subcommands `process`, `status`, `memories`, `forget`,
`llm-feedback-good`,
`llm-feedback-bad`, `add-api-key`, `remove-api-key` removed from
completion
### Fixed
- Fixed `patch.lua` syntax error — missing `if` wrapper around
SEARCH/REPLACE block
- Fixed `CoderModel` require path typo
(`codetyper.adapters.config.credentials`
→ `codetyper.config.credentials`)
- Fixed `thinking_placeholder` extmark placement appearing after
selection
instead of above it
289 lines
8.8 KiB
Markdown
289 lines
8.8 KiB
Markdown
# Contributing to Codetyper.nvim
|
|
|
|
Thank you for considering contributing to Codetyper.nvim!
|
|
|
|
## Table of Contents
|
|
|
|
- [Code of Conduct](#code-of-conduct)
|
|
- [Getting Started](#getting-started)
|
|
- [Development Setup](#development-setup)
|
|
- [Project Structure](#project-structure)
|
|
- [Making Changes](#making-changes)
|
|
- [Submitting Changes](#submitting-changes)
|
|
- [Style Guide](#style-guide)
|
|
- [Testing](#testing)
|
|
- [Questions](#questions)
|
|
|
|
## Code of Conduct
|
|
|
|
This project and everyone participating in it is governed by our commitment to creating a welcoming and inclusive environment. Please be respectful and constructive in all interactions.
|
|
|
|
## Getting Started
|
|
|
|
1. Fork the repository
|
|
2. Clone your fork locally
|
|
3. Set up the development environment
|
|
4. Create a branch for your changes
|
|
5. Make your changes
|
|
6. Submit a pull request
|
|
|
|
## Development Setup
|
|
|
|
### Prerequisites
|
|
|
|
- Neovim >= 0.8.0
|
|
- Lua 5.1+ or LuaJIT
|
|
- Git
|
|
- One of: GitHub Copilot (via copilot.lua/copilot.vim) or Ollama
|
|
|
|
### Local Development
|
|
|
|
1. Clone the repository:
|
|
```bash
|
|
git clone https://github.com/CarGDev/codetyper.nvim.git
|
|
cd codetyper.nvim
|
|
```
|
|
|
|
2. Create a minimal test configuration:
|
|
```lua
|
|
-- tests/minimal_init.lua
|
|
vim.opt.runtimepath:append(".")
|
|
require("codetyper").setup({
|
|
llm = {
|
|
provider = "ollama",
|
|
},
|
|
})
|
|
```
|
|
|
|
3. Test your changes:
|
|
```bash
|
|
nvim --clean -u tests/minimal_init.lua
|
|
```
|
|
|
|
4. Run the full test suite:
|
|
```bash
|
|
make test
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
codetyper.nvim/
|
|
├── lua/codetyper/
|
|
│ ├── init.lua # Entry point, setup()
|
|
│ ├── inject.lua # Code injection into buffers
|
|
│ ├── parser.lua # /@ @/ tag parser
|
|
│ ├── types.lua # Lua type annotations
|
|
│ │
|
|
│ ├── config/
|
|
│ │ ├── defaults.lua # Default configuration values
|
|
│ │ ├── credentials.lua # Credential & model storage
|
|
│ │ └── preferences.lua # User preference persistence
|
|
│ │
|
|
│ ├── adapters/nvim/
|
|
│ │ ├── autocmds.lua # Autocommands (prompt processing)
|
|
│ │ ├── commands.lua # All :Coder* user commands
|
|
│ │ ├── cmp/init.lua # nvim-cmp source integration
|
|
│ │ └── ui/
|
|
│ │ ├── thinking.lua # Status window ("Thinking...")
|
|
│ │ ├── throbber.lua # Animated spinner
|
|
│ │ ├── logs.lua # Internal log viewer
|
|
│ │ ├── logs_panel.lua # Standalone logs panel
|
|
│ │ ├── context_modal.lua # File-context picker
|
|
│ │ └── diff_review.lua # Side-by-side diff review
|
|
│ │
|
|
│ ├── core/
|
|
│ │ ├── transform.lua # Visual selection -> prompt -> apply
|
|
│ │ ├── marks.lua # Extmark tracking for injection
|
|
│ │ ├── thinking_placeholder.lua # Inline virtual text status
|
|
│ │ ├── scope/init.lua # Tree-sitter + indent scope
|
|
│ │ ├── intent/init.lua # Prompt intent classifier
|
|
│ │ ├── llm/
|
|
│ │ │ ├── init.lua # Provider dispatcher
|
|
│ │ │ ├── copilot.lua # GitHub Copilot client
|
|
│ │ │ ├── ollama.lua # Ollama client (local)
|
|
│ │ │ ├── confidence.lua # Response confidence scoring
|
|
│ │ │ └── selector.lua # Provider selection logic
|
|
│ │ ├── diff/
|
|
│ │ │ ├── diff.lua # Diff utilities
|
|
│ │ │ ├── patch.lua # Patch generation + staleness
|
|
│ │ │ ├── conflict.lua # Git-style conflict resolution
|
|
│ │ │ └── search_replace.lua # SEARCH/REPLACE block parser
|
|
│ │ ├── events/queue.lua # Priority event queue
|
|
│ │ ├── scheduler/
|
|
│ │ │ ├── scheduler.lua # Event dispatch orchestrator
|
|
│ │ │ ├── worker.lua # Async LLM worker
|
|
│ │ │ ├── executor.lua # Tool execution
|
|
│ │ │ ├── loop.lua # Processing loop
|
|
│ │ │ └── resume.lua # Session resume
|
|
│ │ ├── cost/init.lua # Token usage + cost estimation
|
|
│ │ └── memory/ # Knowledge graph & pattern learning
|
|
│ │
|
|
│ ├── features/
|
|
│ │ ├── completion/ # Inline completion & suggestions
|
|
│ │ └── indexer/ # Project indexing & analysis
|
|
│ │
|
|
│ ├── support/
|
|
│ │ ├── utils.lua # General utilities
|
|
│ │ ├── logger.lua # Logging system
|
|
│ │ ├── tree.lua # Project tree generator
|
|
│ │ ├── health.lua # :checkhealth provider
|
|
│ │ ├── gitignore.lua # .gitignore management
|
|
│ │ └── langmap.lua # Language detection
|
|
│ │
|
|
│ ├── params/agents/ # Config tables for subsystems
|
|
│ └── prompts/ # System & agent prompts
|
|
│
|
|
├── plugin/codetyper.lua # Plugin loader
|
|
├── doc/codetyper.txt # Vim help documentation
|
|
├── doc/tags # Help tags
|
|
├── tests/ # Test suite
|
|
├── Makefile # Build/test/lint targets
|
|
├── README.md
|
|
├── CHANGELOG.md
|
|
├── CONTRIBUTING.md
|
|
├── LICENSE
|
|
└── llms.txt # LLM context documentation
|
|
```
|
|
|
|
## Making Changes
|
|
|
|
### Branch Naming
|
|
|
|
Use descriptive branch names:
|
|
- `feature/description` — New features
|
|
- `fix/description` — Bug fixes
|
|
- `docs/description` — Documentation updates
|
|
- `refactor/description` — Code refactoring
|
|
|
|
### Commit Messages
|
|
|
|
Follow conventional commits:
|
|
```
|
|
type(scope): description
|
|
|
|
[optional body]
|
|
|
|
[optional footer]
|
|
```
|
|
|
|
Types:
|
|
- `feat` — New feature
|
|
- `fix` — Bug fix
|
|
- `docs` — Documentation
|
|
- `style` — Formatting, no code change
|
|
- `refactor` — Code restructuring
|
|
- `test` — Adding tests
|
|
- `chore` — Maintenance
|
|
|
|
Examples:
|
|
```
|
|
feat(scope): add indentation-based fallback for scope resolution
|
|
fix(patch): handle missing if-wrapper in SEARCH/REPLACE block
|
|
docs(readme): update commands reference for current state
|
|
```
|
|
|
|
## Submitting Changes
|
|
|
|
1. Ensure your code follows the style guide
|
|
2. Update documentation if needed
|
|
3. Update `CHANGELOG.md` for notable changes
|
|
4. Test your changes thoroughly
|
|
5. Create a pull request with:
|
|
- Clear title describing the change
|
|
- Description of what and why
|
|
- Reference to any related issues
|
|
|
|
### Pull Request Template
|
|
|
|
```markdown
|
|
## Description
|
|
[Describe your changes]
|
|
|
|
## Type of Change
|
|
- [ ] Bug fix
|
|
- [ ] New feature
|
|
- [ ] Documentation update
|
|
- [ ] Refactoring
|
|
|
|
## Testing
|
|
[Describe how you tested your changes]
|
|
|
|
## Checklist
|
|
- [ ] Code follows style guide
|
|
- [ ] Documentation updated
|
|
- [ ] CHANGELOG.md updated
|
|
- [ ] All tests pass
|
|
```
|
|
|
|
## Style Guide
|
|
|
|
### Lua Style
|
|
|
|
- Use tabs for indentation
|
|
- Use `snake_case` for variables and functions
|
|
- Use `PascalCase` for module names
|
|
- Add type annotations with `---@param`, `---@return`, etc.
|
|
- Document public functions with LuaDoc comments
|
|
- Avoid obvious/redundant comments
|
|
|
|
```lua
|
|
---@mod module_name Module description
|
|
|
|
local M = {}
|
|
|
|
--- Description of the function
|
|
---@param name string The parameter description
|
|
---@return boolean
|
|
function M.example_function(name)
|
|
return true
|
|
end
|
|
|
|
return M
|
|
```
|
|
|
|
### Documentation
|
|
|
|
- Keep `README.md` up to date
|
|
- Update `doc/codetyper.txt` for new features
|
|
- Regenerate `doc/tags` after help file changes
|
|
- Use clear, concise language
|
|
- Include examples where helpful
|
|
|
|
## Testing
|
|
|
|
### Running Tests
|
|
|
|
```bash
|
|
make test # Run all tests
|
|
make test-file F=x # Run a specific test file
|
|
make test-verbose # Verbose output
|
|
make lint # Run luacheck
|
|
make format # Format with stylua
|
|
```
|
|
|
|
### Manual Testing
|
|
|
|
1. Test all commands work correctly
|
|
2. Test with different file types
|
|
3. Test LLM integration (Copilot and Ollama)
|
|
4. Test edge cases (empty files, large files, no Tree-sitter, etc.)
|
|
5. Run `:checkhealth codetyper`
|
|
|
|
## Questions?
|
|
|
|
Feel free to:
|
|
- Open an issue for bugs or feature requests
|
|
- Start a discussion for questions
|
|
- Reach out to the maintainer
|
|
|
|
## Contact
|
|
|
|
- **Maintainer**: cargdev
|
|
- **Email**: carlos.gutierrez@carg.dev
|
|
- **Website**: [cargdev.io](https://cargdev.io)
|
|
|
|
---
|
|
|
|
Thank you for contributing!
|