diff --git a/README.md b/README.md
index 906099d..2956658 100644
--- a/README.md
+++ b/README.md
@@ -1,116 +1,143 @@
+
+
# Techne Code
+**Open source coding AI agent in Go — extensible, multi-provider, with sub-agent orchestration**
+
[](https://golang.org/)
[](https://opensource.org/licenses/MIT)
[](https://github.com/Edcko/techne-code/actions/workflows/ci.yml)
+[](https://github.com/Edcko/techne-code/actions/workflows/release.yml)
-**Open source coding AI agent in Go — extensible, multi-provider, with sub-agent orchestration**
+[Installation](#installation) · [Quick Start](#quick-start) · [Configuration](#configuration) · [Architecture](#architecture) · [Contributing](CONTRIBUTING.md)
+
+
+
+---
## What is Techne Code?
-Techne Code is an AI-powered coding assistant built in Go. It's designed to be:
+Techne Code is an AI-powered coding agent that runs in your terminal. Built in Go with a first-class TUI, it connects to multiple LLM providers and gives the AI a rich set of tools to read, write, search, and execute code — all with your approval.
+
+What makes it different:
+
+- **Multi-provider** — Anthropic Claude, OpenAI-compatible endpoints, Google Gemini, and local Ollama models
+- **Sub-agent orchestration** — The agent delegates specialized tasks (research, coding, review, testing) to sub-agents that run in parallel
+- **Extensible skills system** — Context-aware skill triggers inject domain expertise into the system prompt
+- **Terminal-first** — Streaming TUI with markdown rendering, syntax highlighting, diff visualization, and multiline input
+- **Permission-based** — Every destructive operation (file writes, shell commands) requires interactive approval
+
+## Features
+
+| Category | Details |
+|----------|---------|
+| **LLM Providers** | Anthropic Claude, OpenAI-compatible (Z.ai, OpenAI), Google Gemini, Ollama |
+| **Per-provider tool control** | Ollama defaults to chat-only; cloud providers enable full agentic mode |
+| **11 built-in tools** | `read_file`, `write_file`, `edit_file`, `glob`, `grep`, `bash`, `list_dir`, `git`, `web_fetch`, `delegate`, `subagent` |
+| **8 built-in skills** | Go, TypeScript, Python, React, Docker, Database, API Design, Security |
+| **Sub-agent orchestration** | 4 specialized agents (researcher, coder, reviewer, tester) with parallel delegation |
+| **TUI** | Markdown rendering, syntax highlighting (7 languages), diff display, status bar, multiline input |
+| **Slash commands** | `/model`, `/provider`, `/help`, `/clear` — switch models mid-session |
+| **Session persistence** | SQLite-backed sessions with list, show, delete, and resume |
+| **Context management** | Token tracking, automatic compression at 90% context window, LLM-powered summarization |
+| **Permission system** | Interactive Y/A/N dialog for file modifications and shell commands |
+| **Diagnostics** | `techne doctor` — 7 checks for config, providers, API keys, Ollama, and Go version |
+
+## Installation
-- **Extensible**: Plugin-based skill system for custom capabilities
-- **Multi-provider**: Support for multiple LLM providers (Anthropic, OpenAI-compatible, Ollama)
-- **Orchestrated**: Sub-agent architecture for complex tasks
-- **Terminal-first**: Beautiful TUI built with Bubbletea v2
+### Homebrew (macOS / Linux)
-## Key Features
+```bash
+brew tap Edcko/homebrew-tap
+brew install techne
+```
-- **Multi-provider LLM support** — Anthropic, OpenAI-compatible (Z.ai, OpenAI), Ollama
-- **Per-provider tools control** — Ollama defaults to chat-only, cloud providers enable full agentic mode
-- **Extensible skills system** — Context-aware triggers for specialized coding patterns
-- **Sub-agent orchestration** — Delegate complex tasks to specialized agents
-- **Terminal UI with streaming** — Real-time thinking display, tool execution visualization
-- **Session management** — Persistent conversation history with list/show/delete/resume
-- **Permission-based execution** — Interactive approval for file modifications and shell commands
-- **6 built-in tools** — read, write, edit, glob, grep, bash
-- **3 built-in skills** — Go engineer, TypeScript, Security best practices
+### Curl (macOS / Linux)
-## Getting Started
+```bash
+curl -fsSL https://raw.githubusercontent.com/Edcko/techne-code/main/install.sh | bash
+```
-### Prerequisites
+### Go Install
-- Go 1.24 or higher
-- An LLM provider API key (Anthropic, OpenAI-compatible, or Ollama)
+```bash
+go install github.com/Edcko/techne-code/cmd/techne@latest
+```
-### Installation
+### Build from Source
```bash
-# Clone the repository
git clone https://github.com/Edcko/techne-code.git
cd techne-code
-
-# Build
go build ./cmd/techne
-
-# Run
-./techne
```
-### Quick Start
+> **Prerequisites**: Go 1.24+ and an LLM provider API key (or Ollama running locally).
+
+## Quick Start
```bash
-# Set your API key (Anthropic)
-export TECHNE_ANTHROPIC_API_KEY=your-key-here
+# Set your API key
+export TECHNE_ANTHROPIC_API_KEY=sk-ant-...
-# Or for OpenAI-compatible (Z.ai)
-export TECHNE_OPENAI_API_KEY=your-key-here
+# Launch interactive TUI
+techne
+
+# Or specify a provider and model
+techne --provider openai --model glm-5
-# Run Techne Code (opens interactive TUI)
-./techne
+# Non-interactive (one-shot)
+techne chat -p "Explain how Go interfaces work"
-# Or specify provider/model
-./techne --provider openai --model glm-5
+# Chat-only mode (no tools)
+techne chat --no-tools -p "Tell me a joke about recursion"
```
-## CLI Commands Reference
+## CLI Reference
### Global Flags
-```bash
-techne --provider # LLM provider to use
-techne --model # LLM model to use
+```
+techne --provider # LLM provider (anthropic, openai, gemini, ollama)
+techne --model # Model to use
techne --config # Path to config file
```
-### Chat (Default Command)
+### Commands
-```bash
+```
techne # Interactive TUI (default)
techne chat # Interactive TUI (explicit)
techne chat -p "prompt" # Non-interactive mode
-techne chat --no-tools -p "Hi" # Chat-only mode (no tool use)
-techne --provider openai --model glm-5 # Use specific provider/model
-```
-
-### Session Management
-
-```bash
-techne session list # List all sessions
-techne session list # Alias: techne session ls
-techne session show # Show session details with messages
-techne session delete # Delete a session (prompts for confirmation)
-techne session delete # Alias: techne session rm
+techne chat --no-tools -p "Hi" # Chat-only (no tool use)
+techne chat --session # Resume a session
+techne chat --new-session # Force new session
+
+techne session list # List all sessions (alias: ls)
+techne session show # Show session details and messages
+techne session delete # Delete a session (alias: rm)
+
+techne skills list # List available skills with triggers
+techne config init # Bootstrap config interactively
+techne config show # Display effective config (masked keys)
+techne doctor # Run diagnostic checks
+techne version # Show version information
```
-### Skills
+### TUI Slash Commands
-```bash
-techne skills list # List available skills with status and triggers
-```
+| Command | Description |
+|---------|-------------|
+| `/model ` | Switch model mid-session |
+| `/provider ` | Switch provider mid-session |
+| `/clear` | Clear conversation history |
+| `/help` | Show available commands |
-### Version
-
-```bash
-techne version # Show version information
-```
+**Keyboard shortcuts**: `Enter` = newline · `Ctrl+Enter` = send · `Ctrl+C` = quit/cancel
## Configuration
-### Config File
-
-Techne Code looks for configuration in `techne.json` (or `techne.yaml`) in the current directory:
+Techne Code looks for `techne.json` (or `techne.yaml`) in the current directory. You can bootstrap one with `techne config init`.
```json
{
@@ -129,6 +156,12 @@ Techne Code looks for configuration in `techne.json` (or `techne.yaml`) in the c
"models": ["glm-5", "glm-4.6", "glm-4.7"],
"tools_enabled": true
},
+ "gemini": {
+ "type": "gemini",
+ "api_key": "${GEMINI_API_KEY}",
+ "models": ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.0-flash"],
+ "tools_enabled": true
+ },
"ollama": {
"type": "ollama",
"base_url": "http://localhost:11434/v1",
@@ -161,7 +194,7 @@ Techne Code looks for configuration in `techne.json` (or `techne.yaml`) in the c
|-------|-------------|---------|
| `default_provider` | Default LLM provider name | `"anthropic"` |
| `default_model` | Default model for the provider | Provider-specific |
-| `providers..type` | Provider type: `anthropic`, `openai`, `ollama` | Required |
+| `providers..type` | Provider type: `anthropic`, `openai`, `gemini`, `ollama` | Required |
| `providers..api_key` | API key (supports `${VAR}` syntax) | From env |
| `providers..base_url` | Custom API endpoint | Provider-specific |
| `providers..models` | Available models list | `[]` |
@@ -181,93 +214,62 @@ Techne Code looks for configuration in `techne.json` (or `techne.yaml`) in the c
|----------|-------------|
| `TECHNE_ANTHROPIC_API_KEY` | API key for Anthropic Claude |
| `TECHNE_OPENAI_API_KEY` | API key for OpenAI-compatible providers |
+| `TECHNE_GEMINI_API_KEY` | API key for Google Gemini |
| `TECHNE_OLLAMA_API_KEY` | API key for Ollama (optional) |
-## Provider-Specific Notes
-
-### Anthropic
+## Provider Setup
-- Set `TECHNE_ANTHROPIC_API_KEY` environment variable
-- Default model: `claude-sonnet-4-20250514`
-- Tools enabled by default
+### Anthropic Claude
```bash
export TECHNE_ANTHROPIC_API_KEY=sk-ant-...
-techne chat
+techne chat # Default: claude-sonnet-4-20250514
```
-### OpenAI-compatible (Z.ai, OpenAI)
+Tools enabled by default. Supports streaming and tool calling.
-- Set `TECHNE_OPENAI_API_KEY` environment variable
-- For Z.ai: Base URL is `https://api.z.ai/api/coding/paas/v4`
-- Available models: `glm-5`, `glm-4.6`, `glm-4.7`
-- Tools enabled by default
+### OpenAI-compatible (Z.ai, OpenAI)
```bash
export TECHNE_OPENAI_API_KEY=your-key-here
techne chat --provider openai --model glm-5
```
-### Ollama (Local Models)
+Works with any OpenAI-compatible endpoint. Configure `base_url` in the provider config. Tools enabled by default.
-- Runs locally at `http://localhost:11434/v1`
-- **No API key required**
-- **Chat-only mode by default** — tools disabled for better compatibility with local models
-- Force enable tools with `tools_enabled: true` in config
-
-#### Using Ollama
-
-1. **Install and start Ollama**:
- ```bash
- # Install Ollama (visit https://ollama.ai for instructions)
- # Start the Ollama service
- ollama serve
- ```
-
-2. **Pull a model**:
- ```bash
- ollama pull qwen2.5-coder
- # Or other models: llama3.2, deepseek-coder, mistral
- ```
-
-3. **Configure Techne Code**:
- ```json
- {
- "default_provider": "ollama",
- "default_model": "qwen2.5-coder",
- "providers": {
- "ollama": {
- "type": "ollama",
- "base_url": "http://localhost:11434/v1"
- }
- }
- }
- ```
-
-4. **Run**:
- ```bash
- # Chat-only mode (default for Ollama)
- techne chat --provider ollama --model qwen2.5-coder -p "Explain Go interfaces"
-
- # Interactive session
- techne chat
- ```
+### Google Gemini
-### Disabling Tools
+```bash
+export TECHNE_GEMINI_API_KEY=your-key-here
+techne chat --provider gemini --model gemini-2.5-pro
+```
-Use the `--no-tools` flag to force chat-only mode with any provider:
+Supports models up to 1M context window (`gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-2.0-flash`). Tool calling via REST API. Tools enabled by default.
+
+### Ollama (Local Models)
```bash
-# Chat-only with OpenAI
-techne chat --provider openai --model glm-5 --no-tools -p "Hello"
+# Start Ollama and pull a model
+ollama serve
+ollama pull qwen2.5-coder
+
+# Chat-only mode (tools disabled by default for local models)
+techne chat --provider ollama --model qwen2.5-coder -p "Explain Go interfaces"
-# Chat-only with Anthropic
-techne chat --no-tools -p "Just chat, no file operations"
+# Force enable tools in config: "tools_enabled": true
+```
+
+Ollama runs locally — no API key required. Chat-only by default because many local models have limited tool-calling support. The adapter handles Ollama's non-standard tool call format transparently.
+
+### Disabling Tools
+
+```bash
+techne chat --no-tools -p "Just a conversation, no file operations"
```
## Skills System
-Skills provide specialized instructions to the AI based on context. They're loaded from:
+Skills inject domain-specific instructions into the system prompt based on context. They load from three locations:
- **Built-in**: Compiled into the binary
- **User skills**: `~/.config/techne/skills/`
@@ -277,18 +279,23 @@ Skills provide specialized instructions to the AI based on context. They're load
| Skill | Trigger | Description |
|-------|---------|-------------|
-| `go_engineer` | `*.go` files | Go best practices, error handling, testing patterns |
+| `go_engineer` | `*.go` files | Go best practices, error handling, testing |
| `typescript` | `*.ts`, `*.tsx` files | TypeScript patterns and best practices |
+| `python` | `*.py` files | Python idioms and best practices |
+| `react` | `*.jsx`, `*.tsx` files | React component patterns |
+| `docker` | `Dockerfile`, `docker-compose*` | Container best practices |
+| `database` | `*.sql`, migration files | Database design and query patterns |
+| `api_design` | API-related files | REST/GraphQL API design principles |
| `security` | Always active | Security-conscious coding practices |
-### Creating Custom Skills
+### Custom Skills
-Skills are markdown files with YAML frontmatter:
+Create a markdown file with YAML frontmatter in `~/.config/techne/skills/` or `.techne/skills/`:
```markdown
---
name: my-skill
-description: Custom skill description
+description: Custom skill for my project
triggers:
- type: file_pattern
pattern: "*.py"
@@ -302,194 +309,135 @@ Your custom instructions here. This content is injected into the system prompt
when the skill is active.
- Use markdown formatting
-- Include practical guidelines
- Keep it focused and actionable
```
-**Trigger Types**:
-
-| Type | Pattern | Activation |
-|------|---------|------------|
-| `always` | (none) | Always active |
-| `file_pattern` | `*.go`, `**/*.ts` | When editing matching files |
-| `command` | `test`, `build` | When specific commands run |
+**Trigger types**: `always` (always active), `file_pattern` (glob match), `command` (command name match).
## Tools Reference
-| Tool | Description | Permission Required |
-|------|-------------|---------------------|
+| Tool | Description | Permission |
+|------|-------------|------------|
| `read_file` | Read file contents with optional line range | No |
-| `write_file` | Create or overwrite files | Yes |
-| `edit_file` | Find and replace text in files | Yes |
+| `write_file` | Create or overwrite files (auto-creates dirs) | Yes |
+| `edit_file` | Find and replace text (exact match) | Yes |
| `glob` | Find files matching glob patterns | No |
-| `grep` | Search file contents with regex | No |
-| `bash` | Execute shell commands | Yes |
-
-### Tool Details
+| `grep` | Search file contents with regex (ripgrep fallback) | No |
+| `bash` | Execute shell commands with timeout | Yes |
+| `list_dir` | List directory contents with sizes and timestamps | No |
+| `git` | Structured git commands (status, diff, log, add, commit, branch, stash) | Yes |
+| `web_fetch` | HTTP GET with HTML-to-text conversion | No |
+| `delegate` | Parallel sub-agent delegation (up to 3 concurrent tasks) | Yes |
+| `subagent` | Execute a single sub-agent task (researcher, coder, reviewer, tester) | Yes |
-#### read_file
-```json
-{"path": "main.go", "offset": 1, "limit": 50}
-```
-Returns file content with line numbers. Use offset/limit for large files.
+### Sub-Agent Architecture
-#### write_file
-```json
-{"path": "output.txt", "content": "Hello, World!"}
-```
-Creates parent directories automatically.
+Four specialized agents are available through the `delegate` and `subagent` tools:
-#### edit_file
-```json
-{"path": "main.go", "old_string": "foo", "new_string": "bar"}
-```
-Exact match required. Returns number of replacements.
+| Agent | Tools | Purpose |
+|-------|-------|---------|
+| `researcher` | `web_fetch`, `grep`, `glob` | Gather information and search code |
+| `coder` | `write_file`, `edit_file`, `bash` | Implement changes and run builds |
+| `reviewer` | `read_file`, `grep` | Review code for issues |
+| `tester` | `bash` | Run tests and validate output |
-#### glob
-```json
-{"pattern": "**/*.go", "path": "src"}
-```
-Supports `**` for recursive matching. Results sorted alphabetically.
-
-#### grep
-```json
-{"pattern": "func.*Handler", "include": "*.go", "path": "."}
-```
-Uses ripgrep if available, falls back to Go regex. Limits to 50 matches.
-
-#### bash
-```json
-{"command": "go test ./...", "timeout_ms": 60000}
-```
-Executes in project directory. Output truncated at 20KB. Banned commands blocked.
+The `delegate` tool accepts multiple tasks and runs up to 3 sub-agents concurrently, aggregating results.
## Session Management
-Sessions store conversation history in a SQLite database (`.techne/techne.db`).
-
-### Commands
-
-```bash
-# List all sessions
-techne session list
-# Output: ID TITLE CREATED MESSAGES
-# abc New Session 2025-01-15 10:30 5
-
-# Show session details
-techne session show abc
-# Displays: ID, Title, Model, Provider, Created, Updated
-# Plus message history (truncated to 500 chars per message)
-
-# Delete a session (prompts for confirmation)
-techne session delete abc
-```
-
-### Resuming Sessions
+Sessions are stored in a SQLite database (`.techne/techne.db`).
```bash
-# Resume specific session
-techne chat --session abc
+techne session list # List all sessions
+techne session show # Show details and message history
+techne session delete # Delete a session
-# Force new session (don't resume)
-techne chat --new-session
+techne chat --session # Resume an existing session
+techne chat --new-session # Force start a new session
```
+Sessions persist full conversation history across runs. The context manager tracks token usage and automatically compresses conversations when they approach the model's context window limit.
+
## Architecture
```
techne-code/
-├── cmd/techne/ # Application entrypoint
-│ └── cli/ # CLI commands (chat, session, skills, version)
+├── cmd/techne/ # Application entrypoint
+│ ├── main.go # Binary entry point
+│ └── cli/ # CLI commands (chat, session, skills, config, doctor, version)
├── internal/
-│ ├── agent/ # Core agent logic
-│ ├── config/ # Configuration management (koanf-based)
-│ ├── db/ # SQLite database layer
-│ ├── event/ # Channel-based event bus (sequential dispatch)
-│ ├── llm/ # LLM client abstractions
-│ │ └── providers/ # Provider implementations
-│ │ ├── anthropic/ # Anthropic Claude API
-│ │ ├── openai/ # OpenAI-compatible (Z.ai, OpenAI)
-│ │ └── ollama/ # Ollama local models
-│ ├── permission/ # Permission system (interactive/auto)
-│ ├── skills/ # Skill registry & loader
-│ │ └── builtin/ # Built-in skills (go_engineer, typescript, security)
-│ └── tools/ # Tool implementations (read, write, edit, glob, grep, bash)
-├── pkg/ # Public packages
-│ ├── event/ # Event types (MessageDelta, ToolStart, ToolResult)
-│ ├── provider/ # Provider interface
-│ ├── session/ # Session types
-│ ├── skill/ # Skill types and interfaces
-│ └── tool/ # Tool types and interfaces
-├── tui/ # Terminal UI (Bubbletea v2)
-│ └── components/ # Reusable TUI components
-├── .github/workflows/ # GitHub Actions CI/CD
-│ ├── ci.yml # Test, vet, build on push/PR
-│ └── release.yml # Release automation
-├── docs/ # Documentation
-└── scripts/ # Build & utility scripts
+│ ├── agent/ # Core agent loop, sub-agent orchestration, context management
+│ ├── config/ # Configuration loading and validation (koanf-based)
+│ ├── db/ # SQLite database layer and session store
+│ ├── event/ # Channel-based event bus (sequential dispatch)
+│ ├── llm/ # LLM client abstractions
+│ │ └── providers/
+│ │ ├── anthropic/ # Anthropic Claude API adapter
+│ │ ├── gemini/ # Google Gemini REST API adapter
+│ │ ├── openai/ # OpenAI-compatible adapter (Z.ai, OpenAI)
+│ │ └── ollama/ # Ollama local model adapter
+│ ├── permission/ # Permission system (interactive/auto allow/deny)
+│ ├── skills/ # Skill registry, loader, prompt builder
+│ │ └── builtin/ # 8 built-in skills
+│ └── tools/ # 11 tool implementations + sub-agent delegation
+├── pkg/ # Public packages (stable APIs)
+│ ├── event/ # Event types
+│ ├── provider/ # Provider interface
+│ ├── session/ # Session types
+│ ├── skill/ # Skill types and interfaces
+│ └── tool/ # Tool types and interfaces
+├── tui/ # Terminal UI (Bubbletea v2)
+│ ├── components/ # Permission dialog, status bar
+│ ├── diff/ # LCS-based unified diff renderer
+│ ├── markdown/ # Markdown + syntax highlighting renderer
+│ └── styles.go # Lipgloss styling
+├── e2e/ # End-to-end test suite
+├── .github/workflows/ # CI (test/vet/build) + Release (GoReleaser)
+├── docs/ # Documentation
+├── Formula/ # Homebrew formula
+├── install.sh # Curl-based installer
+└── scripts/ # Build and utility scripts
```
-### Event System
-
-The event bus uses sequential dispatch to prevent race conditions:
-
-```go
-// Events are processed in order through a channel
-bus := eventbus.NewChannelEventBus()
-bus.Subscribe(func(e event.Event) {
- switch e.Type {
- case event.EventMessageDelta:
- // Handle streaming text
- case event.EventToolStart:
- // Tool execution started
- case event.EventToolResult:
- // Tool finished
- }
-})
-```
-
-### TUI Features
+### Key Design Decisions
-- Real-time streaming with thinking display
-- Tool execution visualization with status indicators
-- Keyboard shortcuts: `ctrl+c` to quit/cancel, `enter` to send
-- Responsive layout with message scrolling
+- **Sequential event bus** — Events dispatch through a channel to prevent race conditions in streaming output
+- **Agent-as-Tool pattern** — Sub-agents implement the `tool.Tool` interface, so the LLM decides when to delegate
+- **Provider adapters** — Each provider has dedicated `adapter.go` and `convert.go` files for clean separation of API quirks (e.g., Ollama's non-standard tool call format)
+- **Permission events** — Agent and TUI communicate tool permission requests through the event bus, keeping concerns separated
## Development
### Running Tests
```bash
-# Run all tests
-go test ./...
+go test ./... # All tests
+go test -v ./... # Verbose output
+go test ./internal/tools/... # Specific package
+go test -count=1 ./... # Disable test cache
+```
-# Run with verbose output
-go test -v ./...
+### E2E Tests
-# Run specific package
-go test ./internal/config/...
+The project includes end-to-end tests that run against a real Ollama instance:
+
+```bash
+# Requires Ollama running with qwen2.5-coder pulled
+go test ./e2e/ -v -timeout 120s
```
### Code Quality
```bash
-# Run linter
-go vet ./...
-
-# Format code
-go fmt ./...
-
-# Verify dependencies
-go mod verify
+go vet ./... # Run linter
+go fmt ./... # Format code
+go mod verify # Verify dependencies
```
### Building
```bash
-# Local build
-go build ./cmd/techne
-
-# Build for multiple platforms
+go build ./cmd/techne # Local build
GOOS=linux GOARCH=amd64 go build ./cmd/techne
GOOS=darwin GOARCH=arm64 go build ./cmd/techne
GOOS=windows GOARCH=amd64 go build ./cmd/techne
@@ -497,36 +445,35 @@ GOOS=windows GOARCH=amd64 go build ./cmd/techne
### Test Coverage
-The project has comprehensive test coverage:
-
-- `internal/config/` — Configuration loading, defaults, provider config
-- `internal/tools/` — All 6 tools with various scenarios
-- `internal/skills/` — Registry, parser, loader
-- `cmd/techne/cli/` — CLI command parsing and execution
+| Package | What's Tested |
+|---------|--------------|
+| `cmd/techne/cli/` | CLI parsing, chat, config, doctor |
+| `internal/agent/` | Agent loop, sub-agents, context management, token tracking |
+| `internal/config/` | Config loading, defaults, validation |
+| `internal/llm/providers/` | Anthropic (30 tests), Gemini (33 tests), OpenAI adapters |
+| `internal/tools/` | All 11 tools — edit, glob, grep, bash, git, web_fetch, list_dir, delegate, subagent |
+| `internal/skills/` | Registry, parser, loader |
+| `tui/` | Model, slash commands, markdown rendering, diff, wrap, permission dialog |
+| `e2e/` | Real Ollama chat, tool calling, multi-turn, session persistence, model switching |
## Contributing
-We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
-
-### Development Workflow
+Contributions are welcome! Check out the [Contributing Guide](CONTRIBUTING.md) for setup, code style, and PR process.
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
-3. Make your changes
-4. Run tests (`go test ./...`)
-5. Run linter (`go vet ./...`)
-6. Commit your changes
-7. Push to the branch
-8. Open a Pull Request
+3. Make your changes with tests
+4. Run `go test ./...` and `go vet ./...`
+5. Open a Pull Request
## License
-This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
+[MIT](LICENSE)
-## Acknowledgments
+## Built With
-Built with:
- [Bubbletea v2](https://charm.land/bubbletea/) — Terminal UI framework
- [Cobra](https://github.com/spf13/cobra) — CLI framework
- [Koanf](https://github.com/knadh/koanf) — Configuration management
-- [Go](https://golang.org/) — The Go programming language
+- [Lipgloss](https://charm.land/lipgloss/) — Terminal styling
+- [GoReleaser](https://goreleaser.ca/) — Release automation