# Git URL Parser

Fuente conceptual: OpenViking `openviking/utils/code_hosting_utils.py` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Funciones a implementar

### 1. parse_git_url

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure
- **Signature:** `parse_git_url(url: str, known_hosts: list[str] | None = None) -> str | None`
- **Descripcion:** Parsea una URL de code hosting (GitHub, GitLab, etc.) y retorna el path `org/repo`. Soporta HTTP(S), SSH (git@), y git:// protocols.
- **Hosts conocidos por defecto:** `["github.com", "gitlab.com"]`
- **Algoritmo:**
  1. Si empieza con `git@`: extraer host:path, split por `:`, tomar primeros 2 segmentos, remover `.git`
  2. Si empieza con `http://`, `https://`, `git://`, `ssh://`: parsear con urlparse, verificar netloc en hosts, tomar primeros 2 segmentos del path
  3. Sanitizar org y repo: solo `[a-zA-Z0-9_-]`
  4. Retornar `org/repo` o None si no es valida
- **Deps:** `urllib.parse`
- **Tests:** URL HTTPS GitHub, URL SSH git@, URL con .git suffix, URL con path extra (issues/123), URL no reconocida

### 2. is_git_repo_url

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure
- **Signature:** `is_git_repo_url(url: str, known_hosts: list[str] | None = None) -> bool`
- **Descripcion:** Verifica estrictamente si una URL apunta a un repositorio git clonable (no a un issue, PR, file, etc.).
- **Algoritmo:**
  1. `git@`/`ssh://`/`git://`: si el dominio es conocido → True
  2. `http://`/`https://`: dominio conocido Y exactamente 2 segmentos de path (org/repo) → True
  3. Tambien acepta: org/repo/tree/<ref> (branch/commit)
  4. No acepta: org/repo/issues/123, org/repo/blob/main/file.py
- **Deps:** `urllib.parse`
- **Tests:** URL repo valida, URL de issue (False), URL de blob/file (False), URL con tree/branch (True)

### 3. validate_git_ssh_uri

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure
- **Signature:** `validate_git_ssh_uri(url: str) -> None`
- **Descripcion:** Valida formato de URI SSH de git (`git@host:path`). Raise ValueError si invalida.
- **Algoritmo:** Verificar que empieza con `git@`, contiene `:`, y tiene path no vacio despues del `:`
- **Deps:** ninguna
- **Tests:** URI valida, URI sin git@, URI sin colon, URI con path vacio
