{"id":18570131,"url":"https://github.com/vonglasow/gaia","last_synced_at":"2026-04-01T17:38:24.471Z","repository":{"id":231997185,"uuid":"774051582","full_name":"vonglasow/gaia","owner":"vonglasow","description":"Gaia is a command-line interface (CLI) tool for interacting with language models via a local API. It features a beautiful terminal UI, robust configuration management, and multiple interaction modes (default, describe, code, shell) for versatile assistance with programming, system administration, and more.","archived":false,"fork":false,"pushed_at":"2026-03-18T17:21:25.000Z","size":341,"stargazers_count":12,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-19T06:56:46.704Z","etag":null,"topics":["ai","bubbletea","cli","cobra","commands","developer-tools","go","homebrew","language-model","linux","llama","llm","local-api","ollama","productivity","shell","terminal","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vonglasow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2024-03-18T21:25:42.000Z","updated_at":"2026-03-18T17:43:40.000Z","dependencies_parsed_at":"2025-12-06T05:04:20.052Z","dependency_job_id":null,"html_url":"https://github.com/vonglasow/gaia","commit_stats":null,"previous_names":["vonglasow/gaia"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/vonglasow/gaia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vonglasow%2Fgaia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vonglasow%2Fgaia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vonglasow%2Fgaia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vonglasow%2Fgaia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vonglasow","download_url":"https://codeload.github.com/vonglasow/gaia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vonglasow%2Fgaia/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","bubbletea","cli","cobra","commands","developer-tools","go","homebrew","language-model","linux","llama","llm","local-api","ollama","productivity","shell","terminal","tui"],"created_at":"2024-11-06T22:37:49.232Z","updated_at":"2026-04-01T17:38:24.462Z","avatar_url":"https://github.com/vonglasow.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gaia\n\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/vonglasow/gaia/main.svg)](https://results.pre-commit.ci/latest/github/vonglasow/gaia/main)\n![Go Version](https://img.shields.io/github/go-mod/go-version/vonglasow/gaia)\n![License](https://img.shields.io/github/license/vonglasow/gaia)\n![Homebrew Formula](https://img.shields.io/badge/Homebrew-Install%20via%20tap-lightgrey)\n![Powered by Ollama](https://img.shields.io/badge/Powered%20by-Ollama-3a86ff?logo=ollama\u0026logoColor=white)\n![100% Local AI](https://img.shields.io/badge/100%25%20Local-AI-success)\n![Works Offline](https://img.shields.io/badge/Works-Offline-orange)\n\nGaia is a command-line interface (CLI) tool that provides a convenient way to\ninteract with language models through a local or remote API. It features a beautiful\nterminal UI, configuration management, automatic role detection, response caching,\nand support for different interaction modes.\n\n## Features\n\n- 🚀 Simple and intuitive command-line interface\n- 🎨 Beautiful terminal UI with progress bars\n- 📺 **Interactive TUI prompts** (Bubble Tea): when using tool actions (`gaia tool git commit`) or operator mode (`gaia investigate`), context and confirmation prompts use a rich terminal UI in a real terminal — styled boxes, keyboard shortcuts, text wrapping to window width\n- ⚙️ Comprehensive configuration management with YAML support\n- 🔄 Support for different interaction modes (default, describe, code, shell, commit, branch)\n- 🤖 Automatic role detection based on message content\n- 📦 Automatic model management (pull if not present)\n- 💾 Response caching for faster repeated queries\n- 🧹 Optional sanitization of prompts before LLM (reduce noise and tokens; configurable levels)\n- 🔌 Support for local (Ollama) and remote (OpenAI, Mistral) APIs\n- 🛠️ Tool integration for executing external commands\n- 📥 Stdin support for piping content\n- 🔍 **Investigate (operator mode)**: autonomous investigation with tool execution (e.g. \"Why is my disk full?\") — plan, run commands, reason, and summarize with safety controls (denylist, confirmation, dry-run)\n\n## Installation\n\n### Prerequisites\n\n- Go 1.26 or later\n- A running instance of a compatible language model API (e.g., Ollama) or an API key for OpenAI or Mistral\n\n### Building from Source\n\n```bash\ngit clone https://github.com/vonglasow/gaia.git\ncd gaia\ngo build\n```\n\n### Using Homebrew (recommended 🍺)\n\n```sh\nbrew tap vonglasow/tap\nbrew install gaia\n```\n\n#### Update\n\n```sh\nbrew upgrade gaia\n```\n\n## Configuration\n\nGaia stores its configuration in `~/.config/gaia/config.yaml`. The configuration file is automatically created on first run with sensible defaults.\n\n### Project-Local Overrides (`.gaia.yaml`)\n\nWhen you run Gaia inside a project, Gaia looks for a local `.gaia.yaml` (from your current directory up to the git repository root).\n\n- Local config is useful for project-specific `roles.*` prompts and `tools.*` actions.\n- On first detection, Gaia asks whether you trust that repository.\n- If trusted, local settings override your user config for that repository.\n- Trust decisions are stored in `~/.config/gaia/trusted-repos.yaml` and reused on next runs.\n- In non-interactive mode (CI, piped execution), untrusted local config is ignored and Gaia uses user/global config only.\n\nConfiguration precedence is:\n\n`CLI flags \u003e env vars \u003e local .gaia.yaml \u003e ~/.config/gaia/config.yaml \u003e built-in defaults`\n\n### Basic Configuration\n\n- `model`: The language model to use (default: \"mistral\" for Ollama, \"gpt-4o-mini\" for OpenAI, \"mistral-medium-latest\" for Mistral)\n- `host`: API host (default: \"localhost\" for Ollama, \"api.openai.com\" for OpenAI, \"api.mistral.ai\" for Mistral)\n- `port`: API port (default: 11434 for Ollama, 443 for OpenAI and Mistral)\n\n### Cache Configuration\n\n- `cache.enabled`: Enable/disable response caching (default: `true`)\n- `cache.dir`: Cache directory path (default: `~/.config/gaia/cache`)\n\n### Sanitize before LLM\n\nOptional preprocessing to reduce noise and token usage before sending messages to the model:\n\n- `sanitize_before_llm`: Enable/disable sanitization (default: `false`)\n- `sanitize.level`: Filter intensity — `none`, `light`, or `aggressive` (default: `light`)\n  - **light**: Removes debug/metadata lines, timestamps, obvious duplicates, collapses extra newlines\n  - **aggressive**: In addition, removes long unstructured runs and redundant sections\n- `sanitize.max_tokens_after`: Cap total tokens after sanitization (default: `0` = no cap)\n- `sanitize.log_stats`: Log token counts and filtering stats to stderr when sanitization runs (default: `true`)\n\nThe last user message is always preserved. When enabled, a one-line summary is printed to stderr, e.g. `[sanitize] tokens before=1200 after=800 removed≈400 ms=2`.\n\n### Auto-Role Detection\n\n- `auto_role.enabled`: Enable automatic role detection (default: `true`)\n- `auto_role.mode`: Detection mode - `off`, `heuristic`, or `hybrid` (default: `hybrid`)\n  - `off`: Disable auto-detection, always use default role\n  - `heuristic`: Use fast local keyword matching only\n  - `hybrid`: Use heuristic first, fallback to LLM for ambiguous cases\n- `auto_role.keywords.\u003crole_name\u003e`: Custom keywords for role detection (see below)\n\n### Roles\n\nRoles define different interaction modes with their respective prompts. The available roles depend on what is configured in your configuration file. By default, the following roles are pre-configured:\n\n**Default Roles (Pre-configured):**\n- `roles.default`: General programming and system administration assistance\n- `roles.describe`: Command description and documentation\n- `roles.shell`: Shell command generation\n- `roles.code`: Code generation without descriptions\n- `roles.commit`: Generate conventional commit messages\n- `roles.branch`: Generate branch names\n\n**Custom Roles:**\nYou can add custom roles by adding `roles.\u003crole_name\u003e` keys to your configuration file. Any role defined in the configuration will be available for use.\n\n**YAML role directory and inheritance:** When `roles.directory` is set to a\ndirectory path, Gaia loads roles from YAML files in that directory (one role per\nfile). Roles can inherit from others with `extends: [\"base\", \"other-role\"]`.\nParent prompts are concatenated first (separator `---`), then the child’s;\nsignals, threshold, priority, weight, mode and exclusive are merged (child\noverrides when defined). Circular or missing parents cause a clear error.\nResolution runs once at load time. Optional: `roles.debug` (or CLI\n`--roles-debug`) prints resolution and scoring to stderr with prefix `[ROLES\nDEBUG]`.\n\n**Note:** The list of available roles is dynamic and depends on your configuration. Use `gaia config list` to see all configured roles in your setup.\n\n### Role Keywords (Auto-Detection)\n\nKeywords are used by the heuristic detection to identify the appropriate role. Default keywords are pre-configured for the default roles:\n\n**Pre-configured Keywords:**\n- `auto_role.keywords.shell`: Command-related keywords\n- `auto_role.keywords.code`: Programming-related keywords\n- `auto_role.keywords.describe`: Question/explanation keywords\n- `auto_role.keywords.commit`: Commit message keywords\n- `auto_role.keywords.branch`: Branch creation keywords\n\n**Custom Keywords:**\nYou can customize these keywords or add keywords for custom roles by adding `auto_role.keywords.\u003crole_name\u003e` keys to your configuration file. This allows auto-detection to work with your custom roles as well.\n\n### Tool Configuration\n\nTools allow you to execute external commands with AI-generated content. Example configuration:\n\n```yaml\ntools:\n  git:\n    commit:\n      context_command: \"git diff --staged\"\n      role: \"commit\"\n      execute_command: \"git commit -F {file}\"\n    branch:\n      context_command: \"git diff\"\n      role: \"branch\"\n      execute_command: \"git checkout -b {response}\"\n```\n\nTool configuration fields:\n- `context_command`: Command to run to gather context (optional)\n- `role`: Role to use for AI generation\n- `execute_command`: Command to execute with AI response (use `{file}` for multi-line, `{response}` for single-line)\n\n### Operator (Investigate) Configuration\n\nThe operator mode (`gaia investigate`) uses the following options (all under `operator.`):\n\n- `operator.max_steps`: Maximum number of steps per run (default: `10`)\n- `operator.confirm_medium_risk`: Ask for confirmation before running medium-risk commands (default: `true`)\n- `operator.dry_run`: If `true`, never execute commands; only show what would be run (default: `false`)\n- `operator.denylist`: List of forbidden command patterns (e.g. `[\"rm -rf\", \"sudo\", \"mkfs\"]`). Commands containing these are blocked.\n- `operator.allowlist`: Optional. If set, only commands that start with or contain one of these patterns are allowed (prefix or substring, case-insensitive; not regex). Example: `[\"df\", \"du\", \"find\"]`.\n- `operator.output_max_bytes`: Maximum length of command output per step (default: `4096`); longer output is truncated.\n- `operator.command_timeout_seconds`: Timeout in seconds for each shell command (default: `30`).\n- `operator.treat_exit_code_1_as_success`: When `true` (default), commands that exit with code 1 are treated as success and their output is returned (e.g. `git diff` with no changes). When `false`, exit code 1 is reported as an error. Useful if you want strict failure detection for all commands.\n\nExample in `config.yaml`:\n\n```yaml\noperator:\n  max_steps: 10\n  confirm_medium_risk: true\n  denylist:\n    - \"rm -rf\"\n    - \"sudo\"\n    - \"mkfs\"\n  allowlist: []   # leave empty to allow any command not on denylist\n  command_timeout_seconds: 30\n  treat_exit_code_1_as_success: true   # default: git diff with no changes (exit 1) is not an error\n```\n\n### Use an Alternative Configuration File\n\n```bash\ngaia --config /path/to/custom/config.yaml ask \"Hello!\"\n# or\nGAIA_CONFIG=/path/to/custom/config.yaml gaia ask \"Hello!\"\n```\n\n## Usage\n\n### Basic Commands\n\n```bash\n# Ask a question\ngaia ask \"What is the meaning of life?\"\n\n# Ask with piped input\necho \"Hello world\" | gaia ask \"Translate to French\"\ngit diff | gaia ask \"Generate commit message\"\n\n# Start an interactive chat session\ngaia chat\n\n# Check version\ngaia version\n\n# Investigate a goal (operator mode: runs tools, reasons, summarizes)\ngaia investigate \"Why is my disk full?\"\ngaia investigate --dry-run \"What's using the most space?\"\ngaia investigate --yes \"List large files in /tmp\"   # skip confirmation for medium-risk commands\ngaia investigate --debug \"Why is CPU high?\"         # show decisions and observations\n```\n\n### Configuration Management\n\n```bash\n# View all configuration settings\ngaia config list\n\n# Get specific configuration value\ngaia config get model\ngaia config get auto_role.enabled\n\n# Set configuration value\ngaia config set model llama2\ngaia config set host 127.0.0.1\ngaia config set port 8080\ngaia config set auto_role.mode heuristic\n\n# Show configuration file path\ngaia config path\n\n# Create default configuration file\ngaia config create\n\n# Trust local project overrides for current repository\ngaia config trust\n\n# Remove trust for current repository\ngaia config untrust\n\n# Show trust status for current repository\ngaia config trust --status\n\n# List all trusted repositories\ngaia config trusted\n\n# Show trust status for a specific path/repository\ngaia config trusted /path/to/repo\n```\n\n### Using Different Roles\n\nThe available roles depend on your configuration. By default, the following roles are available:\n\n```bash\n# Use default role (general assistance)\ngaia ask \"How do I create a new directory?\"\n\n# Explicitly specify a pre-configured role\ngaia ask --role describe \"ls -la\"\ngaia ask --role shell \"list files in current directory\"\ngaia ask --role code \"Hello world in Python\"\ngaia ask --role commit \"generate commit message\"\ngaia ask --role branch \"create branch name\"\n\n# Use a custom role (if configured)\ngaia ask --role my_custom_role \"custom prompt\"\n\n# Auto-detection (enabled by default)\ngaia ask \"generate git commit message\"  # Automatically detects \"commit\" role\ngaia ask \"create a new branch\"          # Automatically detects \"branch\" role\n```\n\n**Note:** To see all available roles in your configuration, use `gaia config list` and look for keys starting with `roles.`.\n\n### Auto-Role Detection\n\nWhen `auto_role.enabled` is `true` (default), Gaia automatically detects the appropriate role based on your message content:\n\n```bash\n# These will automatically use the appropriate role\ngaia ask \"what does ls -la do?\"           # → describe role\ngaia ask \"list files in directory\"        # → shell role\ngaia ask \"write a Python function\"        # → code role\ngit diff | gaia ask \"generate commit\"     # → commit role\n```\n\nUse `--debug` flag to see which role was detected and how:\n\n```bash\ngaia ask --debug \"generate commit message\"\n# [DEBUG] Auto-detected role: commit (method: heuristic, score: 0.85, reason: matched keywords)\n```\n\n### Cache Management\n\n```bash\n# View cache statistics\ngaia cache stats\n\n# List all cache entries\ngaia cache list\n\n# Dump all cached responses\ngaia cache dump\n\n# Clear the cache\ngaia cache clear\n\n# Bypass cache for a single command\ngaia --no-cache ask \"What is AI?\"\n\n# Refresh/overwrite cache entry\ngaia --refresh-cache ask \"What is AI?\"\n```\n\n### Global Flags\n\n- `--config, -c`: Path to alternative configuration file\n- `--no-cache`: Bypass local response cache for this command\n- `--refresh-cache`: Regenerate and overwrite cache entries\n- `--debug`: Enable debug output (shows role detection info)\n\n### Chat Mode\n\nThe chat mode provides an interactive session where you can have a continuous conversation with the model. The conversation history is maintained throughout the session, allowing the model to reference previous messages.\n\n```bash\n# Start a chat session\ngaia chat\n\n# Type your messages and press Enter\n# Type 'exit' to end the chat session\n```\n\n### Investigate (Operator Mode)\n\nThe **investigate** command runs an autonomous operator: it plans steps, runs shell commands (e.g. `df`, `du`, `find`), reasons over the results, and returns a summary or suggested actions. Safety is enforced via a denylist, optional allowlist, and confirmation for medium-risk commands.\n\n```bash\n# Investigate a goal (operator will run commands like df -h, du, etc.)\ngaia investigate \"Why is my disk full?\"\n\n# See what would be run without executing (dry-run)\ngaia investigate --dry-run \"What's using the most space?\"\n\n# Skip confirmation for medium-risk commands (e.g. touch, mkdir)\ngaia investigate --yes \"List large files in /tmp\"\n\n# Show plan, decisions, and tool results (debug)\ngaia investigate --debug \"Why is CPU high?\"\n\n# Limit the number of steps\ngaia investigate --max-steps 5 \"Quick disk check\"\n```\n\n**Flags:**\n\n- `--max-steps`, `-n`: Maximum number of operator steps (default: 10)\n- `--dry-run`: Do not execute commands; only show what would be run\n- `--yes`, `-y`: Skip confirmation for medium-risk commands\n- `--debug`: Print each decision (action, tool, args) and observation\n\n**Confirmation prompt (TUI):** When the operator needs your approval for a medium-risk command, Gaia shows an interactive confirmation screen in a real terminal: the proposed command in a styled box, then **y** or **Enter** to allow or **n** to decline. Content wraps to the terminal width. When not in a TTY, a simple line-based prompt is used.\n\n**Safety:** Commands containing `operator.denylist` entries (e.g. `sudo`, `rm -rf`) are always blocked. If `operator.allowlist` is set, only commands that start with or contain an allowlist entry (prefix/substring, case-insensitive) are allowed. Use `--dry-run` to preview behaviour without executing anything.\n\n### Tool Commands\n\nExecute configured tool actions that combine AI generation with external command execution:\n\n```bash\n# Execute a tool action\ngaia tool git commit\ngaia tool git branch \"add user authentication\"\n\n# The tool will:\n# 1. Run the context_command (if configured) to gather context\n# 2. Allow you to modify the context\n# 3. Generate content using the specified role\n# 4. Ask for confirmation\n# 5. Execute the execute_command with the generated content\n```\n\n**Interactive prompts (TUI):** When you run a tool in a real terminal (TTY), Gaia shows an interactive prompt:\n\n- **Context step:** Current context (e.g. `git diff`) is shown in a styled box. You can press **Enter** to use it as-is, type new text to replace it, **+text** to append, or **q** to quit. All content wraps to the terminal width.\n- **Confirmation step:** After the AI generates the message (e.g. commit text), a confirmation screen appears: **y** or **Enter** to confirm and run the command, **n** to cancel.\n\nWhen stdout is not a terminal (e.g. piping, CI), the same flow uses simple line-based prompts so scripts keep working.\n\n### Example Usage\n\n#### Basic Question\n\n```bash\n$ gaia ask \"What is the meaning of life?\"\nThe meaning of life is a philosophical question that has been debated for centuries...\n```\n\n#### Code Analysis with Piped Input\n\n```bash\n$ cat CVE-2021-4034.py | gaia ask \"Analyze and explain this code\"\nThis code is a Python script that exploits the CVE-2021-4034 vulnerability in Python...\n```\n\n#### Git Commit Message Generation\n\n```bash\n$ git diff --staged | gaia ask \"generate commit message\"\nfeat: add user authentication system\n\nImplement JWT-based authentication with login and registration endpoints.\nAdd password hashing using bcrypt and session management.\n```\n\n#### Branch Name Generation\n\n```bash\n$ git diff | gaia ask \"create branch name\"\nfeature/user-authentication\n```\n\n#### Using Tools\n\n```bash\n$ gaia tool git commit\n# Shows git diff, allows modification, generates commit message, asks confirmation, executes git commit\n```\n\n#### Investigate (Operator)\n\n```bash\n$ gaia investigate \"Why is my disk full?\"\n# Operator runs e.g. df -h, du, reasons over output, then returns a summary and suggested next steps.\n\n$ gaia investigate --dry-run \"What's using space in /var?\"\n# Same flow but no commands are executed; you see what would be run.\n```\n\n## API Providers\n\n### Ollama (Local - Default)\n\nOllama is the default provider for local AI models. Configure it by setting:\n\n```yaml\nhost: localhost\nport: 11434\nmodel: mistral  # or any model available in Ollama\n```\n\nFeatures:\n- Works completely offline\n- Automatic model pulling if not present\n- Progress bars during model download\n- No API key required\n\n### OpenAI (Remote)\n\nTo use OpenAI, configure:\n\n```yaml\nhost: api.openai.com\nport: 443\nmodel: gpt-4o-mini  # or gpt-4, gpt-3.5-turbo, etc.\n```\n\nAnd set the API key:\n\n```bash\nexport OPENAI_API_KEY=your-api-key-here\n```\n\nFeatures:\n- Access to OpenAI's latest models\n- Streaming responses\n- No local model storage required\n\n## Advanced Configuration Examples\n\n### Custom Role\n\nAdd a custom role to your configuration:\n\n```yaml\nroles:\n  custom:\n    \"You are a specialized assistant for [your domain]. Provide concise, technical answers.\"\n```\n\nOnce added, the role will be available for use:\n- Explicitly: `gaia ask --role custom \"your question\"`\n- Via auto-detection (if keywords are configured): `gaia ask \"your question\"` (will auto-detect if keywords match)\n\n### Custom Keywords for Auto-Detection\n\n```yaml\nauto_role:\n  enabled: true\n  mode: hybrid\n  keywords:\n    custom_role:\n      - \"keyword1\"\n      - \"keyword2\"\n      - \"phrase with multiple words\"\n```\n\n### Disable Auto-Role Detection\n\n```yaml\nauto_role:\n  enabled: false\n```\n\n### Use Heuristic-Only Detection\n\n```yaml\nauto_role:\n  enabled: true\n  mode: heuristic  # Fast, local-only detection\n```\n\n## Development\n\n### Project Structure\n\n- `api/`: API interaction, streaming, caching, and auto-role detection\n- `api/operator/`: Operator (investigate) loop: planner, tools, executor, safety\n- `commands/`: CLI command definitions\n- `config/`: Configuration management\n- `main.go`: Application entry point\n\n### Dependencies\n\n- [cobra](https://github.com/spf13/cobra): CLI framework\n- [viper](https://github.com/spf13/viper): Configuration management\n- [bubbletea](https://github.com/charmbracelet/bubbletea): Terminal UI framework (progress bars, interactive prompts)\n- [bubbles](https://github.com/charmbracelet/bubbles): TUI components (e.g. text input for context/edit prompts)\n- [lipgloss](https://github.com/charmbracelet/lipgloss): Styling and layout (boxes, colors, width-aware wrapping)\n\n### Running Tests\n\n```bash\ngo test -v ./...\n```\n\n### Code Quality\n\nThe project uses:\n- `go fmt` for formatting\n- `golangci-lint` for linting (version pinned in `.golangci-lint-version`; CI and pre-commit should use the same version)\n- `govulncheck` for vulnerability scanning of Go dependencies (run in CI and via pre-commit when Go files change)\n- `semgrep` for static analysis (run via pre-commit; uses `--config auto` from the Semgrep Registry)\n- `pre-commit` hooks for automated checks\n\n**Align with CI (recommended):** install the same golangci-lint version as CI so local lint matches:\n\n```bash\n# Version is in .golangci-lint-version\ngo install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(cat .golangci-lint-version)\n```\n\n**Optional (for the govulncheck pre-commit hook):** install govulncheck so the local hook can run:\n\n```bash\ngo install golang.org/x/vuln/cmd/govulncheck@latest\n```\n\nRun all checks:\n\n```bash\npre-commit run -a\n```\n\n**Dependency maintenance (run periodically):** check for known vulnerabilities and available updates:\n\n```bash\ngovulncheck ./...\ngo list -m -u all\n```\n\n## License\n\nThis project is licensed under the terms specified in the LICENSE file.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\nPlease ensure:\n\n- Code is formatted and linted\n- Tests are added or updated\n- Pre-commit hooks pass\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvonglasow%2Fgaia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvonglasow%2Fgaia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvonglasow%2Fgaia/lists"}