From 352f09ef073957fe71fb8e34e1c03fe20451dda9 Mon Sep 17 00:00:00 2001 From: Edcko Date: Thu, 16 Apr 2026 09:27:32 -0600 Subject: [PATCH] docs: add comprehensive project README --- README.md | 535 ++++++++++++++++++++++++------------------------------ 1 file changed, 241 insertions(+), 294 deletions(-) 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** + [![Go Version](https://img.shields.io/badge/Go-1.24+-00ADD8?style=flat&logo=go)](https://golang.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![CI](https://github.com/Edcko/techne-code/actions/workflows/ci.yml/badge.svg)](https://github.com/Edcko/techne-code/actions/workflows/ci.yml) +[![Release](https://github.com/Edcko/techne-code/actions/workflows/release.yml/badge.svg)](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