diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d7397a5e..72c7670d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -486,7 +486,7 @@ jobs: exit 1 fi { - printf 'lich: a terminal-first ADE for the coding agents you already use\n\n' \ + printf 'lich: run your coding agents side by side, each on its own branch\n\n' \ "$GITHUB_REPOSITORY" "$GITHUB_REF_NAME" "$BANNER" cat body.md } > notes.md diff --git a/README.es.md b/README.es.md index 902ab2f4d..a222a2219 100644 --- a/README.es.md +++ b/README.es.md @@ -2,108 +2,128 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

Un ADE de terminal para los agentes de código que ya usas.

-

- Abre tus proyectos, corre agentes como Claude Code, Codex y opencode en - terminales de verdad y ten git (worktrees, diffs y pull requests) a la vista - sin salir de la ventana. Sin Electron y sin navegador: lich dibuja su propia - ventana nativa con Gio, en Linux, Windows y macOS. -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

- Cuatro sesiones de Claude Code una al lado de la otra en un mismo grupo, cada una en su propio git worktree; la barra lateral muestra cada una con su rama y su indicador de diff, y al pie los servicios del proyecto en marcha y el perfil; en el pie de ventana se ven la rama, el modelo y el plan - +

+ Tus agentes de código lado a lado, cada uno en su propia rama.
+ Claude Code, Codex, opencode o el agente que ya usas, cada uno en su propio worktree, todos en una sola ventana. +

+

Descargar lich · lichdotdev.github.io/lich

+ Cuatro sesiones de Claude Code una al lado de la otra en un mismo grupo, cada una en su propio git worktree. La barra lateral las lista con su rama y su indicador de diff, con los servicios en marcha del proyecto y el perfil al pie, y el pie de ventana muestra la rama, el modelo y el plan + -## Por qué lich - -lich te permite: - -- **Usar el agente que ya tienes.** [Claude Code](https://www.anthropic.com/claude-code), - [Codex](https://github.com/openai/codex), Antigravity, - [opencode](https://github.com/sst/opencode), oh-my-pi, - [Crush](https://github.com/charmbracelet/crush), el - [Cursor CLI](https://cursor.com/docs/cli) y el - [Kiro CLI](https://kiro.dev/docs/cli/) funcionan aquí todos igual. Le - indicas a lich una sola vez dónde está cada binario y después eliges el - predeterminado o uno distinto por sesión. Lo que lich consigue *leer* de una - sesión depende del proveedor; el detalle está en la tabla de - [Compatibilidad por proveedor](#compatibilidad-por-proveedor). -- **Tener una terminal de verdad.** Shells sobre PTY, varios por proyecto, - renderizados en la GPU, con un historial en el que puedes buscar y que - sobrevive a cerrar y volver a abrir la ventana. Lo que un proyecto mantiene en - marcha (un servidor de desarrollo, un túnel, un `lazydocker`) se guarda una - vez como servicio, que arrancas, detienes y lees desde el pie de la barra - lateral, y que puede arrancar junto con lich. El pie de ventana - sigue cada `cd` y muestra la rama. En una sesión de Claude Code, Codex o Kiro - CLI muestra además el modelo y la ventana de contexto en uso; con Claude Code, - Codex, Antigravity, Cursor CLI y una suscripción de OpenCode Go, cuánto te - queda de la ventana móvil del plan; y, si lo pides, cuánto lleva gastado la - sesión, en los proveedores que lo registran. -- **Poner una sesión a trabajar para otra.** Le pasas una tarea a otra tarjeta y - el agente de esa tarjeta te devuelve la respuesta, sea cual sea el agente de - cada lado: llega a las demás sesiones con herramientas que recibe al - arrancar (MCP en Claude Code y Codex) o que trae el plugin. Todo eso también - está disponible como el comando `lich` en cualquier shell, con `--json` - incluido, así que un script puede controlar una sesión sin ningún agente de - por medio ([`docs/cli.md`](docs/cli.md)). -- **Seguir varias a la vez.** Pon cualquier sesión en un grupo junto a la que - estás usando y lich acomoda los paneles por su cuenta, según cuántos sean y el - espacio que tenga la ventana: ocho sesiones quedan en filas de cuatro en un - monitor ultrawide y de dos en un portátil. Una sesión que delegó trabajo en - otras arma el grupo a su alrededor con un clic. Cada grupo tiene nombre, un - proyecto puede tener todos los que quieras, y cada uno aparece como un bloque - en la barra lateral que puedes plegar, renombrar o deshacer. -- **Crear un worktree sin preparar nada a mano.** Créalo a partir de cualquier - rama base y lich le copia tus archivos `.env*` ignorados por git y le asigna un - puerto para el servidor de desarrollo que no usa ningún otro checkout ni - ningún proceso de la máquina. Si partes de los cambios sin commitear del - checkout, se vienen con él, incluidos los archivos sin seguimiento. -- **Correr una sesión aislada.** Un agente puede abrirse dentro de un sandbox del - sistema operativo: un home nuevo y vacío, solo con el estado de ese proveedor, - el resto de la máquina en solo lectura y permiso de escritura únicamente en el - checkout para el que se abrió. Las claves ssh, las credenciales de la nube y - los demás repositorios del disco simplemente no están ahí, y eso compensa - dejar que el agente se salte las confirmaciones de permisos. En Linux usa - bubblewrap y en macOS `sandbox-exec`; no protege frente a código malicioso, y - [`docs/ceilings.md`](docs/ceilings.md) explica qué es lo que no frena. -- **Revisar el diff justo donde lo lees.** Un panel de diff muestra los - cambios del working tree junto a un árbol de archivos en vivo, pliega si se lo - pides los que solo tocan espacios en blanco, y muestra el antes y el después de - una imagen o un PDF modificado. Haz clic derecho sobre una selección para - comentar esas líneas; todo el lote se pega en la sesión como un solo prompt, - sin enviarlo. Su pestaña Código permite navegar el checkout y buscar en el - texto de sus archivos. -- **Llevar el pull request hasta el final sin salir de aquí.** Ve los pull - requests abiertos del repositorio, haz checkout de uno en su propio worktree, - lee el diff, revísalo inline y fusiónalo con los métodos que la rama base - acepta de verdad. En una rama que todavía no tiene pull request, **Crear con el - agente** le pide a la sesión de esa rama que lo abra, y no se envía nada hasta - que presiones Enter. - -Y además: [temas](docs/themes.md) que importas como JSON o instalas desde un -repositorio git, una paleta `Ctrl`/`Cmd`+`K` que te lleva a una sesión por su -nombre o por algo que se dijo en la conversación, una notificación de escritorio -cuando una sesión te está esperando, y `lich rage` / `lich doctor` para cuando -directamente no arranca. - -El proyecto está en desarrollo activo: los bugs y los pedidos de funciones van a -[Issues](https://github.com/lichdotdev/lich/issues), y lo que cambió en cada -versión está en [CHANGELOG.md](CHANGELOG.md). +## Funciones + + + + + + + + + + + + + + + + + + + + + + +
+ +### Agentes lado a lado + +Pon las sesiones en un grupo y lich acomoda los paneles por ti. Mira de un vistazo cuál está ocupada, cuál te está esperando y cuánto contexto le queda. + +Sesiones de Claude Code y Codex en un mismo grupo, cada una en su propia rama
+ +### Un worktree por tarea, sin preparar nada + +Crea una sesión a partir de cualquier rama base y lich le copia tus archivos `.env` y le asigna un puerto libre para el servidor de desarrollo. Tus cambios sin commitear pueden venir con ella. + +Sesiones en la barra lateral, cada una con su propia rama y su indicador de diff
+ +### Revisa el diff, comenta las líneas + +Lee lo que cambió el agente junto a su sesión, comenta las líneas que necesitan retoque y devuelve todas las notas como un solo prompt. + +Un diff con dos comentarios de línea en cola para enviar a la sesión
+ +### Pull requests sin el navegador + +Abre un pull request, pídele al agente de la rama que lo escriba, revísalo inline y fusiónalo, todo desde la misma ventana. + +Un pull request abierto en lich con su árbol de archivos, el diff y un comentario de revisión pendiente
+ +### Hazlo tuyo + +Importa un tema como JSON o instala uno desde un repositorio git. + +[Docs →](docs/themes.md) + +Los ajustes de Apariencia con el selector de tema, las fuentes y la disposición del pie de ventana
+ +Y además: + +- **Sesiones que delegan.** Un agente le pasa una tarea a otra sesión y recibe la respuesta. Lo mismo funciona desde tu shell con el comando `lich` ([docs](docs/cli.md)). +- **Agentes en sandbox.** Deja que un agente se salte las confirmaciones de permisos dentro de un sandbox que no ve tus claves, tus credenciales ni tus otros repositorios ([límites](docs/ceilings.md)). +- **Tus servidores de desarrollo en la barra lateral.** Guarda lo que un proyecto mantiene en marcha y arráncalo o detenlo con un clic. +- **Encuentra lo que sea.** `Ctrl`/`Cmd`+`K` te lleva a una sesión por su nombre o por algo que se dijo en ella. +- **Entérate cuando te necesitan.** Una notificación de escritorio cuando una sesión te está esperando. + +## Instalación + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +Una sola línea: detecta tu distro, verifica la descarga e instala lich con tu gestor de paquetes. + +| Plataforma | Cómo obtenerlo | +| --- | --- | +| **Linux** | el `install.sh` de arriba, o AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`). Necesita `zenity` y glibc 2.34 o posterior (Debian 12, Ubuntu 22.04, RHEL 9 y posteriores). | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | instalador o zip portable de [Releases](https://github.com/lichdotdev/lich/releases), o `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +Los binarios de macOS y Windows todavía no están firmados, así que Gatekeeper y +SmartScreen avisan al descargar desde Releases; Homebrew evita el aviso de +Gatekeeper. Los paquetes manuales por distro, el tarball de Linux, cómo quitar la +marca de cuarentena y cómo actualizar desde la fórmula antigua de Homebrew están +en [INSTALL.md](INSTALL.md). + +## Primeros pasos + +1. **Abre un proyecto.** El `+` de la barra de pestañas lista lo que cerraste + hace poco y abre un selector de carpetas. Apúntalo a un repositorio git. +2. **Elige tu agente.** La primera vez que lo abres, lista los agentes que + encontró en tu máquina. En Ajustes › Proveedores defines el predeterminado y + la ruta de cada binario. +3. **Inicia una sesión.** *Nueva sesión* abre tu agente en el proyecto. El `+` del + encabezado de un checkout abre cualquier agente, o una terminal sin agente, + en ese checkout. +4. **Dale un worktree** *(opcional)*. Créalo a partir de cualquier rama base y + lich abre una sesión nueva en él. ## Compatibilidad por proveedor -Todos los proveedores arrancan en una terminal de verdad, se reanudan por id de -conversación, se aíslan con el mismo sandbox y reciben la misma forma de llegar -a tus otras sesiones. Lo que cambia es lo que lich puede *leer* de cada sesión, -porque lee lo que cada CLI deja escrito, y no hay dos que registren lo mismo. +Todos los agentes corren en una terminal de verdad, reanudan su conversación, +funcionan en el sandbox y llegan a tus otras sesiones. Lo que cambia de uno a +otro es lo que lich puede *leer* de él, porque cada CLI deja escrito algo +distinto. + +
+Ver qué admite cada agente | Lo que obtienes | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -149,113 +169,59 @@ porque lee lo que cada CLI deja escrito, y no hay dos que registren lo mismo. | Se le indica al iniciarse, en el idioma de prompt, que reparta el trabajo como sesiones de lich en vez de subagentes ocultos | sí | no | no | no | sí | no | no | no | | La tarjeta de la sesión abre un navegador que el agente conduce, en una pestaña junto a la sesión | sí | sí | sí | la tarjeta lo abre; el agente usa `lich browser`, no las tools `browser_*` | sí | sí | sí | sí | -Ninguna de estas diferencias es un descuido, y en ningún caso lich se guarda -algo que el CLI informe; [`docs/ceilings.md`](docs/ceilings.md) cuenta qué se -midió detrás de cada una. - -## Instalación +
-Con una sola línea: el script detecta tu distro, verifica el checksum e instala -el paquete nativo y sus dependencias con tu gestor de paquetes: - -```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| Plataforma | Cómo obtenerlo | Necesita en ejecución | -| --- | --- | --- | -| **Linux** | el `install.sh` de arriba, o AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity`, además de glibc 2.34 o posterior para la ventana que viene en el paquete (Debian 12, Ubuntu 22.04, RHEL 9 y posteriores) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | nada, la ventana viene en la app tanto en Apple Silicon como en Intel | -| **Windows** | instalador o zip portable de [Releases](https://github.com/lichdotdev/lich/releases), o Scoop: `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | nada, la ventana viene con cada uno | - -Paquetes manuales por distro, el tarball de Linux y el zip portable de Windows: -[INSTALL.md](INSTALL.md). Los binarios de macOS y Windows no están firmados: -Gatekeeper y SmartScreen avisan hasta que lleguen la notarización y la firma. -Si instalas con Homebrew no ves el aviso de Gatekeeper; si descargas desde la -página de Releases, tienes que quitarle a mano la marca de cuarentena. -En macOS el cask instala `Lich.app`, así que lich tiene su propio icono en -`/Applications` y en el Dock mientras se ejecuta. Actualizar desde la fórmula -antigua requiere `brew uninstall lich` primero: [INSTALL.md](INSTALL.md) explica -por qué. - -## Primeros pasos - -1. **Instala** y abre `lich`. -2. **Abre un proyecto**: el `+` de la barra de pestañas lista lo que cerraste - hace poco y abre el selector de carpetas de tu sistema operativo; apúntalo a - un repositorio git. -3. **Indícale a lich tu agente**: la primera vez que lo abres, lista los agentes - que encontró en tu máquina; en Ajustes › Proveedores puedes definir la ruta de - cada binario y elegir el predeterminado. En esa misma pantalla, cada proyecto - puede usar ese predeterminado o elegir otro proveedor. -4. **Inicia una sesión**: *Nueva sesión* abre una terminal con tu agente - corriendo en el proyecto. El encabezado de cada checkout también tiene un menú - `+` para abrir cualquier proveedor habilitado, o una terminal sin agente, - justo en ese checkout; haz clic en el encabezado para contraer o expandir sus - sesiones. -5. **Crea un worktree** *(opcional)*: créalo a partir de cualquier rama base; - lich lo prepara y te deja en una sesión nueva. +Ninguna de estas diferencias es un descuido, y [`docs/ceilings.md`](docs/ceilings.md) +cuenta qué se midió detrás de cada una. ## Configuración -- **Proveedores**: en Ajustes › Proveedores defines la ruta del binario de cada - proveedor y el predeterminado para todos los proyectos. La fila del proyecto - abierto puede sobrescribir esa elección; **Borrar** quita esa excepción, así - que los cambios que hagas después en el predeterminado le llegan solos. Si no - defines ninguna ruta, la sesión ejecuta el primer binario del proveedor que - encuentre en el `PATH` de tu login shell; el bloque - Binario muestra qué archivo es y su versión, y lista cualquier otra versión que - haya en el `PATH`, algo de lo que `lich doctor` también avisa. Para quedarte - con una, pon su ruta en Binario (el ajuste `provider..bin`, p. ej. - `provider.codex.bin`). - La sección de cada proveedor empieza mostrando - cuánto te queda del plan, cuando lich puede leerlo. Lo que aparece en el pie de - ventana se elige en Ajustes › Apariencia arrastrando sus elementos; el costo - arranca oculto, porque esa cifra solo tiene sentido si pagas por token. -- **Worktrees**: con un archivo `.worktreeinclude` en el checkout del proyecto - eliges qué archivos ignorados por git se copian a cada worktree nuevo. -- **Hooks de sesión**: con el - [plugin de lich](https://github.com/lichdotdev/lich-plugin) instalado desde - Ajustes, cada sesión le pone título a su propia tarjeta y refresca el estado - de git en cuanto escribe un archivo. -- **Estabilidad**: en [docs/stability.md](docs/stability.md) está escrito en qué - partes de lich puedes apoyarte desde un script y cuáles pueden cambiar en - cualquier versión. +- **Proveedores.** En Ajustes › Proveedores defines la ruta del binario de cada + agente y el predeterminado para todos los proyectos; un proyecto puede elegir + el suyo. Si no defines ninguna ruta, lich ejecuta el primer binario que + encuentre en el `PATH` de tu login shell, y `lich doctor` avisa cuando hay más + de una versión. +- **Pie de ventana.** En Ajustes › Apariencia, arrastra sus elementos para elegir + qué muestra. El costo arranca oculto, porque esa cifra solo tiene sentido si + pagas por token. +- **Worktrees.** Con un archivo `.worktreeinclude` en el proyecto eliges qué + archivos ignorados por git se copian a cada worktree nuevo. +- **Hooks de sesión.** Instala el + [plugin de lich](https://github.com/lichdotdev/lich-plugin) desde Ajustes y + cada sesión le pone título a su propia tarjeta y refresca el estado de git en + cuanto escribe un archivo. +- **Scripts.** En [docs/stability.md](docs/stability.md) está escrito en qué + partes de lich puedes apoyarte desde un script. ## Privacidad y actualizaciones -Todo corre en tu máquina. Sin cuenta, sin login, sin telemetría: el backend es un -listener en loopback autenticado con token. Por iniciativa propia, lich solo se +Todo corre en tu máquina: sin cuenta, sin login, sin telemetría. lich solo se conecta a la red para esto: - **Actualizaciones**: consulta la última versión en GitHub Releases al arrancar - y cada hora, y la lista de versiones del plugin de lich en GitHub al arrancar. + y cada hora, y la lista de versiones del plugin de lich al arrancar. - **Uso del plan**: el endpoint de uso de cada proveedor (Anthropic, OpenAI, - Cursor, OpenCode Go), con el mismo login que ya usa el CLI de la sesión, como - mucho cada cinco minutos. El plan de Antigravity se lee del propio `agy`. + Cursor, OpenCode Go), con el mismo login que ya usa el agente, como mucho cada + cinco minutos. El plan de Antigravity se lee del propio `agy`. - **Precios**: la tabla pública de precios de LiteLLM en GitHub, una sola vez por cada modelo que no esté en la tabla que trae lich. -La versión del instalador de Windows se actualiza sola; si instalaste con -Homebrew, Scoop, AUR o un paquete de Linux, la actualización pasa por tu gestor -de paquetes y lich te da el comando. -Antes de que adjuntes el archivo de log a un reporte de bug, Ajustes › Ayuda te -dice qué contiene (rutas, nombres de proyectos y de ramas, tu login de gh, nunca -un token de sesión), y `lich rage` junta ese reporte en un solo archivo sin -subir nada a ningún lado. +El instalador de Windows se actualiza en el lugar; Homebrew, Scoop, AUR y los +paquetes de Linux se actualizan con su gestor de paquetes, y lich te da el +comando. ¿Algo no funciona? `lich doctor` revisa tu instalación y `lich rage` +junta un reporte de bug en un solo archivo sin subir nada. Antes de que adjuntes +el archivo de log, Ajustes › Ayuda te dice qué contiene (rutas, nombres de +proyectos y de ramas, tu login de gh, nunca un token de sesión). Los bugs y los +pedidos de funciones van a [Issues](https://github.com/lichdotdev/lich/issues); +lo que cambió en cada versión está en [CHANGELOG.md](CHANGELOG.md). ## Compilar desde el código fuente -lich son dos binarios. El backend, `lich`, es Go puro (Go 1.27, `CGO_ENABLED=0`, -un único binario estático) y sirve las sesiones a través de un listener en -loopback autenticado con token (RPC por HTTP + WebSockets). La ventana, -`lich-native`, es un módulo de Go propio en `native/`, compilado con cgo: -[Gio](https://gioui.org) la dibuja, `libghostty-vt` ejecuta sus terminales y -[godemirror](https://github.com/lichdotdev/godemirror) sus vistas de código y de -diff. Necesitas **Go 1.27.0+** y **[Task](https://taskfile.dev)**; la ventana -suma un toolchain de C, los paquetes de sistema de Gio y una `libghostty-vt` -compilada con Zig 0.16 desde el commit de Ghostty en `native/GHOSTTY_COMMIT`. -[`native/slice.sh`](native/slice.sh) explica cómo compilarla, y +lich son dos binarios: `lich`, un backend estático en Go puro, y `lich-native`, +la ventana, compilada con cgo desde `native/`. Necesitas **Go 1.27.0+** y +**[Task](https://taskfile.dev)**; la ventana suma un toolchain de C, los +paquetes de sistema de Gio y una `libghostty-vt` compilada desde el commit en +`native/GHOSTTY_COMMIT`. [`native/slice.sh`](native/slice.sh) explica cómo, y [`docs/native-window.md`](docs/native-window.md) describe la ventana. ```bash @@ -263,18 +229,11 @@ task build # binario del backend -> bin/lich task build:native # ventana -> bin/lich-native task run # compila + ejecuta task test # suites de Go +task package # .deb + .rpm + Arch .pkg.tar.zst en bin/ (requiere nfpm) ``` -Para empaquetar una versión de Linux en local (requiere -[nfpm](https://nfpm.goreleaser.com/)): - -```bash -task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ -``` - -Sumar otro CLI de agente a los ocho que ya corre lich es un cambio que toca una -docena de archivos repartidos en dos repositorios; el mapa está en -[`docs/adding-a-provider.md`](docs/adding-a-provider.md). +Sumar otro agente toca una docena de archivos repartidos en dos repositorios: +[`docs/adding-a-provider.md`](docs/adding-a-provider.md) es el mapa. ## Patrocinadores diff --git a/README.ja.md b/README.ja.md index bef67d470..13b82bb78 100644 --- a/README.ja.md +++ b/README.ja.md @@ -2,97 +2,124 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

いま使っているコーディングエージェントのための、ターミナル中心の ADE

-

- プロジェクトを開いて、Claude Code、Codex、opencode などのエージェントを実際のターミナルで動かせます。 - ワークツリー、差分、プルリクエストといった git の状態も、同じウィンドウで確認できます。 - Electron もブラウザも使っていません。Linux、Windows、macOS のどれでも、lich は Gio で - 描いた自前のネイティブウィンドウで開きます。 -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ コーディングエージェントを並べて、ブランチごとに動かす。
+ Claude Code、Codex、opencode など、いま使っているエージェントを、それぞれ専用のワークツリーで、ひとつのウィンドウに。 +

+

lich をダウンロード · lichdotdev.github.io/lich

1つの分割画面に並んだ4つの Claude Code セッション。それぞれ専用の git ワークツリーで動いています。サイドバーには各セッションがブランチと差分バッジ付きで並び、その下にプロジェクトで動いているサービスとプロファイルがあります。フッターにはブランチ、モデル、プランが表示されています - + -## なぜ lich なのか - -lich でできることは次のとおりです。 - -- **手元のエージェントをそのまま使えます。** [Claude Code](https://www.anthropic.com/claude-code)、 - [Codex](https://github.com/openai/codex)、Antigravity、 - [opencode](https://github.com/sst/opencode)、oh-my-pi、 - [Crush](https://github.com/charmbracelet/crush)、 - [Cursor CLI](https://cursor.com/docs/cli)、 - [Kiro CLI](https://kiro.dev/docs/cli/) のどれも、同じように動かせます。 - 各バイナリの場所を一度 lich に教えれば、あとは既定のプロバイダーを決めておくことも、 - セッションごとに選ぶこともできます。セッションから lich が読み取れる情報はプロバイダーによって違い、 - 詳しくは[プロバイダー対応状況](#プロバイダー対応状況)の表にまとめています。 -- **ターミナルは実際のターミナルのままです。** PTY ベースのシェルをプロジェクトごとにいくつでも開け、 - 描画は GPU で行います。スクロールバックは検索でき、ウィンドウを閉じて開き直しても消えません。 - 開発サーバーやトンネル、`lazydocker` のようにプロジェクトで動かし続けるものは、 - 一度サービスとして保存すれば、サイドバーの下から起動・停止し、出力を読めます。 - lich と一緒に起動させることもできます。フッターは `cd` に合わせて今のブランチを表示します。 - Claude Code、Codex、Kiro CLI のセッションでは、使用中のモデルとコンテキストウィンドウも出ます。 - Claude Code、Codex、Antigravity、Cursor CLI、OpenCode Go のサブスクリプションなら、 - プランのローリングウィンドウの残りも表示します。 - 有効にすれば、費用を記録するプロバイダーではセッションで使った金額も表示します。 -- **セッション同士で仕事を頼み合えます。** 別のカードにタスクを渡すと、 - そのカードのエージェントが答えを返してきます。どちら側でどのエージェントが動いていても同じです。 - エージェントは、起動時に渡されるツール(Claude Code と Codex では MCP)か、 - プラグインが追加するツールを使ってほかのセッションとやり取りします。同じ機能はすべて - どのシェルからでも `lich` コマンドとして使え、`--json` にも対応しています。 - そのため、エージェントを介さずにスクリプトからセッションを操作することもできます - ([`docs/cli.md`](docs/cli.md))。 -- **複数のセッションを並べて見られます。** どのセッションでも、今のセッションの隣に並べて分割表示できます。 - 配置はペインの数とウィンドウの広さに合わせて lich が自動で決めます。8つのペインなら、 - ウルトラワイドでは横に4列、ノートPCでは横に2列です。ほかのセッションに仕事を頼んだセッションからは、 - ワンクリックで頼んだ相手をまとめた分割を作れます。分割には名前を付けられ、 - プロジェクトごとにいくつでも作れます。サイドバーには分割ごとにブロックが表示され、 - 折りたたみ、名前の変更、解除ができます。 -- **手間なくワークツリーで作業を分けられます。** どのベースブランチからでもワークツリーを作れます。 - lich が gitignore 対象の `.env*` ファイルをコピーし、ほかのチェックアウトもマシン上のプロセスも - 使っていない開発サーバー用のポートを割り当てます。 - チェックアウトの未コミットの変更から始めれば、未追跡のファイルも含めてその変更が引き継がれます。 -- **セッションをサンドボックスに閉じ込めて動かせます。** エージェントを OS のサンドボックス内で起動できます。 - ホームディレクトリはそのプロバイダー自身の状態だけが入った新しい空のものになり、 - 書き込めるのは起動したチェックアウトだけで、それ以外はすべて読み取り専用です。ssh キーも、クラウドの認証情報も、 - ディスク上のほかのリポジトリも、そもそも見えません。エージェントに権限確認を - スキップさせるなら、その分の歯止めになります。Linux では bubblewrap、macOS では `sandbox-exec` を使います。 - ただし悪意のあるコードを防ぐための仕組みではありません。防げないことは - [`docs/ceilings.md`](docs/ceilings.md) にまとめています。 -- **差分は読むその場でレビューできます。** 差分パネルに、作業中の変更が - リアルタイムに更新されるファイルツリーと並んで表示されます。必要なら空白だけの変更を折りたため、 - 画像や PDF の変更は変更前と変更後で見比べられます。選択範囲を右クリックするとその行にコメントでき、 - コメントはまとめて1つのプロンプトとしてセッションに貼り付けられます(送信は手動です)。 - 「コード」タブでは、チェックアウト内のファイルを閲覧し、本文を検索できます。 -- **プルリクエストもここで仕上げられます。** リポジトリのオープンなプルリクエストを一覧し、 - 専用のワークツリーにチェックアウトして、差分を読み、インラインでレビューし、 - ベースブランチで許可されているマージ方法でマージできます。まだプルリクエストがないブランチでは、 - **エージェントで作成** を押すと、そのブランチのセッションにプルリクエストの作成を依頼します。 - Enter を押すまでは何も送信されません。 - -ほかにも、JSON でインポートしたり git リポジトリからインストールしたりできる[テーマ](docs/themes.md)、 -名前や会話の内容からセッションにジャンプできる `Ctrl`/`Cmd`+`K` パレット、 -入力待ちのセッションを知らせるデスクトップ通知、 -lich がまったく起動しないときのための `lich rage` / `lich doctor` があります。 - -開発は活発に続いています。バグ報告や機能要望は -[Issues](https://github.com/lichdotdev/lich/issues) にお願いします。各バージョンの変更点は -[CHANGELOG.md](CHANGELOG.md) にあります。 +## 機能 + + + + + + + + + + + + + + + + + + + + + + +
+ +### エージェントを並べて動かす + +セッションを分割画面に置けば、ペインの配置は lich が決めます。どのセッションが作業中で、どれがあなたの返事を待っていて、コンテキストがどれだけ残っているかが、ひと目でわかります。 + +1つの分割画面に並んだ Claude Code と Codex のセッション。それぞれ別のブランチで動いています
+ +### タスクごとのワークツリー、準備はいりません + +好きなベースブランチからセッションを分岐すると、lich が `.env` ファイルをコピーし、空いている開発サーバー用のポートを割り当てます。コミット前の作業も持ち込めます。 + +サイドバーに並んだセッション。それぞれ専用のブランチと差分バッジが付いています
+ +### 差分を読んで、行にコメントする + +エージェントが変更した内容をセッションの隣で読み、直したい行にコメントして、すべてのメモを1つのプロンプトとして送り返せます。 + +セッションへの送信待ちの行コメントが2つ付いた差分
+ +### ブラウザなしでプルリクエスト + +プルリクエストを開き、そのブランチのエージェントに書いてもらい、インラインでレビューして、マージするまで、同じウィンドウで完結します。 + +lich で開いたプルリクエスト。ファイルツリー、差分、保留中のレビューコメントが表示されています
+ +### 自分好みに + +テーマを JSON でインポートするか、git リポジトリからインストールできます。 + +[ドキュメント →](docs/themes.md) + +外観の設定画面。テーマの選択、フォント、フッターのレイアウトが表示されています
+ +ほかにも、こんなことができます。 + +- **仕事を任せ合うセッション。** あるエージェントが別のセッションにタスクを渡し、答えを受け取れます。シェルからも `lich` コマンドで同じことができます([ドキュメント](docs/cli.md))。 +- **サンドボックス内のエージェント。** ssh キーも認証情報もほかのリポジトリも見えないサンドボックスの中なら、エージェントに権限確認をスキップさせても安心です([限界](docs/ceilings.md))。 +- **開発サーバーをサイドバーに。** プロジェクトで動かし続けるものを保存しておけば、ワンクリックで起動・停止できます。 +- **なんでも見つかる。** `Ctrl`/`Cmd`+`K` で、名前やセッション内で話した内容からセッションにジャンプできます。 +- **出番がわかる。** セッションがあなたの入力を待っているときは、デスクトップ通知が届きます。 + +## インストール + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +1行で、ディストリビューションを判別し、ダウンロードを検証して、パッケージマネージャーで lich をインストールします。 + +| プラットフォーム | 入手方法 | +| --- | --- | +| **Linux** | 上記の `install.sh`、または AUR の [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`)。`zenity` と glibc 2.34 以上が必要です(Debian 12、Ubuntu 22.04、RHEL 9 以降)。 | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | [Releases](https://github.com/lichdotdev/lich/releases) のインストーラーまたはポータブル zip、または `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +macOS と Windows のビルドはまだ署名されていないため、Releases からダウンロードすると +Gatekeeper や SmartScreen の警告が出ます。Homebrew でインストールすれば Gatekeeper の確認は出ません。 +ディストリビューション別のパッケージ、Linux の tarball、quarantine 属性の外し方、 +古い Homebrew formula からのアップグレードは [INSTALL.md](INSTALL.md) にあります。 + +## はじめに + +1. **プロジェクトを開きます。** タブバーの `+` を押すと、最近閉じたプロジェクトの一覧と + フォルダー選択ダイアログが出ます。git リポジトリを選んでください。 +2. **使うエージェントを選びます。** 初回起動時に、マシン上で見つかったエージェントが一覧されます。 + 設定 › プロバイダーで、既定のエージェントと各バイナリのパスを設定できます。 +3. **セッションを開始します。** *新規セッション* で、プロジェクト内でエージェントが開きます。 + 各チェックアウトのヘッダーにある `+` からは、好きなエージェントや通常のターミナルを、そのチェックアウトで開けます。 +4. **ワークツリーを作ります** *(任意)*。どのベースブランチからでも作成でき、 + lich がそのワークツリーで新しいセッションを開きます。 ## プロバイダー対応状況 -どのプロバイダーも、実際のターミナルで起動し、会話 ID で再開でき、同じサンドボックスで隔離できます。 -ほかのセッションとやり取りする手段も同じものが渡されます。違うのは、lich がセッションから何を*読み取れる*かです。 -lich は各 CLI が書き出す情報を読んでいて、何を書き出すかは CLI ごとにばらばらだからです。 +どのエージェントも、実際のターミナルで動き、会話を再開でき、サンドボックスで隔離でき、 +ほかのセッションにも届きます。違うのは、lich がセッションから何を*読み取れる*かです。 +各 CLI が記録する情報がそれぞれ異なるためです。 + +
+各エージェントの対応状況を見る | 得られるもの | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -138,98 +165,55 @@ lich は各 CLI が書き出す情報を読んでいて、何を書き出すか | 起動時に、見えないサブエージェントではなく lich セッションに作業を振り分けるよう、プロンプト言語で指示される | あり | なし | なし | なし | あり | なし | なし | なし | | セッションのカードが、エージェントが操作するブラウザをセッションの隣のタブに開く | あり | あり | あり | カードは開く。エージェントは `browser_*` ではなく `lich browser` を使う | あり | あり | あり | あり | -「なし」はどれも意図したもので、CLI が出している情報を lich が隠しているわけではありません。 -それぞれについて何を検証したかは [`docs/ceilings.md`](docs/ceilings.md) にまとめています。 +
-## インストール - -次のコマンド1行で、スクリプトがディストリビューションを判別し、チェックサムを検証したうえで、 -パッケージマネージャー経由でネイティブパッケージと依存パッケージをインストールします。 - -```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| プラットフォーム | 入手方法 | 実行時に必要なもの | -| --- | --- | --- | -| **Linux** | 上記の `install.sh`、または AUR の [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity`。パッケージに同梱のウィンドウを動かすために glibc 2.34 以上も必要です(Debian 12、Ubuntu 22.04、RHEL 9 以降) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | 不要。ウィンドウはアプリに同梱されており、Apple Silicon でも Intel でも動きます | -| **Windows** | [Releases](https://github.com/lichdotdev/lich/releases) のインストーラーまたはポータブル zip、または Scoop:`scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | 不要。どちらにもウィンドウが同梱されています | - -ディストリビューション別のパッケージを手動で入れる方法、Linux の tarball、Windows のポータブル zip は -[INSTALL.md](INSTALL.md) にあります。macOS と Windows のバイナリは署名されていないため、 -公証と署名に対応するまでは Gatekeeper と SmartScreen の警告が出ます。 -Homebrew でインストールすれば Gatekeeper の確認は出ませんが、 -Releases ページからダウンロードした場合は、quarantine 属性を手動で外す必要があります。 -macOS ではこの cask が `Lich.app` をインストールするので、`/Applications` にも、 -起動中の Dock にも lich のアイコンが表示されます。古い formula からアップグレードする場合は、 -先に `brew uninstall lich` を実行してください。理由は [INSTALL.md](INSTALL.md) に書いてあります。 - -## はじめに - -1. lich を**インストール**して起動します。 -2. **プロジェクトを開きます。** タブバーの `+` を押すと、最近閉じたプロジェクトの一覧と - OS のフォルダー選択ダイアログが出るので、git リポジトリを選びます。 -3. **使うエージェントを lich に設定します。** 初回起動時に、マシン上で見つかったエージェントが一覧されます。 - 設定 › プロバイダーで、各バイナリのパスと既定のプロバイダーを設定できます。 - プロジェクトごとに、既定に従うか別のプロバイダーを使うかも同じ画面で選べます。 -4. **セッションを開始します。** *新規セッション* で、プロジェクト内でエージェントが動くターミナルが開きます。 - 各チェックアウトのヘッダーにも `+` メニューがあり、有効なプロバイダーや通常のターミナルを - そのチェックアウトで直接開けます。ヘッダー自体をクリックすると、そのチェックアウトのセッションを折りたたんだり展開したりできます。 -5. **ワークツリーを作ります** *(任意)*。どのベースブランチからでも作成でき、 - lich が準備を済ませたうえで新しいセッションが開きます。 +どの「なし」もすべて意図したもので、それぞれの裏にある計測結果は +[`docs/ceilings.md`](docs/ceilings.md) にまとめています。 ## 設定 -- **プロバイダー**:設定 › プロバイダーで、各プロバイダーのバイナリパスと、 - 全プロジェクト共通の既定を設定します。開いているプロジェクトの行で、その選択を上書きできます。 - **クリア** で上書きを外せば、その後の既定の変更が自動で反映されます。 - パスを設定していない場合、セッションはログインシェルの `PATH` で最初に見つかったそのプロバイダーのバイナリを実行します。 - 「バイナリ」ブロックにそのファイルとバージョンが表示され、 - `PATH` 上にあるほかのバージョンも一覧されます(`lich doctor` もこれを警告します)。 - 特定のバイナリを使うには、「バイナリ」にそのパスを設定します - (設定名は `provider..bin`、例:`provider.codex.bin`)。 - lich がプランの残量を読み取れるプロバイダーでは、そのセクションの先頭に残量が表示されます。 - フッターに表示する項目は、設定 › 外観で項目をドラッグして決めます。 +- **プロバイダー**:設定 › プロバイダーで、各エージェントのバイナリと全プロジェクト共通の既定を + 設定します。プロジェクトごとに別のものを選ぶこともできます。パスを設定していない場合、 + lich はログインシェルの `PATH` で最初に見つかったバイナリを実行し、 + 複数のバージョンがあると `lich doctor` が警告します。 +- **フッター**:設定 › 外観で、項目をドラッグして表示する内容を決めます。 費用はトークン単位で課金される場合にしか意味のない数値なので、初期状態では非表示です。 -- **ワークツリー**:gitignore 対象のファイルのうちどれを新しいワークツリーにコピーするかは、 - プロジェクトのチェックアウトに置いた `.worktreeinclude` ファイルで調整できます。 +- **ワークツリー**:プロジェクトに置いた `.worktreeinclude` ファイルで、 + gitignore 対象のファイルのうちどれを新しいワークツリーにコピーするかを選べます。 - **セッションフック**:設定から [lich プラグイン](https://github.com/lichdotdev/lich-plugin)を - インストールすると、セッションが自分のカードにタイトルを付け、 + インストールすると、セッションが自分のカードに名前を付け、 ファイルを書き込んだ時点で git の状態が更新されるようになります。 -- **安定性**:lich のどの部分をスクリプトから使っても安全か、どの部分がリリースごとに変わりうるかは、 +- **スクリプト連携**:lich のどの部分をスクリプトから使っても安全かは、 [docs/stability.md](docs/stability.md) にまとめています。 ## プライバシーと更新 すべて手元のマシン上で動きます。アカウントもサインインもテレメトリもありません。 -バックエンドはトークン認証付きのループバックリスナーです。lich が自分からネットワークに接続するのは、 -次の場合だけです。 +lich が自分からネットワークに接続するのは、次の場合だけです。 - **更新**:起動時と以後1時間ごとに、GitHub Releases で新しいバージョンを確認します。 - 起動時には、GitHub から lich プラグインのリリース一覧も取得します。 + 起動時には、lich プラグインのリリース一覧も取得します。 - **プランの使用量**:各プロバイダーの使用量エンドポイント(Anthropic、OpenAI、Cursor、 - OpenCode Go)に、セッションの CLI がすでに使っているログインで問い合わせます。頻度は多くても5分に1回です。 + OpenCode Go)に、エージェントがすでに使っているログインで問い合わせます。頻度は多くても5分に1回です。 Antigravity のプランは `agy` から直接読み取ります。 - **価格**:同梱の価格表にないモデルがあると、GitHub 上の LiteLLM の公開価格表を一度だけ取得します。 Windows インストーラー版はその場で更新されます。Homebrew、Scoop、AUR、 Linux のパッケージでインストールした場合はそれぞれのパッケージマネージャーで更新し、 実行するコマンドは lich が表示します。 -ログファイルをバグ報告に添付する前に、何が含まれているか -(パス、プロジェクト名とブランチ名、gh のログイン名。セッショントークンは含まれません)を設定 › ヘルプで確認できます。 -`lich rage` はその報告を1つのアーカイブにまとめるだけで、どこにもアップロードしません。 +うまく動かないときは、`lich doctor` でセットアップを確認でき、`lich rage` はバグ報告用の情報を +1つのアーカイブにまとめます(どこにもアップロードしません)。 +ログに何が含まれているか(パス、プロジェクト名とブランチ名、gh のログイン名。セッショントークンは含まれません)は、 +添付する前に設定 › ヘルプで確認できます。バグ報告や機能要望は +[Issues](https://github.com/lichdotdev/lich/issues) にお願いします。各バージョンの変更点は +[CHANGELOG.md](CHANGELOG.md) にあります。 ## ソースからのビルド -lich は2つのバイナリでできています。バックエンドの `lich` は純粋な Go(Go 1.27、 -`CGO_ENABLED=0`、静的バイナリ1つ)で、トークン認証付きのループバックリスナー -(HTTP RPC と WebSocket)経由でセッションを配信します。ウィンドウの `lich-native` は -`native/` にある独立した Go モジュールで、cgo でビルドします。描画は [Gio](https://gioui.org)、 -ターミナルは `libghostty-vt`、コードと差分の画面は [godemirror](https://github.com/lichdotdev/godemirror) -が担います。必要なのは **Go 1.27.0 以降** と **[Task](https://taskfile.dev)** で、 -ウィンドウにはさらに C ツールチェーン、Gio のシステムパッケージ、そして `native/GHOSTTY_COMMIT` に -記された Ghostty のコミットから Zig 0.16 でビルドした `libghostty-vt` が必要です。 +lich は2つのバイナリでできています。静的な純粋 Go のバックエンド `lich` と、 +`native/` から cgo でビルドするウィンドウ `lich-native` です。必要なのは **Go 1.27.0 以降** と +**[Task](https://taskfile.dev)** で、ウィンドウにはさらに C ツールチェーン、Gio のシステムパッケージ、 +そして `native/GHOSTTY_COMMIT` に記されたコミットからビルドした `libghostty-vt` が必要です。 ビルド方法は [`native/slice.sh`](native/slice.sh)、ウィンドウの詳細は [`docs/native-window.md`](docs/native-window.md) にあります。 @@ -238,18 +222,11 @@ task build # バックエンドのバイナリ -> bin/lich task build:native # ウィンドウ -> bin/lich-native task run # ビルドして実行 task test # Go のテストスイート +task package # .deb + .rpm + Arch .pkg.tar.zst を bin/ に出力(nfpm が必要) ``` -Linux のリリースパッケージをローカルで作るには、次のコマンドを実行します -([nfpm](https://nfpm.goreleaser.com/) が必要です)。 - -```bash -task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ -``` - -lich が対応する8つのエージェント CLI に新しく1つ加えるのは、2つのリポジトリにまたがって -十数個のファイルに手を入れる変更です。どこを触るかは -[`docs/adding-a-provider.md`](docs/adding-a-provider.md) にまとめています。 +エージェントを新しく1つ加えるのは、2つのリポジトリにまたがって十数個のファイルに手を入れる変更です。 +どこを触るかは [`docs/adding-a-provider.md`](docs/adding-a-provider.md) にまとめています。 ## スポンサー diff --git a/README.ko.md b/README.ko.md index bef200736..a830efb26 100644 --- a/README.ko.md +++ b/README.ko.md @@ -2,97 +2,124 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

이미 쓰고 있는 코딩 에이전트를 위한 터미널 중심 ADE.

-

- 프로젝트를 열고, Claude Code, Codex, opencode 같은 에이전트를 실제 터미널에서 - 실행하고, worktree와 diff, 풀 리퀘스트까지 git 작업을 창을 벗어나지 않고 한눈에 - 볼 수 있습니다. Electron도 브라우저도 쓰지 않습니다. Linux, Windows, macOS 모두에서 - lich는 Gio로 직접 그리는 네이티브 창으로 열립니다. -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ 코딩 에이전트를 나란히, 각자 자기 브랜치에서.
+ Claude Code, Codex, opencode 등 이미 쓰고 있는 에이전트를 각자 자기 worktree에서, 모두 한 창에서 실행하세요. +

+

lich 다운로드 · lichdotdev.github.io/lich

분할 화면 하나에 나란히 띄운 Claude Code 세션 4개와 각 세션의 git worktree. 사이드바에는 세션별 브랜치와 diff 배지, 맨 아래에 프로젝트에서 실행 중인 서비스와 프로필이 있고, 하단 바에는 브랜치와 모델, 플랜이 보입니다 - + -> 이 문서는 영문 [README.md](README.md)를 번역한 것입니다. 기준은 영문판이며, 두 문서의 내용이 다르면 영문판을 따릅니다. - -## 왜 lich인가 - -lich로 할 수 있는 일: - -- **이미 쓰고 있는 에이전트를 그대로 실행합니다.** [Claude Code](https://www.anthropic.com/claude-code), - [Codex](https://github.com/openai/codex), Antigravity, - [opencode](https://github.com/sst/opencode), oh-my-pi, - [Crush](https://github.com/charmbracelet/crush), - [Cursor CLI](https://cursor.com/docs/cli), - [Kiro CLI](https://kiro.dev/docs/cli/) 모두 같은 방식으로 실행됩니다. 바이너리 경로를 - 한 번씩만 지정해 두면 기본값을 쓰거나 세션마다 골라 쓸 수 있습니다. 세션에서 lich가 - *읽어 올* 수 있는 정보는 프로바이더마다 다르며, - [프로바이더 지원](#프로바이더-지원) 표에 정리해 두었습니다. -- **실제 터미널을 그대로 씁니다.** 프로젝트마다 PTY 기반 셸을 여러 개 띄울 수 있고, - 렌더링은 GPU가 맡습니다. 스크롤백은 검색할 수 있고 창을 닫았다가 다시 열어도 - 사라지지 않습니다. 개발 서버, 터널, `lazydocker`처럼 프로젝트에서 계속 띄워 두는 - 것은 한 번 서비스로 저장해 두면 사이드바 아래에서 시작하고 멈추고 출력을 볼 수 - 있으며, lich와 함께 시작되게 할 수도 있습니다. 하단 바는 `cd`를 따라가며 브랜치를 보여 줍니다. - Claude Code, Codex, Kiro CLI 세션이라면 사용 중인 모델과 컨텍스트 윈도우를, Claude - Code, Codex, Antigravity, Cursor CLI와 OpenCode Go 구독이라면 플랜의 롤링 윈도우가 - 얼마나 남았는지를 보여 주고, 원하면 세션에서 쓴 비용도 표시합니다(비용을 기록하는 - 프로바이더만 해당). -- **한 세션에 다른 세션의 일을 맡깁니다.** 다른 카드에 작업을 넘기면 양쪽에서 무엇이 - 돌고 있든 그 카드의 에이전트가 직접 답을 써서 돌려줍니다. 에이전트는 세션을 시작할 때 - 받은 도구(Claude Code와 Codex는 MCP)나 플러그인이 제공하는 도구로 다른 세션에 - 접근합니다. 이 기능은 전부 어느 셸에서나 `lich` 명령으로도 쓸 수 있고 `--json`도 - 지원하므로, 에이전트 없이 스크립트만으로 세션을 조작할 수 있습니다([`docs/cli.md`](docs/cli.md)). -- **여러 세션을 한꺼번에 지켜봅니다.** 지금 보고 있는 세션 옆 분할 화면에 어떤 세션이든 - 올려 두면 패널 수와 창 크기에 맞춰 lich가 알아서 배치합니다. 세션 8개라면 울트라와이드 - 모니터에서는 한 줄에 4개씩, 노트북에서는 2개씩 놓입니다. 다른 세션에 일을 넘긴 세션은 - 클릭 한 번으로 자신을 중심으로 분할 화면을 구성합니다. 분할 화면마다 이름이 붙고, - 프로젝트 하나에 원하는 만큼 둘 수 있으며, 사이드바에 생기는 블록에서 접거나 이름을 - 바꾸거나 해체할 수 있습니다. -- **번거로운 설정 없이 worktree를 만듭니다.** 원하는 베이스 브랜치에서 worktree를 만들면 - lich가 gitignore된 `.env*` 파일을 채워 넣고, 다른 체크아웃도 머신의 다른 프로세스도 - 쓰지 않는 개발 서버 포트를 배정합니다. 체크아웃의 커밋하지 않은 작업에서 시작하면 untracked 파일을 - 포함한 변경 사항도 함께 옮겨 갑니다. -- **세션을 격리해서 실행합니다.** 에이전트를 OS 샌드박스 안에서 열 수 있습니다. 해당 - 프로바이더의 상태만 담긴 빈 홈 디렉터리가 새로 주어지고, 머신의 나머지 부분은 읽기 - 전용이며, 쓰기는 세션을 연 체크아웃에만 허용됩니다. ssh 키, 클라우드 자격 증명, - 디스크에 있는 다른 저장소는 샌드박스 안에서 아예 보이지 않습니다. 에이전트가 권한 - 확인을 건너뛰도록 허용할 때 위험을 상쇄해 주는 장치입니다. Linux에서는 bubblewrap, - macOS에서는 `sandbox-exec`를 씁니다. 악성 코드를 막아 주는 보안 경계는 아니며, 무엇을 - 막지 못하는지는 [`docs/ceilings.md`](docs/ceilings.md)에 정리되어 있습니다. -- **diff를 읽는 바로 그 자리에서 리뷰합니다.** diff 독이 작업 중인 변경 사항을 - 실시간 파일 트리 옆에 보여 줍니다. 원하면 공백만 바뀐 변경은 접어 두고, 바뀐 이미지나 - PDF는 변경 전후를 함께 보여 줍니다. 선택 영역을 우클릭하면 해당 줄에 코멘트를 달 수 - 있고, 모아 둔 코멘트는 프롬프트 하나로 묶여 세션에 붙여 넣어지며 전송되지는 않습니다. - 코드 탭에서는 체크아웃을 둘러보고 파일 내용을 검색할 수 있습니다. -- **풀 리퀘스트까지 여기서 끝냅니다.** 저장소의 열린 풀 리퀘스트 목록을 보고, 그중 하나를 - 별도의 worktree에 체크아웃해 diff를 읽고, 인라인으로 리뷰하고, 베이스 브랜치가 실제로 - 허용하는 방식으로 병합합니다. 아직 풀 리퀘스트가 없는 브랜치에서는 **에이전트로 - 만들기**를 누르면 그 브랜치의 세션에 PR을 열어 달라고 요청하며, Enter를 누르기 전에는 - 아무것도 전송되지 않습니다. - -그 밖에도 JSON으로 가져오거나 git 저장소에서 설치하는 [테마](docs/themes.md), 세션 이름이나 -대화 내용으로 바로 이동하는 `Ctrl`/`Cmd`+`K` 팔레트, 세션이 내 응답을 기다릴 때 뜨는 데스크톱 -알림, lich가 아예 시작되지 않을 때 쓰는 `lich rage` / `lich doctor`가 있습니다. - -현재 활발하게 개발하고 있습니다. 버그와 기능 요청은 -[이슈](https://github.com/lichdotdev/lich/issues)에 남겨 주세요. 버전별 변경 사항은 -[CHANGELOG.md](CHANGELOG.md)에서 볼 수 있습니다. +## 주요 기능 + + + + + + + + + + + + + + + + + + + + + + +
+ +### 에이전트를 나란히 + +세션을 분할 화면에 올려 두면 lich가 패널을 알아서 배치합니다. 어느 세션이 작업 중인지, 어느 세션이 내 응답을 기다리는지, 컨텍스트가 얼마나 남았는지 한눈에 보입니다. + +분할 화면 하나에 각자 자기 브랜치에서 실행 중인 Claude Code와 Codex 세션
+ +### 설정 없이 작업마다 worktree + +원하는 베이스에서 세션을 분기하면 lich가 `.env` 파일을 복사하고 비어 있는 개발 서버 포트를 배정합니다. 커밋하지 않은 작업도 함께 가져갈 수 있습니다. + +사이드바의 세션들, 각각 자기 브랜치와 diff 배지가 붙어 있습니다
+ +### diff를 읽고, 줄마다 코멘트 + +에이전트가 바꾼 내용을 세션 옆에서 읽고, 손볼 줄에 코멘트를 달고, 모아 둔 코멘트를 프롬프트 하나로 세션에 돌려보냅니다. + +세션으로 보내려고 줄 코멘트 2개를 모아 둔 diff
+ +### 브라우저 없이 풀 리퀘스트 + +풀 리퀘스트를 열고, 그 브랜치의 에이전트에게 작성을 맡기고, 인라인으로 리뷰하고, 병합까지 한 창에서 끝냅니다. + +lich에서 열린 풀 리퀘스트. 파일 트리와 diff, 보류 중인 리뷰 코멘트가 보입니다
+ +### 내 취향대로 + +JSON으로 테마를 가져오거나 git 저장소에서 설치합니다. + +[문서 →](docs/themes.md) + +테마 선택기와 글꼴, 하단 바 구성이 있는 모양 설정
+ +그 밖에도: + +- **일을 넘기는 세션.** 한 에이전트가 다른 세션에 작업을 넘기고 답을 돌려받습니다. 셸에서도 `lich` 명령으로 똑같이 쓸 수 있습니다([문서](docs/cli.md)). +- **샌드박스 에이전트.** 키, 자격 증명, 다른 저장소가 보이지 않는 샌드박스 안에서 에이전트가 권한 확인을 건너뛰도록 허용할 수 있습니다([한계](docs/ceilings.md)). +- **개발 서버를 사이드바에.** 프로젝트에서 계속 띄워 두는 것을 저장해 두면 클릭 한 번으로 시작하고 멈출 수 있습니다. +- **뭐든 바로 찾기.** `Ctrl`/`Cmd`+`K`로 세션 이름이나 세션에서 오간 내용으로 바로 이동합니다. +- **내가 필요할 때 알림.** 세션이 내 응답을 기다리면 데스크톱 알림이 뜹니다. + +## 설치 + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +한 줄이면 됩니다. 배포판을 감지하고 다운로드를 검증한 다음, 패키지 매니저로 lich를 설치합니다. + +| 플랫폼 | 설치 방법 | +| --- | --- | +| **Linux** | 위의 `install.sh` 또는 AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`). `zenity`와 glibc 2.34 이상(Debian 12, Ubuntu 22.04, RHEL 9 이상)이 필요합니다. | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | [Releases](https://github.com/lichdotdev/lich/releases)의 설치 프로그램이나 포터블 zip, 또는 `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +macOS와 Windows 빌드는 아직 서명되지 않아, Releases에서 받은 파일에는 Gatekeeper와 +SmartScreen이 경고를 띄웁니다. Homebrew로 설치하면 Gatekeeper 경고는 뜨지 않습니다. +배포판별 패키지, Linux tarball, quarantine 플래그 지우기, 예전 Homebrew formula에서 +업그레이드하는 방법은 [INSTALL.md](INSTALL.md)에 있습니다. + +## 시작하기 + +1. **프로젝트를 엽니다.** 탭 줄의 `+`를 누르면 최근에 닫은 항목이 나오고 폴더 선택기가 + 열립니다. 여기서 git 저장소를 고르세요. +2. **에이전트를 고릅니다.** 처음 실행하면 머신에서 찾은 에이전트 목록이 나옵니다. + 설정 › 프로바이더에서 기본값과 바이너리 경로를 지정할 수 있습니다. +3. **세션을 시작합니다.** *새 세션*을 누르면 프로젝트에서 에이전트가 열립니다. 체크아웃 + 헤더의 `+`로는 원하는 에이전트나 일반 터미널을 바로 그 체크아웃에서 열 수 있습니다. +4. **worktree를 만듭니다** *(선택)*. 원하는 베이스 브랜치에서 하나 만들면 lich가 그 안에 + 새 세션을 열어 줍니다. ## 프로바이더 지원 -모든 프로바이더는 실제 터미널에서 실행되고, 대화 id로 재개되며, 같은 샌드박스로 격리되고, -다른 세션에 접근하는 방법도 똑같이 제공받습니다. 차이는 lich가 세션에서 *읽어 올* 수 있는 -정보에 있습니다. lich는 각 CLI가 기록하는 내용을 읽는데, 기록하는 내용이 똑같은 CLI는 하나도 -없기 때문입니다. +모든 에이전트는 실제 터미널에서 실행되고, 대화를 재개할 수 있으며, 샌드박스 안에서 동작하고, +다른 세션에 접근할 수 있습니다. 에이전트마다 다른 것은 lich가 세션에서 *읽어 올* 수 있는 +정보입니다. CLI마다 기록하는 내용이 다르기 때문입니다. + +
+에이전트별 지원 기능 보기 | 기능 | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -138,95 +165,54 @@ lich로 할 수 있는 일: | 세션을 시작할 때 숨은 서브에이전트 대신 lich 세션으로 작업을 나누라는 안내를 프롬프트 언어로 받음 | 예 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 아니요 | 아니요 | | 세션 카드가 에이전트가 조작하는 브라우저를 세션 옆 탭에 연다 | 예 | 예 | 예 | 카드는 연다. 에이전트는 `browser_*`가 아니라 `lich browser`를 쓴다 | 예 | 예 | 예 | 예 | -빈칸은 모두 의도된 것이며, CLI가 보고하는 정보를 lich가 숨기는 경우는 없습니다. 빈칸마다 -무엇을 측정했는지는 [`docs/ceilings.md`](docs/ceilings.md)에 정리되어 있습니다. - -## 설치 - -한 줄이면 됩니다. 배포판을 감지하고 체크섬을 검증한 다음, 패키지 매니저로 네이티브 패키지와 -의존성을 설치합니다. +
-```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| 플랫폼 | 설치 방법 | 실행에 필요한 것 | -| --- | --- | --- | -| **Linux** | 위의 `install.sh` 또는 AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity`, 그리고 패키지에 포함된 창을 실행하려면 glibc 2.34 이상(Debian 12, Ubuntu 22.04, RHEL 9 이상) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | 없음. Apple Silicon과 Intel 모두 창이 앱에 포함되어 있음 | -| **Windows** | [Releases](https://github.com/lichdotdev/lich/releases)의 설치 프로그램이나 포터블 zip, 또는 Scoop: `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | 없음. 어느 쪽이든 창이 포함되어 있음 | - -배포판별 수동 설치 패키지, Linux tarball, Windows 포터블 zip은 [INSTALL.md](INSTALL.md)를 -참고하세요. macOS와 Windows 바이너리는 서명되지 않았기 때문에, 공증과 서명이 적용될 때까지 -Gatekeeper와 SmartScreen이 경고를 띄웁니다. Homebrew로 설치하면 Gatekeeper 경고가 뜨지 -않지만, Releases 페이지에서 받은 파일은 quarantine 플래그를 직접 지워야 합니다. -macOS에서는 cask가 `Lich.app`을 설치하므로 `/Applications`에 lich 아이콘이 생기고, 실행 -중에는 Dock에도 표시됩니다. 예전 formula에서 업그레이드하려면 먼저 `brew uninstall lich`를 -실행해야 하며, 그 이유는 [INSTALL.md](INSTALL.md)에 있습니다. - -## 시작하기 - -1. **설치**한 다음 `lich`를 실행합니다. -2. **프로젝트를 엽니다.** 탭 줄의 `+`를 누르면 최근에 닫은 항목이 나오고 OS 폴더 선택기가 - 열립니다. 여기서 git 저장소를 고르세요. -3. **에이전트를 지정합니다.** 처음 실행하면 머신에서 찾은 에이전트 목록이 나옵니다. - 설정 › 프로바이더에서 바이너리 경로를 각각 지정하고 기본값을 고를 수 있습니다. - 프로젝트마다 같은 화면에서 기본값을 따를지, 다른 프로바이더를 쓸지 정할 수 있습니다. -4. **세션을 시작합니다.** *새 세션*을 누르면 프로젝트에서 에이전트를 실행하는 터미널이 - 열립니다. 체크아웃 헤더마다 `+` 메뉴도 있어서, 활성화된 프로바이더나 일반 터미널을 바로 - 그 체크아웃에서 열 수 있습니다. 헤더 자체를 클릭하면 그 체크아웃의 세션을 접거나 펼칩니다. -5. **worktree를 만듭니다** *(선택)*. 원하는 베이스 브랜치에서 하나 만들면 lich가 필요한 - 파일을 채워 넣고 새 세션으로 바로 연결해 줍니다. +빈칸은 모두 의도된 것이며, 각각 무엇을 측정했는지는 +[`docs/ceilings.md`](docs/ceilings.md)에 정리되어 있습니다. ## 설정 -- **프로바이더**: 설정 › 프로바이더에서 프로바이더별 바이너리 경로와 모든 프로젝트에 적용할 - 기본값을 지정합니다. 같은 화면의 현재 프로젝트 행에서 이 선택을 덮어쓸 수 있고, **지우기**를 - 누르면 덮어쓴 값이 사라져 이후 기본값을 바꾸면 자동으로 반영됩니다. 경로를 지정하지 않으면 - 세션은 로그인 셸의 `PATH`에서 가장 먼저 찾은 프로바이더 바이너리를 실행합니다. - 바이너리 블록에 그 파일과 버전이 표시되고 `PATH`에 있는 다른 버전도 함께 - 나열되며, `lich doctor`도 이를 경고합니다. 특정 바이너리를 쓰려면 바이너리 블록에서 경로를 - 지정하세요(설정 키는 `provider..bin`, 예: `provider.codex.bin`). - lich가 플랜 정보를 읽을 수 있으면 프로바이더 섹션 맨 위에 남은 플랜 사용량이 표시됩니다. - 하단 바에 표시할 항목은 설정 › 모양에서 끌어다 놓아 정합니다. 비용은 토큰당 과금될 때만 - 의미가 있으므로 처음에는 숨겨져 있습니다. -- **worktree**: 어떤 gitignore된 파일을 새 worktree에 복사할지는 프로젝트 체크아웃의 - `.worktreeinclude` 파일로 조정합니다. -- **세션 훅**: 설정에서 - [lich 플러그인](https://github.com/lichdotdev/lich-plugin)을 설치하면 세션이 자기 카드의 - 제목을 직접 정하고, 파일을 쓰는 즉시 git 상태를 새로 고칩니다. -- **안정성**: lich에서 스크립트로 안심하고 다뤄도 되는 부분과 릴리스마다 바뀔 수 있는 부분은 +- **프로바이더.** 설정 › 프로바이더에서 에이전트별 바이너리 경로와 모든 프로젝트에 적용할 + 기본값을 지정하며, 프로젝트마다 따로 고를 수도 있습니다. 경로를 지정하지 않으면 lich는 + 로그인 셸의 `PATH`에서 가장 먼저 찾은 바이너리를 실행하고, 버전이 둘 이상이면 + `lich doctor`가 경고합니다. +- **하단 바.** 설정 › 모양에서 항목을 끌어다 놓아 무엇을 표시할지 정합니다. 비용은 토큰당 + 과금될 때만 의미가 있으므로 처음에는 숨겨져 있습니다. +- **worktree.** 프로젝트의 `.worktreeinclude` 파일로 gitignore된 파일 중 어느 것을 새 + worktree에 복사할지 정합니다. +- **세션 훅.** 설정에서 [lich 플러그인](https://github.com/lichdotdev/lich-plugin)을 + 설치하면 세션이 자기 카드의 제목을 직접 정하고, 파일을 쓰는 즉시 git 상태를 새로 고칩니다. +- **스크립팅.** lich에서 스크립트로 안심하고 다뤄도 되는 부분은 [docs/stability.md](docs/stability.md)에 정리되어 있습니다. ## 개인 정보와 업데이트 -모든 것이 내 머신에서 실행됩니다. 계정도, 로그인도, 텔레메트리도 없으며, 백엔드는 토큰으로 -인증하는 loopback 리스너입니다. lich가 스스로 네트워크에 접속하는 경우는 아래가 전부입니다. +모든 것이 내 머신에서 실행됩니다. 계정도, 로그인도, 텔레메트리도 없습니다. lich가 네트워크에 +접속하는 경우는 아래가 전부입니다. -- **업데이트**: 시작할 때와 매시간 GitHub Releases에서 새 버전을 확인하고, 시작할 때 GitHub에서 - lich 플러그인 릴리스 목록을 확인합니다. +- **업데이트**: 시작할 때와 매시간 GitHub Releases에서 새 버전을 확인하고, 시작할 때 lich + 플러그인의 릴리스 목록을 확인합니다. - **플랜 사용량**: 각 프로바이더의 사용량 엔드포인트(Anthropic, OpenAI, Cursor, OpenCode Go)에 - 세션의 CLI가 이미 쓰고 있는 로그인 정보로 접속하며, 최대 5분에 한 번입니다. Antigravity의 + 에이전트가 이미 쓰고 있는 로그인 정보로 접속하며, 최대 5분에 한 번입니다. Antigravity의 플랜은 `agy`에서 직접 읽습니다. - **가격**: 번들된 가격표에 없는 모델이 있을 때 한 번, GitHub에 공개된 LiteLLM 가격표를 받아 옵니다. Windows 설치 프로그램으로 설치한 빌드는 lich가 직접 업데이트합니다. Homebrew, Scoop, AUR, Linux 패키지로 설치했다면 해당 패키지 매니저로 업데이트하며, 실행할 명령은 lich가 알려 줍니다. -버그 리포트에 로그 파일을 첨부하기 전에 설정 › 도움말에서 로그에 무엇이 담기는지(경로, -프로젝트와 브랜치 이름, gh 로그인 계정이며 세션 토큰은 절대 담기지 않음) 확인할 수 있고, -`lich rage`는 아무것도 업로드하지 않고 리포트를 아카이브 하나로 모아 줍니다. +문제가 생겼다면 `lich doctor`가 설정을 점검하고, `lich rage`는 아무것도 업로드하지 않고 +버그 리포트를 아카이브 하나로 모아 줍니다. 로그 파일을 첨부하기 전에 설정 › 도움말에서 로그에 +무엇이 담기는지(경로, 프로젝트와 브랜치 이름, gh 로그인 계정이며 세션 토큰은 절대 담기지 않음) +확인할 수 있습니다. 버그와 기능 요청은 [이슈](https://github.com/lichdotdev/lich/issues)에 +남겨 주세요. 버전별 변경 사항은 [CHANGELOG.md](CHANGELOG.md)에서 볼 수 있습니다. ## 소스에서 빌드 -lich는 바이너리 두 개로 이루어집니다. 백엔드 `lich`는 순수 Go(Go 1.27, `CGO_ENABLED=0`, -정적 바이너리 하나)이며, 토큰으로 인증하는 loopback 리스너(HTTP RPC + WebSockets)로 세션을 -서빙합니다. 창 `lich-native`는 `native/`에 있는 별도의 Go 모듈로, cgo로 빌드합니다. 창은 -[Gio](https://gioui.org)가 그리고, 터미널은 `libghostty-vt`가, 코드와 diff 화면은 -[godemirror](https://github.com/lichdotdev/godemirror)가 맡습니다. 필요한 것은 **Go 1.27.0+**와 +lich는 바이너리 두 개로 이루어집니다. 백엔드 `lich`는 정적 순수 Go 바이너리이고, 창 +`lich-native`는 `native/`에서 cgo로 빌드합니다. 필요한 것은 **Go 1.27.0+**와 **[Task](https://taskfile.dev)**이며, 창을 빌드하려면 C 툴체인과 Gio의 시스템 패키지, 그리고 -`native/GHOSTTY_COMMIT`에 적힌 Ghostty 커밋에서 Zig 0.16으로 빌드한 `libghostty-vt`가 추가로 -필요합니다. 빌드 방법은 [`native/slice.sh`](native/slice.sh)에, 창에 대한 설명은 +`native/GHOSTTY_COMMIT`에 적힌 커밋에서 빌드한 `libghostty-vt`가 추가로 필요합니다. +빌드 방법은 [`native/slice.sh`](native/slice.sh)에, 창에 대한 설명은 [`docs/native-window.md`](docs/native-window.md)에 있습니다. ```bash @@ -234,18 +220,11 @@ task build # 백엔드 바이너리 -> bin/lich task build:native # 창 -> bin/lich-native task run # 빌드 + 실행 task test # Go 테스트 스위트 +task package # bin/에 .deb + .rpm + Arch .pkg.tar.zst (nfpm 필요) ``` -Linux 릴리스를 로컬에서 패키징하려면 -[nfpm](https://nfpm.goreleaser.com/)이 필요합니다. - -```bash -task package # bin/에 .deb + .rpm + Arch .pkg.tar.zst -``` - -lich가 실행하는 에이전트 CLI 8종에 하나를 더 추가하려면 두 저장소에 걸쳐 파일 십여 개를 -고쳐야 하며, 이만큼 손이 가는 변경은 이것 하나뿐입니다. 어디를 고쳐야 하는지는 -[`docs/adding-a-provider.md`](docs/adding-a-provider.md)에 정리되어 있습니다. +에이전트를 하나 더 추가하려면 두 저장소에 걸쳐 파일 십여 개를 고쳐야 합니다. +어디를 고쳐야 하는지는 [`docs/adding-a-provider.md`](docs/adding-a-provider.md)에 정리되어 있습니다. ## 후원 diff --git a/README.md b/README.md index de2c92aeb..b9fc105f6 100644 --- a/README.md +++ b/README.md @@ -2,100 +2,124 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

A terminal-first ADE for the coding agents you already use.

-

- Open your projects, run agents like Claude Code, Codex and opencode in real - terminals, and keep git — worktrees, diffs and pull requests — in view - without leaving the window. No Electron and no browser: lich draws its own - native window with Gio, on Linux, Windows and macOS. -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ Run your coding agents side by side, each on its own branch.
+ Claude Code, Codex, opencode or the agent you already use, each in its own worktree, all in one window. +

+

Download lich · lichdotdev.github.io/lich

Four Claude Code sessions side by side on one wall, each in its own git worktree. The sidebar lists them with their branch and diff badge, with the project's running services and the profile at its foot, and the footer shows the branch, the model and the plan - + -## Why lich - -lich lets you: - -- **Run the agent you already have.** [Claude Code](https://www.anthropic.com/claude-code), - [Codex](https://github.com/openai/codex), Antigravity, - [opencode](https://github.com/sst/opencode), oh-my-pi, - [Crush](https://github.com/charmbracelet/crush), the - [Cursor CLI](https://cursor.com/docs/cli) and the - [Kiro CLI](https://kiro.dev/docs/cli/) all run here the same way. Point lich - at each binary once, then pick the default or choose per session. What lich - can read back *out* of a session differs by provider, and - [Provider support](#provider-support) is the table. -- **Keep a real terminal.** PTY-backed shells, several per project, rendered on - the GPU, with searchable scrollback that survives closing and reopening the - window. What a project keeps running, a dev server, a tunnel, a `lazydocker`, - is saved once as a service and started, stopped and read from the bottom of - the sidebar, and it can start with lich. The footer follows `cd` and names the branch — and, for a - Claude Code, Codex or Kiro CLI session, the model and the context window in - use; for Claude Code, Codex, Antigravity, Cursor CLI and an OpenCode Go - subscription, how much of your plan's rolling window is left; if you ask, what - the session has spent, on the providers that record it. -- **Put one session to work for another.** Hand a task to another card and its - own agent writes the answer back, whatever runs in either end: the agent - reaches the other sessions through tools handed at spawn — MCP for Claude - Code and Codex — or brought by the plugin. The whole surface doubles as the - `lich` command in any shell, `--json` included, so a script can drive a - session with no agent in the loop ([`docs/cli.md`](docs/cli.md)). -- **Watch several of them at once.** Put any session on a wall beside the one - you are in and lich lays the panes out itself, from how many there are and how - much room the window has — eight land four across on an ultrawide and two - across on a laptop. A session that handed work to others builds the wall around - it in one click. Each wall is named, a project keeps as many as you like, and - each gets a block in the sidebar you can fold, rename or take apart. -- **Branch off a worktree without the setup.** Spin one up from any base - branch and lich seeds it with your gitignored `.env*` files and hands it a - dev-server port no other checkout and no process on the machine is using. - Start it from the - checkout's uncommitted work and those changes come along, untracked files - included. -- **Run a session confined.** An agent can open inside an OS sandbox: a fresh - empty home holding only that provider's own state, the rest of the machine - read-only, and write access to the checkout it was opened for. Your ssh keys, - your cloud credentials and every other repository on the disk are simply not - there — the counterweight to letting an agent skip permission prompts. Linux - runs bubblewrap and macOS `sandbox-exec`; it is not a boundary against hostile - code, and [`docs/ceilings.md`](docs/ceilings.md) says what it does not stop. -- **Review the diff where you read it.** A diff dock shows the working - changes beside a live file tree, folds the ones that only moved whitespace when - you ask it to, and shows a changed image or PDF before and after. Right-click a - selection to comment against those lines; the batch is pasted into the session - as a single prompt, unsent. Its Code tab browses the checkout and searches the - text of its files. -- **Ship the pull request from here.** List the repository's open pull requests, - check one out into a worktree of its own, then read the diff, review it inline - and merge it — with the methods the base branch actually accepts. On a branch - with no pull request yet, **Create with agent** asks that branch's session to - open one, and nothing is sent until you press Enter. - -Plus: [themes](docs/themes.md) you import as JSON or install from a git -repository, a `Ctrl`/`Cmd`+`K` palette that jumps by name or by what was said in -the conversation, a desktop notification when a session is waiting on you, and -`lich rage` / `lich doctor` for when it will not start at all. - -Development is active: bugs and feature requests belong in -[Issues](https://github.com/lichdotdev/lich/issues), and what changed in each -version is in [CHANGELOG.md](CHANGELOG.md). +## Features + + + + + + + + + + + + + + + + + + + + + + +
+ +### Agents side by side + +Put sessions on a wall and lich lays out the panes for you. See at a glance which one is busy, which one is waiting on you and how much context it has left. + +Claude Code and Codex sessions on one wall, each on its own branch
+ +### A worktree per task, no setup + +Branch a session off any base and lich copies your `.env` files and gives it a free dev-server port. Your uncommitted work can come along. + +Sessions in the sidebar, each with its own branch and diff badge
+ +### Review the diff, comment the lines + +Read what the agent changed next to its session, comment on the lines that need work and send every note back as one prompt. + +A diff with two line comments queued to send to the session
+ +### Pull requests without the browser + +Open a pull request, ask the branch's agent to write it, review it inline and merge it, all from the same window. + +A pull request open in lich with its file tree, diff and a pending review comment
+ +### Make it yours + +Import a theme as JSON or install one from a git repository. + +[Docs →](docs/themes.md) + +The Appearance settings with the theme picker, fonts and footer layout
+ +And also: + +- **Sessions that delegate.** One agent hands a task to another session and gets the answer back. The same works from your shell with the `lich` command ([docs](docs/cli.md)). +- **Sandboxed agents.** Let an agent skip permission prompts inside a sandbox that can't see your keys, your credentials or your other repositories ([limits](docs/ceilings.md)). +- **Your dev servers in the sidebar.** Save what a project keeps running and start or stop it with one click. +- **Find anything.** `Ctrl`/`Cmd`+`K` jumps to a session by name or by something said in it. +- **Know when you're needed.** A desktop notification when a session is waiting on you. + +## Install + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +One line: it detects your distro, checks the download and installs lich with your package manager. + +| Platform | Get it | +| --- | --- | +| **Linux** | `install.sh` above, or AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`). Needs `zenity` and glibc 2.34 or newer (Debian 12, Ubuntu 22.04, RHEL 9 and up). | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | Installer or portable zip from [Releases](https://github.com/lichdotdev/lich/releases), or `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +The macOS and Windows builds are not signed yet, so Gatekeeper and SmartScreen +warn on a download from Releases; Homebrew skips the Gatekeeper prompt. +Per-distro packages, the Linux tarball, clearing the quarantine flag and +upgrading from the old Homebrew formula are in [INSTALL.md](INSTALL.md). + +## Getting started + +1. **Open a project.** The `+` in the tab strip lists what you closed recently + and opens a folder picker. Point it at a git repository. +2. **Pick your agent.** The first launch lists the agents it found on your + machine. Settings › Providers sets the default and each binary's path. +3. **Start a session.** *New Session* opens your agent in the project. The `+` + on a checkout's header opens any agent, or a plain terminal, in that checkout. +4. **Give it a worktree** *(optional)*. Create one from any base branch and lich + opens a fresh session in it. ## Provider support -Every provider is spawned in a real terminal, resumed by conversation id, -confined by the same sandbox and handed the same way of reaching your other -sessions. What differs is what lich can *read* back out of a session, because it -reads what each CLI writes down and no two of them write down the same things. +Every agent runs in a real terminal, resumes its conversation, works in the +sandbox and reaches your other sessions. What changes from one to another is +what lich can read back out of it, since each CLI records different things. + +
+See what each agent supports | What you get | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -141,121 +165,67 @@ reads what each CLI writes down and no two of them write down the same things. | Told at spawn, in the prompt language, to fan work out as lich sessions rather than hidden subagents | yes | no | no | no | yes | no | no | no | | The session card opens a browser its agent drives, in a tab beside the session | yes | yes | yes | the card opens it; the agent uses `lich browser`, not `browser_*` | yes | yes | yes | yes | -Every gap is deliberate, none of them is lich withholding something the CLI -reports, and [`docs/ceilings.md`](docs/ceilings.md) says what was measured behind -each one. - -## Install - -One line — detects your distro, verifies the checksum, and installs the native -package and its dependencies through your package manager: +
-```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| Platform | Get it | Needs at runtime | -| --- | --- | --- | -| **Linux** | `install.sh` above, or AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity`, plus glibc 2.34 or newer for the window that ships in the package (Debian 12, Ubuntu 22.04, RHEL 9 and up) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | nothing, the window ships in the app on Apple Silicon and Intel alike | -| **Windows** | installer or portable zip from [Releases](https://github.com/lichdotdev/lich/releases), or Scoop: `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | nothing, the window ships with each | - -Manual per-distro packages, the Linux tarball and the Windows portable zip: [INSTALL.md](INSTALL.md). The -macOS and Windows binaries are unsigned — Gatekeeper and SmartScreen warn until -notarization/signing ship. Homebrew installs sidestep the Gatekeeper prompt; -a download from the Releases page needs its quarantine flag cleared by hand. -On macOS the cask installs `Lich.app`, so lich has its own icon in -`/Applications` and in the Dock while it runs. Upgrading from the old formula -needs `brew uninstall lich` first — [INSTALL.md](INSTALL.md) says why. - -## Getting started - -1. **Install** and launch `lich`. -2. **Open a project** — the `+` in the tab strip lists what you closed recently - and opens your OS folder picker; point it at a git repository. -3. **Point lich at your agent** — the first launch lists the agents it found on - your machine; in Settings › Providers you can set each binary path and - choose the default. A project can follow it or choose a different provider - on the same screen. -4. **Start a session** — *New Session* spawns a terminal running your agent in - the project. Each checkout header also has a `+` menu for opening any enabled - provider or a plain terminal in that exact checkout; click the header itself - to collapse or expand its sessions. -5. **Branch off a worktree** *(optional)* — create one from any base branch; - lich seeds it and drops you into a fresh session. +Every gap is deliberate, and [`docs/ceilings.md`](docs/ceilings.md) says what was +measured behind each one. ## Configuration -- **Providers** — set each provider's binary path and the default for all - projects in Settings › Providers. The open project's row there can override - that choice; **Clear** removes the override, so later changes to the default - flow through automatically. With no path set, a session runs the first of - the provider's binaries on your login shell's `PATH`; the Binary block names that file and its version, and lists any other version - `PATH` holds, which `lich doctor` also warns about. To pick one, set its path - in Binary (the setting `provider..bin`, e.g. `provider.codex.bin`). - A provider's section opens - with how much of your plan is left, when lich can read it. What the footer - shows is set in Settings › Appearance by dragging its items; the cost - readout starts hidden, since the figure only means something when you are - billed per token. -- **Worktrees** — a `.worktreeinclude` file in the project checkout tunes which - gitignored files get copied into a new worktree. -- **Session hooks** — with the - [lich plugin](https://github.com/lichdotdev/lich-plugin) installed from Settings, - a session titles its own card and refreshes git the moment it writes a file. -- **Stability**: which parts of lich are safe to script against, and which can - change in any release, is written down in [docs/stability.md](docs/stability.md). +- **Providers.** Settings › Providers sets each agent's binary and the default + for every project; a project can choose its own. With no path set, lich runs + the first binary on your login shell's `PATH` and `lich doctor` warns when + there is more than one version. +- **Footer.** Settings › Appearance: drag its items to choose what it shows. + The cost starts hidden, since it only means something when you pay per token. +- **Worktrees.** A `.worktreeinclude` file in the project picks which gitignored + files a new worktree gets. +- **Session hooks.** Install the [lich plugin](https://github.com/lichdotdev/lich-plugin) + from Settings and a session names its own card and refreshes git the moment + it writes a file. +- **Scripting.** [docs/stability.md](docs/stability.md) says which parts of lich + are safe to script against. ## Privacy & updates -Everything runs on your machine. No account, no sign-in, no telemetry: the -backend is a token-authenticated loopback listener. On its own, lich goes to the -network for these and nothing else: +Everything runs on your machine: no account, no sign-in, no telemetry. lich +only goes to the network for: - **Updates**: a version check against GitHub Releases at startup and hourly, - and the lich plugin's release list on GitHub at startup. + and the lich plugin's release list at startup. - **Plan usage**: each provider's own usage endpoint (Anthropic, OpenAI, Cursor, - OpenCode Go), with the login the session's CLI already uses, at most every five + OpenCode Go), with the login the agent already uses, at most every five minutes. Antigravity's plan is read from `agy` itself. -- **Prices**: LiteLLM's public price table on GitHub, once for a model the +- **Prices**: LiteLLM's public price table on GitHub, once, for a model the bundled table does not know. -The Windows installer's build updates in place; a Homebrew, Scoop, AUR or Linux -package install updates through its package manager, and lich hands you the -command. -Settings › Help says what the log file carries — paths, project and branch names, -your gh login, never a session token — before you attach it to a bug report, and -`lich rage` collects that report into one archive without uploading any of it. +The Windows installer updates in place; Homebrew, Scoop, AUR and the Linux +packages update through their package manager, and lich gives you the command. +Something broken? `lich doctor` checks your setup and `lich rage` packs a bug +report into one archive without uploading it. Settings › Help says what the log +carries (paths, project and branch names, your gh login, never a session token) +before you attach it. Bugs and feature requests go to +[Issues](https://github.com/lichdotdev/lich/issues); what changed in each +version is in [CHANGELOG.md](CHANGELOG.md). ## Build from source -lich is two binaries. The backend, `lich`, is pure Go (Go 1.27, `CGO_ENABLED=0`, -one static binary) and serves sessions over a token-authenticated loopback -listener (HTTP RPC + WebSockets). The window, `lich-native`, is its own Go module -in `native/`, built with cgo: [Gio](https://gioui.org) draws it, `libghostty-vt` -runs its terminals and [godemirror](https://github.com/lichdotdev/godemirror) -its code and diff views. Prerequisites are **Go 1.27.0+** and -**[Task](https://taskfile.dev)**; the window adds a C toolchain, Gio's system -packages and a `libghostty-vt` built with Zig 0.16 from the Ghostty commit in -`native/GHOSTTY_COMMIT`. [`native/slice.sh`](native/slice.sh) says how to build -it, and [`docs/native-window.md`](docs/native-window.md) covers the window. +lich is two binaries: `lich`, a static pure-Go backend, and `lich-native`, the +window, built with cgo from `native/`. You need **Go 1.27.0+** and +**[Task](https://taskfile.dev)**; the window also needs a C toolchain, Gio's +system packages and a `libghostty-vt` built from the commit in +`native/GHOSTTY_COMMIT`. [`native/slice.sh`](native/slice.sh) says how, and +[`docs/native-window.md`](docs/native-window.md) covers the window. ```bash task build # backend binary -> bin/lich task build:native # window -> bin/lich-native task run # build + run task test # Go suites +task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ (needs nfpm) ``` -Package a Linux release locally (needs -[nfpm](https://nfpm.goreleaser.com/)): - -```bash -task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ -``` - -Adding another agent CLI to the eight lich runs is the one change that lands in a -dozen files across two repositories: +Adding another agent touches a dozen files across two repositories: [`docs/adding-a-provider.md`](docs/adding-a-provider.md) is the map. ## Sponsors diff --git a/README.pt-BR.md b/README.pt-BR.md index 2397fb6eb..c0c5cdfcb 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -2,108 +2,127 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

Um ADE para quem trabalha no terminal, com os agentes de código que você já usa.

-

- Abra seus projetos, rode agentes como Claude Code, Codex e opencode em - terminais de verdade e acompanhe o git (worktrees, diffs e pull requests) - sem sair da janela. Sem Electron e sem navegador: o lich desenha a própria - janela nativa com Gio, no Linux, no Windows e no macOS. -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ Seus agentes de código lado a lado, cada um na própria branch.
+ Claude Code, Codex, opencode ou o agente que você já usa, cada um na própria worktree, todos na mesma janela. +

+

Baixar o lich · lichdotdev.github.io/lich

Quatro sessões do Claude Code lado a lado num split, cada uma na sua git worktree. A barra lateral lista as sessões com a branch e o selo de diff e, no pé, os serviços rodando no projeto e o profile; o rodapé mostra a branch, o modelo e o plano - + -## Por que o lich - -O que dá para fazer com o lich: - -- **Rodar o agente que você já tem.** [Claude Code](https://www.anthropic.com/claude-code), - [Codex](https://github.com/openai/codex), Antigravity, - [opencode](https://github.com/sst/opencode), oh-my-pi, - [Crush](https://github.com/charmbracelet/crush), - [Cursor CLI](https://cursor.com/docs/cli) e - [Kiro CLI](https://kiro.dev/docs/cli/) rodam aqui do mesmo jeito. Aponte o - lich para cada binário uma vez e escolha um padrão ou um agente por sessão. - O que o lich consegue ler *de volta* de cada sessão muda de provedor para - provedor, e está tudo na tabela de - [Suporte por provedor](#suporte-por-provedor). -- **Usar um terminal de verdade.** Shells com PTY, vários por projeto, - renderizados na GPU, com scrollback pesquisável que sobrevive a fechar e - reabrir a janela. O que um projeto mantém rodando (um servidor de dev, um - túnel, um `lazydocker`) fica salvo como serviço, que você inicia, para e lê - no pé da barra lateral, e que pode subir junto com o lich. O rodapé acompanha o `cd` e mostra a branch. Numa sessão de Claude - Code, Codex ou Kiro CLI, mostra também o modelo e a janela de contexto em - uso; no Claude Code, Codex, Antigravity, Cursor CLI e numa assinatura do - OpenCode Go, quanto ainda resta da janela móvel do seu plano; e, se você - pedir, quanto a sessão já gastou, nos provedores que registram isso. -- **Pôr uma sessão para trabalhar para outra.** Passe uma tarefa para outro - card e o agente de lá escreve a resposta de volta, seja qual for o agente em - cada ponta. Ele chega às outras sessões por ferramentas entregues na criação - da sessão (MCP no Claude Code e no Codex) ou trazidas pelo plugin. Tudo isso - também existe como o comando `lich` em qualquer shell, com `--json`, então - um script consegue conduzir uma sessão sem nenhum agente no meio - ([`docs/cli.md`](docs/cli.md)). -- **Acompanhar várias ao mesmo tempo.** Coloque qualquer sessão num split ao - lado da atual e o lich organiza os painéis sozinho, pela quantidade de - sessões e pelo espaço da janela: oito ficam quatro por linha num monitor - ultrawide e duas por linha num notebook. Uma sessão que delegou trabalho - monta o split com as outras em volta dela num clique. Cada split tem nome, - um projeto guarda quantos você quiser e cada um ganha um bloco na barra - lateral, que dá para recolher, renomear ou desfazer. -- **Criar uma worktree sem fazer setup.** Crie uma a partir de qualquer branch - base: o lich copia os seus `.env*` ignorados pelo git e reserva uma porta - para o servidor de dev que nenhum outro checkout nem processo da máquina - está usando. - Tem mudança não commitada no checkout? Ela vai junto, inclusive os arquivos - não rastreados. -- **Rodar uma sessão confinada.** O agente pode abrir dentro de uma sandbox - do sistema operacional: um home novo e vazio, só com o estado do próprio - provedor, o resto da máquina só para leitura e acesso de escrita ao checkout - em que ele foi aberto. Suas chaves ssh, suas credenciais de nuvem e todos os - outros repositórios do disco simplesmente não estão lá. É o contrapeso de - deixar um agente pular os pedidos de permissão. No Linux roda com - bubblewrap e no macOS com `sandbox-exec`. Não protege contra código - malicioso, e o [`docs/ceilings.md`](docs/ceilings.md) diz o que ela não - impede. -- **Revisar o diff no mesmo lugar em que você lê.** Um dock de diff - mostra as mudanças em andamento ao lado de uma árvore de arquivos ao vivo, - recolhe as que só mexeram em espaço em branco quando você pede e mostra o - antes e depois de uma imagem ou PDF alterado. Clique com o botão direito - numa seleção para comentar aquelas linhas; os comentários vão juntos para a - sessão num prompt só, colado e não enviado. A aba Código navega pelo - checkout e busca no texto dos arquivos. -- **Levar o pull request até o merge daqui.** Liste os pull requests abertos - do repositório, faça checkout de um numa worktree própria, leia o diff, - revise inline e faça o merge com os métodos que a branch base aceita de - fato. Numa branch que ainda não tem pull request, **Criar com agente** pede - para a sessão dessa branch abrir um, e nada é enviado até você apertar - Enter. - -Tem mais: [temas](docs/themes.md) que você importa como JSON ou instala de um -repositório git, uma paleta no `Ctrl`/`Cmd`+`K` que acha uma sessão pelo nome -ou pelo que foi dito na conversa, notificação no desktop quando uma sessão está -esperando por você e `lich rage` / `lich doctor` para quando ele nem abre. - -O projeto está em desenvolvimento ativo: bugs e pedidos de funcionalidade vão -nas [Issues](https://github.com/lichdotdev/lich/issues), e o que mudou em cada -versão está no [CHANGELOG.md](CHANGELOG.md). +## Recursos + + + + + + + + + + + + + + + + + + + + + + +
+ +### Agentes lado a lado + +Coloque as sessões num split e o lich arruma os painéis sozinho. Veja de relance quem está trabalhando, quem está esperando por você e quanto contexto ainda resta. + +Sessões do Claude Code e do Codex no mesmo split, cada uma na sua branch
+ +### Uma worktree por tarefa, sem configurar nada + +Crie uma sessão a partir de qualquer branch e o lich copia seus arquivos `.env` e reserva uma porta livre para o servidor de desenvolvimento. O que você ainda não commitou pode ir junto. + +Sessões na barra lateral, cada uma com a sua branch e o selo de diff
+ +### Revise o diff e comente as linhas + +Leia o que o agente mudou ao lado da sessão dele, comente as linhas que precisam de ajuste e mande todas as notas de volta num único prompt. + +Um diff com dois comentários de linha esperando para ir para a sessão
+ +### Pull requests sem abrir o navegador + +Peça ao agente da branch para abrir o pull request, revise linha a linha e faça o merge, tudo na mesma janela. + +Um pull request aberto no lich com a árvore de arquivos, o diff e um comentário de review pendente
+ +### Do seu jeito + +Importe um tema em JSON ou instale um direto de um repositório git. + +[Docs →](docs/themes.md) + +As configurações de Aparência com o seletor de tema, as fontes e o layout do rodapé
+ +E mais: + +- **Sessões que delegam.** Um agente passa uma tarefa para outra sessão e recebe a resposta de volta. O mesmo funciona do seu shell com o comando `lich` ([docs](docs/cli.md)). +- **Agentes em sandbox.** Deixe um agente pular os pedidos de permissão dentro de uma sandbox que não enxerga suas chaves, suas credenciais nem seus outros repositórios ([limites](docs/ceilings.md)). +- **Seus servidores de desenvolvimento na barra lateral.** Salve o que o projeto mantém rodando e ligue ou desligue com um clique. +- **Ache qualquer coisa.** `Ctrl`/`Cmd`+`K` pula para uma sessão pelo nome ou por algo que foi dito nela. +- **Saiba quando precisam de você.** Notificação no desktop quando uma sessão está esperando por você. + +## Instalação + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +Um comando só: ele detecta a sua distro, confere o download e instala o lich pelo gerenciador de pacotes. + +| Plataforma | Como instalar | +| --- | --- | +| **Linux** | O `install.sh` acima, ou o AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`). Precisa do `zenity` e da glibc 2.34 ou mais nova (Debian 12, Ubuntu 22.04, RHEL 9 em diante). | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | Instalador ou zip portátil em [Releases](https://github.com/lichdotdev/lich/releases), ou `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +Os builds de macOS e Windows ainda não são assinados, então o Gatekeeper e o +SmartScreen avisam num download pela página de Releases; pelo Homebrew, o aviso +do Gatekeeper não aparece. Pacotes por distro, o tarball para Linux, como tirar +a flag de quarentena e como atualizar a partir da fórmula antiga do Homebrew +estão no [INSTALL.md](INSTALL.md). + +## Primeiros passos + +1. **Abra um projeto.** O `+` na barra de abas lista o que você fechou + recentemente e abre o seletor de pastas. Escolha um repositório git. +2. **Escolha o seu agente.** Na primeira execução, o lich lista os agentes que + encontrou na máquina. Em Configurações › Provedores você define o padrão e o + caminho de cada binário. +3. **Inicie uma sessão.** *Nova sessão* abre o seu agente no projeto. O `+` no + cabeçalho de um checkout abre qualquer agente, ou um terminal comum, + naquele checkout. +4. **Dê uma worktree para ela** *(opcional)*. Crie uma a partir de qualquer + branch base e o lich abre uma sessão nova nela. ## Suporte por provedor -Todo provedor roda num terminal de verdade, é retomado pelo id da conversa, -fica confinado pela mesma sandbox e recebe o mesmo jeito de falar com as suas -outras sessões. O que muda é o que o lich consegue *ler* de cada sessão, -porque ele lê o que cada CLI registra, e não existem duas que registrem as -mesmas coisas. +Todo agente roda num terminal de verdade, retoma a conversa, funciona na +sandbox e fala com as suas outras sessões. O que muda de um para outro é o que +o lich consegue ler de volta, porque cada CLI registra coisas diferentes. + +
+Veja o que cada agente suporta | Recurso | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -149,130 +168,70 @@ mesmas coisas. | Instruído na criação, no idioma de prompt, a distribuir o trabalho em sessões do lich em vez de subagentes ocultos | sim | não | não | não | sim | não | não | não | | O card da sessão abre um navegador que o agente dirige, numa aba ao lado da sessão | sim | sim | sim | o card abre; o agente usa `lich browser`, não as tools `browser_*` | sim | sim | sim | sim | -Toda lacuna é proposital: nenhuma é o lich escondendo algo que a CLI informa, -e o [`docs/ceilings.md`](docs/ceilings.md) diz o que foi medido em cada uma. - -## Instalação +
-Um comando só: detecta a sua distro, confere o checksum e instala o pacote -nativo e as dependências pelo gerenciador de pacotes: - -```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| Plataforma | Como instalar | Dependências em runtime | -| --- | --- | --- | -| **Linux** | o `install.sh` acima ou o AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity` e glibc 2.34 ou mais nova para a janela que vem no pacote (Debian 12, Ubuntu 22.04, RHEL 9 em diante) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | nada, a janela já vem no app, em Apple Silicon e Intel | -| **Windows** | instalador ou zip portátil em [Releases](https://github.com/lichdotdev/lich/releases), ou Scoop: `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | nada, a janela já vem nos dois | - -Pacotes manuais por distro, o tarball para Linux e o zip portátil para Windows: -[INSTALL.md](INSTALL.md). Os binários de macOS e Windows não são assinados, -então o Gatekeeper e o SmartScreen avisam até a notarização/assinatura sair. -Instalando pelo Homebrew, o aviso do Gatekeeper não aparece; num download pela -página de Releases, você precisa remover a flag de quarentena na mão. -No macOS o cask instala o `Lich.app`, então o lich tem ícone próprio em -`/Applications` e no Dock enquanto roda. Para atualizar a partir da fórmula -antiga, rode `brew uninstall lich` antes; o [INSTALL.md](INSTALL.md) explica -por quê. - -## Primeiros passos - -1. **Instale** e abra o `lich`. -2. **Abra um projeto**: o `+` na barra de abas lista o que você fechou - recentemente e abre o seletor de pastas do sistema. Escolha um repositório - git. -3. **Aponte o lich para o seu agente**: na primeira execução, ele lista os - agentes que encontrou na máquina. Em Configurações › Provedores você define - o caminho de cada binário e escolhe o padrão. Na mesma tela, um projeto pode - seguir esse padrão ou usar outro provedor. -4. **Inicie uma sessão**: *Nova sessão* abre um terminal com o seu agente - rodando no projeto. O cabeçalho de cada checkout também tem um menu `+` - para abrir qualquer provedor ativado, ou um terminal comum, exatamente - naquele checkout. Clique no cabeçalho para recolher ou expandir as sessões - dele. -5. **Crie uma worktree** *(opcional)*: a partir de qualquer branch base. O lich - prepara a worktree e já abre uma sessão nova nela. +Toda lacuna é proposital, e o [`docs/ceilings.md`](docs/ceilings.md) diz o que +foi medido em cada uma. ## Configuração -- **Provedores**: em Configurações › Provedores você define o caminho do - binário de cada provedor e o padrão para todos os projetos. A linha do - projeto aberto pode sobrescrever essa escolha; **Limpar** remove a - sobrescrita, e as mudanças futuras no padrão passam a valer - automaticamente. Sem caminho definido, a sessão roda o primeiro binário do - provedor que aparece no `PATH` do seu shell de login. O - bloco Binário mostra esse arquivo e a versão dele e lista outras versões que - estejam no `PATH`, o que o `lich doctor` também avisa. Para escolher uma, - defina o caminho em Binário (a configuração `provider..bin`, por - exemplo `provider.codex.bin`). - A seção de cada provedor começa mostrando quanto ainda resta do seu plano, - quando o lich consegue ler essa informação. Os itens do rodapé se definem em - Configurações › Aparência, arrastando cada um; o custo começa oculto, porque - esse número só faz sentido se você paga por token. -- **Worktrees**: um arquivo `.worktreeinclude` no checkout do projeto ajusta - quais arquivos ignorados pelo git são copiados para cada worktree nova. -- **Hooks de sessão**: com o - [plugin do lich](https://github.com/lichdotdev/lich-plugin) instalado pelas - Configurações, a sessão dá título ao próprio card e atualiza o git assim que - grava um arquivo. -- **Estabilidade**: o que no lich é seguro usar em scripts, e o que pode mudar - em qualquer versão, está em [docs/stability.md](docs/stability.md). +- **Provedores.** Em Configurações › Provedores você define o binário de cada + agente e o padrão de todos os projetos; um projeto pode escolher o dele. Sem + caminho definido, o lich roda o primeiro binário do `PATH` do seu shell de + login, e o `lich doctor` avisa quando há mais de uma versão. +- **Rodapé.** Em Configurações › Aparência, arraste os itens para escolher o que + ele mostra. O custo começa oculto, porque só faz sentido se você paga por + token. +- **Worktrees.** Um arquivo `.worktreeinclude` no projeto escolhe quais arquivos + ignorados pelo git vão para cada worktree nova. +- **Hooks de sessão.** Instale o [plugin do lich](https://github.com/lichdotdev/lich-plugin) + pelas Configurações e a sessão dá nome ao próprio card e atualiza o git assim + que grava um arquivo. +- **Scripts.** O [docs/stability.md](docs/stability.md) diz quais partes do lich + são seguras para usar em scripts. ## Privacidade e atualizações -Tudo roda na sua máquina. Sem conta, sem login, sem telemetria: o backend é um -listener em loopback autenticado por token. Por conta própria, o lich só acessa -a rede para isto: +Tudo roda na sua máquina: sem conta, sem login, sem telemetria. O lich só acessa +a rede para: - **Atualizações**: verificação de versão no GitHub Releases ao iniciar e a - cada hora, e a lista de releases do plugin do lich no GitHub ao iniciar. + cada hora, e a lista de releases do plugin do lich ao iniciar. - **Uso do plano**: o endpoint de uso de cada provedor (Anthropic, OpenAI, - Cursor, OpenCode Go), com o login que a CLI da sessão já usa, no máximo a - cada cinco minutos. O plano do Antigravity é lido do próprio `agy`. + Cursor, OpenCode Go), com o login que o agente já usa, no máximo a cada cinco + minutos. O plano do Antigravity é lido do próprio `agy`. - **Preços**: a tabela pública de preços do LiteLLM no GitHub, uma vez, quando a tabela embutida não conhece o modelo. -A versão do instalador do Windows se atualiza sozinha; instalações por -Homebrew, Scoop, AUR ou pacote Linux atualizam pelo gerenciador de pacotes, e o -lich mostra o comando. -Configurações › Ajuda mostra o que vai no arquivo de log (caminhos, nomes de -projeto e de branch, seu login do gh, nunca um token de sessão) antes de você -anexar o log num bug report, e o `lich rage` junta esse relatório num único -arquivo, sem enviar nada. +O instalador do Windows se atualiza sozinho; Homebrew, Scoop, AUR e os pacotes +Linux atualizam pelo gerenciador de pacotes, e o lich mostra o comando. +Algo quebrou? O `lich doctor` confere a sua instalação e o `lich rage` junta um +bug report num único arquivo, sem enviar nada. Configurações › Ajuda mostra o +que vai no log (caminhos, nomes de projeto e de branch, seu login do gh, nunca +um token de sessão) antes de você anexá-lo. Bugs e pedidos vão nas +[Issues](https://github.com/lichdotdev/lich/issues); o que mudou em cada versão +está no [CHANGELOG.md](CHANGELOG.md). ## Compilar a partir do código-fonte -O lich são dois binários. O backend, `lich`, é Go puro (Go 1.27, `CGO_ENABLED=0`, -um único binário estático) e serve as sessões por um listener em loopback -autenticado por token (RPC HTTP + WebSockets). A janela, `lich-native`, é um -módulo Go próprio em `native/`, compilado com cgo: o [Gio](https://gioui.org) -desenha a janela, a `libghostty-vt` roda os terminais e o -[godemirror](https://github.com/lichdotdev/godemirror) as telas de código e diff. -Pré-requisitos: **Go 1.27.0+** e **[Task](https://taskfile.dev)**; a janela pede -também um toolchain C, os pacotes de sistema do Gio e uma `libghostty-vt` -compilada com Zig 0.16 a partir do commit do Ghostty em `native/GHOSTTY_COMMIT`. -O [`native/slice.sh`](native/slice.sh) explica como compilá-la, e o -[`docs/native-window.md`](docs/native-window.md) descreve a janela. +O lich são dois binários: o `lich`, um backend estático em Go puro, e o +`lich-native`, a janela, compilada com cgo a partir de `native/`. Você precisa +de **Go 1.27.0+** e do **[Task](https://taskfile.dev)**; a janela pede também um +toolchain C, os pacotes de sistema do Gio e uma `libghostty-vt` compilada a +partir do commit em `native/GHOSTTY_COMMIT`. O [`native/slice.sh`](native/slice.sh) +explica como, e o [`docs/native-window.md`](docs/native-window.md) descreve a +janela. ```bash task build # binário do backend -> bin/lich task build:native # janela -> bin/lich-native task run # compila + roda task test # suítes Go +task package # .deb + .rpm + Arch .pkg.tar.zst em bin/ (precisa do nfpm) ``` -Para empacotar um release Linux localmente (precisa do -[nfpm](https://nfpm.goreleaser.com/)): - -```bash -task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ -``` - -Adicionar mais uma CLI de agente às oito que o lich roda é a mudança que mexe -em uma dúzia de arquivos de dois repositórios, e o mapa está em -[`docs/adding-a-provider.md`](docs/adding-a-provider.md). +Adicionar outro agente mexe em uma dúzia de arquivos de dois repositórios, e o +mapa está em [`docs/adding-a-provider.md`](docs/adding-a-provider.md). ## Patrocinadores diff --git a/README.ru.md b/README.ru.md index 211170734..66ca2691b 100644 --- a/README.ru.md +++ b/README.ru.md @@ -2,108 +2,127 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

Терминальная ADE для ИИ-агентов, которыми вы уже пользуетесь.

-

- Открывайте проекты, запускайте Claude Code, Codex, opencode и других агентов - в настоящих терминалах и держите git (worktree, diff и pull request'ы) перед - глазами, не выходя из окна. Без Electron и без браузера: lich рисует - собственное нативное окно на Gio, на Linux, Windows и macOS. -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ Ваши ИИ-агенты бок о бок, каждый в своей ветке.
+ Claude Code, Codex, opencode или тот агент, которым вы уже пользуетесь: у каждого свой worktree, и всё в одном окне. +

+

Скачать lich · lichdotdev.github.io/lich

Четыре сессии Claude Code рядом на одном экране, каждая в своём git worktree. В боковой панели видны их ветки и значок diff, а внизу запущенные сервисы проекта и профиль; на нижней панели ветка, модель и подписка - + -## Почему lich - -С lich можно: - -- **Запускать агента, который у вас уже есть.** [Claude Code](https://www.anthropic.com/claude-code), - [Codex](https://github.com/openai/codex), Antigravity, - [opencode](https://github.com/sst/opencode), oh-my-pi, - [Crush](https://github.com/charmbracelet/crush), - [Cursor CLI](https://cursor.com/docs/cli) и - [Kiro CLI](https://kiro.dev/docs/cli/) работают здесь одинаково. Один раз - укажите lich путь к исполняемому файлу каждого из них, а потом выберите агента - по умолчанию или выбирайте его для каждой сессии. Что lich может прочитать - *из* сессии, зависит от провайдера: всё сведено в таблицу - [Поддержка провайдеров](#поддержка-провайдеров). -- **Работать в настоящем терминале.** Оболочки на PTY, по нескольку на проект, - с отрисовкой на GPU и историей прокрутки с поиском, которая переживает закрытие - и повторное открытие окна. То, что проект держит запущенным (dev-сервер, - туннель, `lazydocker`), сохраняется один раз как сервис: его запускают, - останавливают и читают внизу боковой панели, и он может стартовать вместе с - lich. Нижняя панель следит за `cd` - и показывает ветку, а в сессиях Claude Code, Codex и Kiro CLI ещё и модель с - текущим окном контекста. Для Claude Code, Codex, Antigravity, Cursor CLI и - подписки OpenCode Go там же видно, сколько осталось в скользящем окне лимитов - вашей подписки, а если захотите, то и сколько потратила сессия (у провайдеров, - которые это записывают). -- **Поручать задачи одной сессии из другой.** Передайте задачу другой карточке, - и её агент сам запишет ответ обратно, что бы ни было запущено на каждой из - сторон. До других сессий агент добирается через инструменты, которые получает - при запуске (MCP для Claude Code и Codex), или через плагин. Всё это доступно - и как команда `lich` в любой оболочке, включая `--json`, так что скрипт может - управлять сессией вообще без агента ([`docs/cli.md`](docs/cli.md)). -- **Следить за несколькими сразу.** Выведите любую сессию на экран рядом с той, - в которой вы работаете, и lich сам разложит панели с учётом их количества и - свободного места в окне: восемь сессий встанут по четыре в ряд на ультрашироком - мониторе и по две на ноутбуке. Сессия, которая раздала работу другим, собирает - экран вокруг себя одним щелчком. У каждого экрана есть имя, в проекте их может - быть сколько угодно, и у каждого есть свой блок в боковой панели: его можно - свернуть, переименовать или разобрать. -- **Создавать worktree без возни с настройкой.** Создайте worktree от любой - базовой ветки, и lich скопирует в него ваши `.env*`-файлы, игнорируемые git, - и выделит ему порт для dev-сервера, который не занят ни другим checkout, ни - каким-либо процессом на машине. Если начать с незакоммиченных изменений checkout, они переедут - вместе с ним, включая неотслеживаемые файлы. -- **Запускать сессию в изоляции.** Агента можно открыть в песочнице ОС: чистый - пустой домашний каталог, в котором есть только собственное состояние этого - провайдера, остальная система доступна только для чтения, а писать можно лишь - в checkout, для которого открыта сессия. Ваших ssh-ключей, облачных учётных - данных и остальных репозиториев на диске там просто нет. Это противовес тому, - что агенту разрешено пропускать запросы разрешений. На Linux это bubblewrap, - на macOS `sandbox-exec`. От вредоносного кода песочница не защищает, и - [`docs/ceilings.md`](docs/ceilings.md) описывает, чего именно она не - останавливает. -- **Проводить ревью diff там же, где вы его читаете.** Панель diff - показывает рабочие изменения рядом с живым деревом файлов, по запросу - сворачивает правки, в которых поменялись только пробелы, и показывает - изменённое изображение или PDF в версиях до и после. Щёлкните правой кнопкой - по выделению, чтобы прокомментировать эти строки: все комментарии вставятся в - сессию одним промптом, но отправлены не будут. На вкладке «Код» можно - просматривать checkout и искать по тексту его файлов. -- **Работать с pull request'ами прямо здесь.** Откройте список открытых pull - request'ов репозитория, возьмите любой в отдельный worktree, прочитайте diff, - оставьте ревью прямо в коде и смёржите его тем способом, который базовая ветка - действительно принимает. На ветке, где pull request'а ещё нет, кнопка - **Создать с агентом** попросит сессию этой ветки открыть его, и ничего не - уйдёт, пока вы не нажмёте Enter. - -А ещё: [темы](docs/themes.md), которые импортируются как JSON или -устанавливаются из git-репозитория; палитра по `Ctrl`/`Cmd`+`K`, которая -открывает сессию по имени или по тому, что в ней обсуждалось; уведомление на -рабочем столе, когда сессия ждёт вас; и `lich rage` / `lich doctor` на случай, -если lich вообще не запускается. - -Проект активно развивается: об ошибках и с пожеланиями пишите в -[Issues](https://github.com/lichdotdev/lich/issues), а что изменилось в каждой -версии, смотрите в [CHANGELOG.md](CHANGELOG.md). +## Возможности + + + + + + + + + + + + + + + + + + + + + + +
+ +### Агенты бок о бок + +Выведите сессии на один экран, и lich сам разложит панели. С первого взгляда видно, какая сессия занята, какая ждёт вас и сколько контекста у неё осталось. + +Сессии Claude Code и Codex на одном экране, каждая в своей ветке
+ +### Worktree под каждую задачу, без настройки + +Создайте сессию от любой базовой ветки, и lich скопирует ваши `.env`-файлы и выделит ей свободный порт для dev-сервера. Незакоммиченные изменения можно взять с собой. + +Сессии в боковой панели, у каждой своя ветка и значок diff
+ +### Читайте diff, комментируйте строки + +Смотрите, что изменил агент, рядом с его сессией, комментируйте строки, которые нужно доработать, и отправляйте все заметки назад одним промптом. + +Diff с двумя комментариями к строкам, готовыми к отправке в сессию
+ +### Pull request'ы без браузера + +Откройте pull request, попросите агента ветки написать его, прочитайте прямо в коде и смёржите, не выходя из того же окна. + +Открытый в lich pull request: дерево файлов, diff и ожидающий комментарий ревью
+ +### Настройте под себя + +Импортируйте тему как JSON или установите её из git-репозитория. + +[Документация →](docs/themes.md) + +Настройки оформления: выбор темы, шрифты и состав нижней панели
+ +А ещё: + +- **Сессии, которые делегируют.** Один агент передаёт задачу другой сессии и получает ответ обратно. То же работает из вашей оболочки через команду `lich` ([документация](docs/cli.md)). +- **Агенты в песочнице.** Позвольте агенту пропускать запросы разрешений внутри песочницы, где не видны ваши ключи, учётные данные и остальные репозитории ([ограничения](docs/ceilings.md)). +- **Ваши dev-серверы в боковой панели.** Сохраните то, что проект держит запущенным, и запускайте или останавливайте это одним щелчком. +- **Поиск по всему.** `Ctrl`/`Cmd`+`K` открывает сессию по имени или по тому, что в ней обсуждалось. +- **Знайте, когда вы нужны.** Уведомление на рабочем столе, когда сессия ждёт вас. + +## Установка + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +Одна строка: она определит ваш дистрибутив, проверит загрузку и установит lich через ваш пакетный менеджер. + +| Платформа | Где взять | +| --- | --- | +| **Linux** | `install.sh` выше или AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`). Нужны `zenity` и glibc 2.34 или новее (Debian 12, Ubuntu 22.04, RHEL 9 и новее). | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | Установщик или portable zip со страницы [Releases](https://github.com/lichdotdev/lich/releases) либо `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +Сборки для macOS и Windows пока не подписаны, поэтому Gatekeeper и SmartScreen +предупреждают о файле, скачанном со страницы Releases; при установке через +Homebrew запроса Gatekeeper нет. Пакеты под отдельные дистрибутивы, tarball для +Linux, снятие флага карантина и переход со старой формулы Homebrew описаны в +[INSTALL.md](INSTALL.md). + +## Быстрый старт + +1. **Откройте проект.** Кнопка `+` на панели вкладок показывает недавно + закрытые проекты и открывает диалог выбора папки. Выберите git-репозиторий. +2. **Выберите агента.** При первом запуске lich покажет агентов, которых нашёл на + вашей машине. В разделе Настройки › Провайдеры задаются агент по умолчанию и + путь к исполняемому файлу каждого. +3. **Запустите сессию.** Кнопка *Новая сессия* открывает вашего агента в проекте. + Кнопка `+` в заголовке checkout открывает любого агента или обычный терминал + именно в этом checkout. +4. **Создайте worktree** *(по желанию)* от любой базовой ветки: lich откроет в + нём новую сессию. ## Поддержка провайдеров -Любой провайдер запускается в настоящем терминале, возобновляется по -идентификатору разговора, работает в той же песочнице и получает тот же доступ к -остальным вашим сессиям. Отличается то, что lich может *прочитать* из сессии: -он читает то, что записывает сам CLI, а записывают они все разное. +Каждый агент работает в настоящем терминале, возобновляет свой разговор, работает +в песочнице и добирается до ваших остальных сессий. Отличается то, что lich может +прочитать из сессии, потому что каждый CLI записывает своё. + +
+Что поддерживает каждый агент | Что вы получаете | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -149,111 +168,61 @@ | При запуске агент получает указание на языке промптов раздавать работу сессиям lich, а не скрытым субагентам | да | нет | нет | нет | да | нет | нет | нет | | Карточка сессии открывает браузер, которым управляет агент, во вкладке рядом с сессией | да | да | да | карточка открывает; агент вызывает `lich browser`, а не инструменты `browser_*` | да | да | да | да | -Все пробелы намеренные: ни в одном из них lich не скрывает того, что сообщает -CLI, а что именно измерялось за каждым, описано в -[`docs/ceilings.md`](docs/ceilings.md). - -## Установка - -Одна команда сама определит ваш дистрибутив, проверит контрольную сумму и -установит нативный пакет с зависимостями через ваш пакетный менеджер: +
-```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| Платформа | Где взять | Что нужно для работы | -| --- | --- | --- | -| **Linux** | `install.sh` выше или AUR [`lich-bin`](https://aur.archlinux.org/packages/lich-bin) (`yay -S lich-bin`) | `zenity`, а также glibc 2.34 или новее для окна из пакета (Debian 12, Ubuntu 22.04, RHEL 9 и новее) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | ничего, окно уже входит в приложение, как на Apple Silicon, так и на Intel | -| **Windows** | установщик или portable zip со страницы [Releases](https://github.com/lichdotdev/lich/releases) либо Scoop: `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | ничего, окно есть в каждом из вариантов | - -Пакеты для ручной установки под отдельные дистрибутивы, tarball для Linux и -portable zip для Windows описаны в [INSTALL.md](INSTALL.md). Бинарники для macOS -и Windows не подписаны, поэтому Gatekeeper и SmartScreen будут предупреждать, -пока не появятся нотаризация и подпись. При установке через Homebrew запроса -Gatekeeper не будет, а у файла, скачанного со страницы Releases, флаг карантина -нужно снять вручную. -На macOS cask ставит `Lich.app`, так что у lich есть своя иконка в -`/Applications` и в Dock, пока он запущен. Чтобы перейти со старой формулы, -сначала выполните `brew uninstall lich`; зачем, объясняет [INSTALL.md](INSTALL.md). - -## Быстрый старт - -1. **Установите** и запустите `lich`. -2. **Откройте проект.** Кнопка `+` на панели вкладок показывает недавно - закрытые проекты и открывает системный диалог выбора папки; выберите - git-репозиторий. -3. **Укажите lich своего агента.** При первом запуске lich покажет агентов, - которых нашёл на вашей машине; в разделе Настройки › Провайдеры можно задать - путь к исполняемому файлу каждого и выбрать агента по умолчанию. На том же - экране для проекта можно оставить этот выбор или указать другого провайдера. -4. **Запустите сессию.** Кнопка *Новая сессия* открывает в проекте терминал с - вашим агентом. В заголовке каждого checkout есть ещё меню `+`: через него - можно открыть любого включённого провайдера или обычный терминал именно в - этом checkout. Щелчок по самому заголовку сворачивает и разворачивает его - сессии. -5. **Создайте worktree** *(по желанию)* от любой базовой ветки: lich подготовит - его и откроет в нём новую сессию. +Все пробелы намеренные: что именно измерялось за каждым из них, описано в +[`docs/ceilings.md`](docs/ceilings.md). ## Настройка -- **Провайдеры**: путь к исполняемому файлу каждого провайдера и провайдер по - умолчанию для всех проектов задаются в разделе Настройки › Провайдеры. Строка - открытого проекта там может переопределить этот выбор; **Сбросить** убирает - переопределение, и дальнейшие изменения значения по умолчанию снова - применяются автоматически. Если путь не задан, сессия запускает первый - исполняемый файл провайдера, найденный в `PATH` вашей login-оболочки. Блок «Исполняемый файл» показывает этот файл и его версию, а - также все остальные версии, найденные в `PATH`; о них предупреждает и - `lich doctor`. Чтобы выбрать конкретную, укажите её путь в блоке - «Исполняемый файл» (настройка `provider..bin`, например `provider.codex.bin`). - Раздел провайдера начинается - с того, сколько осталось от лимитов подписки, если lich может это прочитать. - Что показывает нижняя панель, настраивается в разделе Настройки › Оформление - перетаскиванием её элементов; стоимость по умолчанию скрыта, потому что эта +- **Провайдеры.** В разделе Настройки › Провайдеры задаются путь к исполняемому + файлу каждого агента и агент по умолчанию для всех проектов; проект может + выбрать свой. Если путь не задан, lich запускает первый исполняемый файл из + `PATH` вашей login-оболочки, а `lich doctor` предупреждает, если версий + несколько. +- **Нижняя панель.** В разделе Настройки › Оформление перетаскиванием элементов + выбирается, что она показывает. Стоимость по умолчанию скрыта, потому что эта цифра имеет смысл, только если вы платите за токены. -- **Worktree**: файл `.worktreeinclude` в checkout проекта задаёт, какие файлы, - игнорируемые git, копируются в новый worktree. -- **Хуки сессии**: если установить из настроек - [плагин lich](https://github.com/lichdotdev/lich-plugin), сессия сама даёт - название своей карточке и обновляет статус git сразу, как только записывает файл. -- **Стабильность**: какие части lich можно спокойно использовать в скриптах, а - какие могут измениться в любом релизе, описано в [docs/stability.md](docs/stability.md). +- **Worktree.** Файл `.worktreeinclude` в проекте задаёт, какие файлы, + игнорируемые git, попадут в новый worktree. +- **Хуки сессии.** Установите [плагин lich](https://github.com/lichdotdev/lich-plugin) + из настроек, и сессия сама даст название своей карточке и обновит статус git + сразу, как только запишет файл. +- **Скрипты.** В [docs/stability.md](docs/stability.md) сказано, какие части lich + можно спокойно использовать в скриптах. ## Конфиденциальность и обновления -Всё работает на вашей машине. Ни аккаунта, ни входа, ни телеметрии: бэкенд — -это loopback-слушатель с аутентификацией по токену. Сам lich выходит в сеть -только за следующим и больше ни за чем: +Всё работает на вашей машине: ни аккаунта, ни входа, ни телеметрии. lich выходит +в сеть только за следующим: - **Обновления**: проверка версии в GitHub Releases при запуске и раз в час, а - также список релизов плагина lich на GitHub при запуске. + также список релизов плагина lich при запуске. - **Лимиты подписки**: собственный эндпоинт каждого провайдера с данными об использовании (Anthropic, OpenAI, Cursor, OpenCode Go), с тем логином, который - уже использует CLI сессии, не чаще раза в пять минут. Подписку Antigravity - lich узнаёт у самого `agy`. + уже использует агент, не чаще раза в пять минут. Подписку Antigravity lich + узнаёт у самого `agy`. - **Цены**: публичная таблица цен LiteLLM на GitHub, один раз для модели, которой нет во встроенной таблице. Версия из установщика для Windows обновляется на месте; установки через Homebrew, Scoop, AUR или пакет Linux обновляются своим пакетным менеджером, и lich подскажет нужную команду. -Раздел Настройки › Справка ещё до того, как вы приложите файл журнала к отчёту -об ошибке, показывает, что в нём есть: пути, названия проектов и веток, ваш -логин gh, но никогда не токен сессии. А `lich rage` собирает такой отчёт в один -архив и ничего никуда не загружает. +Что-то сломалось? `lich doctor` проверит вашу настройку, а `lich rage` соберёт +отчёт об ошибке в один архив и ничего никуда не загрузит. Раздел Настройки › +Справка ещё до того, как вы приложите файл журнала, показывает, что в нём есть: +пути, названия проектов и веток, ваш логин gh, но никогда не токен сессии. Об +ошибках и с пожеланиями пишите в +[Issues](https://github.com/lichdotdev/lich/issues), а что изменилось в каждой +версии, смотрите в [CHANGELOG.md](CHANGELOG.md). ## Сборка из исходников -lich состоит из двух бинарников. Бэкенд, `lich`, написан на чистом Go (Go 1.27, -`CGO_ENABLED=0`, один статический бинарник) и обслуживает сессии через -loopback-слушатель с аутентификацией по токену (HTTP RPC + WebSocket). Окно, -`lich-native`, это отдельный Go-модуль в `native/`, собираемый с cgo: его рисует -[Gio](https://gioui.org), терминалы работают на `libghostty-vt`, а просмотр кода и -diff на [godemirror](https://github.com/lichdotdev/godemirror). Понадобятся +lich состоит из двух бинарников: `lich`, статический бэкенд на чистом Go, и +`lich-native`, окно, которое собирается с cgo из `native/`. Понадобятся **Go 1.27.0+** и **[Task](https://taskfile.dev)**; для окна нужны ещё компилятор -C, системные пакеты Gio и `libghostty-vt`, собранная Zig 0.16 из коммита Ghostty, -указанного в `native/GHOSTTY_COMMIT`. Как её собрать, описано в +C, системные пакеты Gio и `libghostty-vt`, собранная из коммита, указанного в +`native/GHOSTTY_COMMIT`. Как её собрать, описано в [`native/slice.sh`](native/slice.sh), а само окно в [`docs/native-window.md`](docs/native-window.md). @@ -262,18 +231,11 @@ task build # бинарник бэкенда -> bin/lich task build:native # окно -> bin/lich-native task run # сборка + запуск task test # тесты Go +task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ (нужен nfpm) ``` -Чтобы собрать релиз для Linux локально, нужен -[nfpm](https://nfpm.goreleaser.com/): - -```bash -task package # .deb + .rpm + Arch .pkg.tar.zst in bin/ -``` - -Добавить ещё один агентный CLI к восьми, которые уже запускает lich, — это -единственное изменение, которое затрагивает дюжину файлов в двух репозиториях; -карта всех мест — [`docs/adding-a-provider.md`](docs/adding-a-provider.md). +Добавление ещё одного агента затрагивает дюжину файлов в двух репозиториях: +карта всех мест: [`docs/adding-a-provider.md`](docs/adding-a-provider.md). ## Спонсоры diff --git a/README.zh-CN.md b/README.zh-CN.md index 7586b85b9..a9eef3f68 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -2,85 +2,121 @@ lich

lich

English · Português (Brasil) · Español · 简体中文 · 日本語 · 한국어 · Русский

-

终端优先的 ADE,接入你正在用的 AI 编程智能体。

-

- 打开项目,在真正的终端里运行 Claude Code、Codex、opencode 等智能体,git 也一直在 - 眼前:worktree、diff 和 Pull Request,都不用离开这个窗口。不用 Electron,也不用浏览器: - 在 Linux、Windows 和 macOS 上,lich 都用 Gio 绘制自己的原生窗口。 -

-

lichdotdev.github.io/lich

Release - Go - Window Platform License Sponsor

+

+ 让编程智能体并排运行,各自在自己的分支上。
+ Claude Code、Codex、opencode,或者你已经在用的智能体,各自在独立的 worktree 里,全都在同一个窗口中。 +

+

下载 lich · lichdotdev.github.io/lich

同一分屏里并排的四个 Claude Code 会话,各自在独立的 git worktree 里;侧栏列出每个会话的分支和 diff 标记,底部是项目正在运行的服务和当前 profile;底栏显示分支、模型和套餐 - + -> 本文档译自英文 [README.md](README.md)。英文版是唯一的事实来源;两者不一致时,以英文版为准。 - -## 为什么选 lich - -用 lich,你可以: - -- **直接用你手上的智能体。** [Claude Code](https://www.anthropic.com/claude-code)、 - [Codex](https://github.com/openai/codex)、Antigravity、 - [opencode](https://github.com/sst/opencode)、oh-my-pi、 - [Crush](https://github.com/charmbracelet/crush)、 - [Cursor CLI](https://cursor.com/docs/cli) 和 - [Kiro CLI](https://kiro.dev/docs/cli/) 在 lich 里的运行方式完全相同。每个智能体的 - 可执行文件只需指定一次,之后可以设一个默认,也可以每个会话单独选。lich 能从会话里 - *读出*哪些信息,各智能体不尽相同,详见[各智能体支持情况](#各智能体支持情况)一表。 -- **用的是真正的终端。** shell 由 PTY 驱动,每个项目可以开多个,用 GPU 渲染;滚动 - 缓冲区支持搜索,关掉窗口再打开也不会丢。项目要一直开着的东西(开发服务器、隧道、 - `lazydocker`)保存一次就成了服务,在侧栏底部启动、停止、查看输出,也可以随 lich - 一起启动。底栏会跟着 `cd` 切换目录并显示当前分支;Claude Code、Codex 和 Kiro CLI - 会话还会显示模型和上下文窗口用量;Claude Code、Codex、Antigravity、Cursor CLI 和 - OpenCode Go 订阅会显示套餐滚动窗口还剩多少额度;如果你需要,还能显示会话花了多少钱, - 前提是该智能体记录了这项数据。 -- **让会话之间互派任务。** 把任务交给另一张卡片,由那张卡片上的智能体写回答案,两边跑的 - 是什么智能体都可以:智能体通过启动时注入的工具访问其他会话,Claude Code 和 Codex 用 - MCP,其余的由插件提供。这整套能力在任何 shell 里也都能通过 `lich` 命令使用,同样支持 - `--json`,脚本不需要智能体参与就能操控会话([`docs/cli.md`](docs/cli.md))。 -- **同时盯住好几个会话。** 把任意会话放到当前会话旁边组成分屏,lich 会根据面板数量和 - 窗口大小自动排版:八个会话在超宽屏上排成两行、每行四个,在笔记本上每行两个。派出过任务 - 的会话,点一下就能把相关会话围着它排好。每个分屏都有名字,一个项目可以保存任意多个, - 每个分屏在侧栏里占一块,可以折叠、重命名或拆散。 -- **一键开 worktree,免去准备工作。** 从任意基础分支创建 worktree,lich 会复制被 - gitignore 忽略的 `.env*` 文件,并分配一个其他检出和本机任何进程都没在用的开发服务器端口。 - 如果从当前检出里未提交的改动开始,这些改动 - 也会一并带过去,包括未跟踪的文件。 -- **在沙箱里跑会话。** 智能体可以在操作系统沙箱里启动:全新的空 home 目录,里面只有该 - 智能体自己的状态,机器其余部分只读,只有打开它的那个检出目录可写。你的 ssh 密钥、云服务 - 凭据和磁盘上的其他仓库,在沙箱里根本看不到;放手让智能体跳过权限确认时,这就是对应的 - 防护。Linux 上用 bubblewrap,macOS 上用 `sandbox-exec`;它不能用来防御恶意代码, - 它拦不住哪些事,见 [`docs/ceilings.md`](docs/ceilings.md)。 -- **在原处审查 diff。** diff 面板在实时文件树旁显示工作区改动,可以按需折叠只改了 - 空白的部分,改过的图片或 PDF 会对比显示改动前后。选中内容后右键,就能针对这些行写评论; - 这批评论会合成一条 prompt 粘贴到会话里,但不会自动发送。面板的“代码”标签页可以浏览 - 检出目录,并搜索文件内容。 -- **在这里完成 Pull Request。** 列出仓库里开着的 PR,把其中一个检出到独立的 worktree, - 然后阅读 diff、直接在 lich 里审查并合并,可选的合并方式就是基础分支实际允许的那些。 - 在还没有 PR 的分支上,点 **让智能体创建** 会请该分支的会话去开一个,你按回车之前什么 - 都不会发出去。 - -此外还有:[主题](docs/themes.md),可以导入 JSON,也可以从 git 仓库安装;`Ctrl`/`Cmd`+`K` -命令面板,可以按名称或聊过的内容跳到会话;会话等你回复时弹出桌面通知;以及 lich 完全 -起不来时用的 `lich rage` / `lich doctor`。 - -项目正在积极开发中:bug 和功能需求请提交到 -[Issues](https://github.com/lichdotdev/lich/issues),各版本的改动见 -[CHANGELOG.md](CHANGELOG.md)。 +## 功能 + + + + + + + + + + + + + + + + + + + + + + +
+ +### 智能体并排运行 + +把会话放到同一个分屏里,lich 替你排好各个面板。哪个在忙、哪个在等你、还剩多少上下文,一眼就能看出来。 + +同一分屏里的 Claude Code 和 Codex 会话,各自在自己的分支上
+ +### 每个任务一个 worktree,无需准备 + +从任意基础分支开出一个会话,lich 会复制你的 `.env` 文件,并分配一个空闲的开发服务器端口。尚未提交的改动也可以一起带过去。 + +侧栏里的会话,每个都有自己的分支和 diff 标记
+ +### 审查 diff,逐行评论 + +在会话旁边看智能体改了什么,给需要返工的行写评论,再把所有评论合成一条 prompt 发回去。 + +一份 diff,其中两条行评论排队等待发送到会话
+ +### 不开浏览器也能处理 Pull Request + +创建 Pull Request,请该分支的智能体来写,直接在 diff 里审查,再合并,全程不离开这个窗口。 + +在 lich 里打开的 Pull Request,带有文件树、diff 和一条待提交的审查评论
+ +### 做成你喜欢的样子 + +可以导入 JSON 主题,也可以从 git 仓库安装。 + +[文档 →](docs/themes.md) + +外观设置,里面有主题选择、字体和底栏布局
+ +此外还有: + +- **会话之间互派任务。** 一个智能体把任务交给另一个会话,再拿回答案。在 shell 里用 `lich` 命令也能做到同样的事([文档](docs/cli.md))。 +- **沙箱里的智能体。** 让智能体在沙箱里跳过权限确认,沙箱看不到你的密钥、凭据和其他仓库([限制](docs/ceilings.md))。 +- **开发服务器就在侧栏。** 保存项目需要一直开着的东西,一键启动或停止。 +- **什么都找得到。** `Ctrl`/`Cmd`+`K` 可以按名称或聊过的内容跳到会话。 +- **需要你时会知会你。** 会话在等你回复时,弹出桌面通知。 + +## 安装 + +```bash +curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh +``` + +一行命令即可:脚本会识别你的发行版、校验下载内容,再通过包管理器安装 lich。 + +| 平台 | 获取方式 | +| --- | --- | +| **Linux** | 上面的 `install.sh`,或 AUR 的 [`lich-bin`](https://aur.archlinux.org/packages/lich-bin)(`yay -S lich-bin`)。需要 `zenity` 和 glibc 2.34 或更高版本(Debian 12、Ubuntu 22.04、RHEL 9 及以上)。 | +| **macOS** | `brew install --cask lichdotdev/tap/lich` | +| **Windows** | 从 [Releases](https://github.com/lichdotdev/lich/releases) 下载安装程序或便携版 zip,或用 `scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | + +macOS 和 Windows 的构建还没有签名,所以从 Releases 下载时 Gatekeeper 和 SmartScreen +会弹出警告;用 Homebrew 安装则不会触发 Gatekeeper 提示。各发行版的软件包、Linux +tarball、清除隔离标记,以及从旧的 Homebrew formula 升级,见 [INSTALL.md](INSTALL.md)。 + +## 快速上手 + +1. **打开项目。** 标签栏里的 `+` 会列出最近关闭的项目,并打开文件夹选择器。选一个 git + 仓库即可。 +2. **选择智能体。** 首次启动会列出在你机器上找到的智能体。设置 › 提供商里可以设置默认智能体, + 以及每个可执行文件的路径。 +3. **开启会话。** *新建会话*会在项目里打开你的智能体。每个检出目录标题栏上的 `+`, + 可以在该检出目录里打开任意智能体或普通终端。 +4. **给它一个 worktree** *(可选)*。从任意基础分支创建,lich 会在其中打开一个新会话。 ## 各智能体支持情况 -每个智能体都在真实终端里启动,都按对话 id 恢复,都用同一套沙箱隔离,访问其他会话的方式也 -相同。区别在于 lich 能从会话里*读出*什么:lich 读取的是各 CLI 自己写下的记录,而每家 -记录的内容都不一样。 +每个智能体都在真实终端里运行,都能恢复对话,都能在沙箱里工作,也都能访问你的其他会话。 +区别在于 lich 能从会话里*读出*什么,因为每个 CLI 记录的内容都不一样。 + +
+查看各智能体支持什么 | 功能 | Claude Code | Codex | Antigravity | opencode | oh-my-pi | Crush | Cursor CLI | Kiro CLI | | --- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | @@ -126,85 +162,45 @@ | 启动时用提示词语言告诉智能体,要把工作分派成 lich 会话,而不是看不见的子智能体 | 有 | 无 | 无 | 无 | 有 | 无 | 无 | 无 | | 会话卡片在会话旁的标签页中打开一个由智能体操作的浏览器 | 有 | 有 | 有 | 卡片会打开;智能体用 `lich browser`,而不是 `browser_*` 工具 | 有 | 有 | 有 | 有 | -每一处差异都是有意为之,没有一处是 CLI 报告了而 lich 不显示;每一处背后实测了什么,见 -[`docs/ceilings.md`](docs/ceilings.md)。 - -## 安装 - -一行命令即可:脚本会识别你的发行版、校验 checksum,再通过包管理器安装原生软件包及其依赖: +
-```bash -curl -fsSL https://raw.githubusercontent.com/lichdotdev/lich/main/install.sh | sh -``` - -| 平台 | 安装方式 | 运行时依赖 | -| --- | --- | --- | -| **Linux** | 上面的 `install.sh`,或 AUR 的 [`lich-bin`](https://aur.archlinux.org/packages/lich-bin)(`yay -S lich-bin`) | `zenity`;软件包自带的窗口需要 glibc 2.34 或更高版本(Debian 12、Ubuntu 22.04、RHEL 9 及以上) | -| **macOS** | `brew install --cask lichdotdev/tap/lich` | 无,Apple Silicon 和 Intel 上窗口都随应用附带 | -| **Windows** | 从 [Releases](https://github.com/lichdotdev/lich/releases) 下载安装程序或便携版 zip,或用 Scoop:`scoop install https://github.com/lichdotdev/lich/releases/latest/download/lich.json` | 无,两种方式都自带窗口 | - -各发行版的手动安装包、Linux tarball 和 Windows 便携版 zip 见 [INSTALL.md](INSTALL.md)。macOS 和 -Windows 的二进制文件没有签名,在公证和签名上线之前,Gatekeeper 和 SmartScreen 会弹出警告。 -用 Homebrew 安装不会触发 Gatekeeper 提示;从 Releases 页面下载的则需要手动清除隔离标记。 -macOS 上 cask 会安装 `Lich.app`,所以 lich 在 `/Applications` 和运行时的 Dock 里都有自己的 -图标。从旧的 formula 升级,需要先执行 `brew uninstall lich`,原因见 [INSTALL.md](INSTALL.md)。 - -## 快速上手 - -1. **安装**并启动 `lich`。 -2. **打开项目**:标签栏里的 `+` 会列出最近关闭的项目,并打开系统的文件夹选择器;选一个 - git 仓库即可。 -3. **为 lich 指定智能体**:首次启动时会列出在你机器上找到的智能体;之后可以在 - 设置 › 提供商里设置每个智能体的可执行文件路径,并选定默认智能体。每个项目可以沿用 - 默认,也可以在同一界面里改选别的智能体。 -4. **开启会话**:*新建会话*会在项目里打开一个终端并运行你的智能体。每个检出目录的标题栏 - 也有一个 `+` 菜单,可以直接在该检出目录里打开任意已启用的智能体或普通终端;点击标题栏 - 本身可以折叠或展开其下的会话。 -5. **新建 worktree** *(可选)*:从任意基础分支创建;lich 准备好文件后,会直接带你进入 - 一个新会话。 +每一处差异都是有意为之,每一处背后实测了什么,见 [`docs/ceilings.md`](docs/ceilings.md)。 ## 配置 -- **智能体**:在设置 › 提供商里设置每个智能体的可执行文件路径,以及所有项目的默认智能体。 - 当前项目在那里的那一行可以覆盖这个选择;点**清除**会去掉覆盖,之后默认值的改动就会自动 - 生效。没有设置路径时,会话会运行登录 shell 的 `PATH` 里找到的第一个该智能体可执行文件; - “可执行文件”一栏会显示具体是哪个文件及其版本,并列出 `PATH` 里的其他版本, - `lich doctor` 也会对此发出警告。要指定其中一个,在“可执行文件”里填写它的路径(对应设置项 - `provider..bin`,例如 `provider.codex.bin`)。 - 只要 lich 能读到套餐信息,智能体那一节开头就会显示套餐剩余额度。底栏显示哪些内容,在 - 设置 › 外观里拖动各项来调整;花费默认隐藏,因为只有按 token 计费时这个数字才有意义。 -- **Worktree**:项目检出目录里的 `.worktreeinclude` 文件可以调整哪些被 gitignore 忽略的文件 - 会被复制到新 worktree。 -- **会话钩子**:在设置里安装 [lich 插件](https://github.com/lichdotdev/lich-plugin)后, +- **智能体。** 在设置 › 提供商里设置每个智能体的可执行文件路径,以及所有项目的默认智能体; + 项目也可以选自己的。没有设置路径时,lich 会运行登录 shell 的 `PATH` 里找到的第一个可执行文件, + `PATH` 里有多个版本时 `lich doctor` 会发出警告。 +- **底栏。** 在设置 › 外观里拖动各项,选择底栏显示什么。花费默认隐藏,因为只有按 token 计费时 + 这个数字才有意义。 +- **Worktree。** 项目里的 `.worktreeinclude` 文件决定哪些被 gitignore 忽略的文件会被复制到新 + worktree。 +- **会话钩子。** 在设置里安装 [lich 插件](https://github.com/lichdotdev/lich-plugin)后, 会话会自动给自己的卡片起标题,并在写入文件时立即刷新 git 状态。 -- **稳定性**:lich 哪些部分可以放心用脚本调用、哪些在任何版本里都可能变动,见 - [docs/stability.md](docs/stability.md)。 +- **脚本调用。** [docs/stability.md](docs/stability.md) 说明了 lich 的哪些部分可以放心用脚本调用。 ## 隐私与更新 -一切都在你的机器上运行。不需要账号,不需要登录,没有遥测:后端只监听本地回环地址,并用 -token 鉴权。lich 自己只会为下面这几件事联网,别的一概不连: +一切都在你的机器上运行:不需要账号,不需要登录,没有遥测。lich 只会为下面这几件事联网: -- **更新**:启动时和之后每小时向 GitHub Releases 检查一次新版本,启动时还会读取 GitHub 上 - lich 插件的发布列表。 -- **套餐用量**:使用会话 CLI 已有的登录,查询各智能体自己的用量接口(Anthropic、OpenAI、 - Cursor、OpenCode Go),最多每五分钟一次。Antigravity 的套餐信息直接从 `agy` 读取。 +- **更新**:启动时和之后每小时向 GitHub Releases 检查一次新版本,启动时还会读取 lich 插件的发布列表。 +- **套餐用量**:使用智能体已有的登录,查询各提供商自己的用量接口(Anthropic、OpenAI、Cursor、 + OpenCode Go),最多每五分钟一次。Antigravity 的套餐信息直接从 `agy` 读取。 - **价格**:GitHub 上 LiteLLM 的公开价格表,只在内置价格表里没有某个模型时下载一次。 -Windows 安装程序装的版本会自动原地更新;通过 Homebrew、Scoop、AUR 或 Linux 软件包安装的, +Windows 安装程序装的版本会原地更新;通过 Homebrew、Scoop、AUR 或 Linux 软件包安装的, 则通过对应的包管理器更新,lich 会给出要执行的命令。 -在你把日志附到 bug 报告之前,设置 › 帮助会说明日志文件里有哪些内容:路径、项目名和分支名、 -你的 gh 登录名,但绝不包含会话 token;`lich rage` 会把这份报告打包成一个压缩文件,不会上传 -任何内容。 +出了问题?`lich doctor` 会检查你的环境,`lich rage` 会把 bug 报告打包成一个压缩文件,不会上传 +任何内容。在你把日志附上去之前,设置 › 帮助会说明日志里有哪些内容(路径、项目名和分支名、 +你的 gh 登录名,绝不包含会话 token)。bug 和功能需求请提交到 +[Issues](https://github.com/lichdotdev/lich/issues);各版本的改动见 +[CHANGELOG.md](CHANGELOG.md)。 ## 从源码构建 -lich 由两个二进制文件组成。后端 `lich` 是纯 Go(Go 1.27,`CGO_ENABLED=0`,一个静态 -二进制文件),通过本地回环监听器(HTTP RPC + WebSocket,token 鉴权)提供会话。窗口 -`lich-native` 是 `native/` 下独立的 Go 模块,用 cgo 构建:由 [Gio](https://gioui.org) 绘制, -终端用 `libghostty-vt`,代码和 diff 界面用 [godemirror](https://github.com/lichdotdev/godemirror)。 -前置条件:**Go 1.27.0+** 和 **[Task](https://taskfile.dev)**;窗口另需 C 工具链、Gio 的系统软件包, -以及用 Zig 0.16 从 `native/GHOSTTY_COMMIT` 记录的 Ghostty 提交构建的 `libghostty-vt`。 +lich 由两个二进制文件组成:`lich` 是静态的纯 Go 后端,`lich-native` 是窗口,在 `native/` +下用 cgo 构建。你需要 **Go 1.27.0+** 和 **[Task](https://taskfile.dev)**;窗口另需 C 工具链、 +Gio 的系统软件包,以及用 `native/GHOSTTY_COMMIT` 记录的提交构建的 `libghostty-vt`。 构建方法见 [`native/slice.sh`](native/slice.sh),窗口说明见 [`docs/native-window.md`](docs/native-window.md)。 @@ -213,16 +209,11 @@ task build # 后端二进制文件 -> bin/lich task build:native # 窗口 -> bin/lich-native task run # 构建并运行 task test # Go 测试套件 +task package # bin/ 下生成 .deb + .rpm + Arch .pkg.tar.zst(需要 nfpm) ``` -在本地打包 Linux 发布版本(需要 [nfpm](https://nfpm.goreleaser.com/)): - -```bash -task package # bin/ 下生成 .deb + .rpm + Arch .pkg.tar.zst -``` - -在 lich 现有的八个智能体 CLI 之外再接入一个,是唯一一种要改两个仓库、十几个文件的改动: -具体要改哪些地方,见 [`docs/adding-a-provider.md`](docs/adding-a-provider.md)。 +再接入一个智能体,要改两个仓库里的十几个文件: +[`docs/adding-a-provider.md`](docs/adding-a-provider.md) 是完整的清单。 ## 赞助 diff --git a/build/darwin/homebrew/lich.rb.tpl b/build/darwin/homebrew/lich.rb.tpl index f3680a4b6..e42896504 100644 --- a/build/darwin/homebrew/lich.rb.tpl +++ b/build/darwin/homebrew/lich.rb.tpl @@ -13,7 +13,7 @@ cask "lich" do url "https://github.com/lichdotdev/lich/releases/download/v#{version}/lich-v#{version}-darwin-#{arch}.zip" name "lich" - desc "Terminal-first ADE for the coding agents you already use" + desc "Run coding agents side by side, each on its own branch" homepage "https://github.com/lichdotdev/lich" depends_on macos: ">= :ventura" diff --git a/build/linux/aur/PKGBUILD.tpl b/build/linux/aur/PKGBUILD.tpl index 0adf05ccc..383ca6104 100644 --- a/build/linux/aur/PKGBUILD.tpl +++ b/build/linux/aur/PKGBUILD.tpl @@ -4,7 +4,7 @@ pkgname=lich-bin pkgver=@VERSION@ pkgrel=1 -pkgdesc="A terminal-first ADE for the coding agents you already use" +pkgdesc="Run your coding agents side by side, each on its own branch" arch=('x86_64') url="https://github.com/lichdotdev/lich" license=('AGPL-3.0-only') diff --git a/build/linux/lich.desktop b/build/linux/lich.desktop index 915eb0cb3..ea4c53296 100755 --- a/build/linux/lich.desktop +++ b/build/linux/lich.desktop @@ -2,7 +2,7 @@ Type=Application Name=lich GenericName=Agentic Development Environment -Comment=Run and watch AI coding agents side by side +Comment=Run your coding agents side by side, each on its own branch Exec=lich Icon=lich Categories=Development; diff --git a/build/linux/nfpm/nfpm.yaml b/build/linux/nfpm/nfpm.yaml index 12ae1002b..f5a54defd 100644 --- a/build/linux/nfpm/nfpm.yaml +++ b/build/linux/nfpm/nfpm.yaml @@ -11,7 +11,7 @@ version: "${VERSION}" section: "default" priority: "extra" maintainer: "omartelo " -description: "A terminal-first ADE for the coding agents you already use" +description: "Run your coding agents side by side, each on its own branch" vendor: "lich" homepage: "https://github.com/lichdotdev/lich" license: "AGPL-3.0-only" diff --git a/build/windows/scoop/lich.json.tpl b/build/windows/scoop/lich.json.tpl index a125b8be5..dcd9c6461 100644 --- a/build/windows/scoop/lich.json.tpl +++ b/build/windows/scoop/lich.json.tpl @@ -12,7 +12,7 @@ "That is the layout build/windows/lich.iss installs too." ], "version": "@VERSION@", - "description": "A terminal-first ADE for the coding agents you already use", + "description": "Run your coding agents side by side, each on its own branch", "homepage": "https://github.com/lichdotdev/lich", "license": "AGPL-3.0-only", "url": "https://github.com/lichdotdev/lich/releases/download/v@VERSION@/lich-v@VERSION@-windows-amd64.zip", diff --git a/docs/changelog.es.html b/docs/changelog.es.html index 6669e7774..71d0aef23 100644 --- a/docs/changelog.es.html +++ b/docs/changelog.es.html @@ -61,7 +61,7 @@

Changelog