Semantic terminal: AI-генератор однострочников по описанию на естественном языке
semantic-terminal

Мотивация
Работаю я в основном в Linux, терминал - один из основных инструментов, но всё-таки по большей части это ls, mkdir, cd, git, grep, htop, ssh, ну и, может, ещё с десяток команд. Все возможные параметры/опции я не помню и, если честно, не хочу/не могу помнить. В общем-то, для этого принято в каждой такой утилите иметь опцию --help, которая расскажет и подскажет. К сожалению, даже с --help всё ещё остаётся большой пласт того, что можно делать с системой. Уверен, что есть люди, которые знают большинство недр Unix-подобных систем, но я не из таких. Долгое время, в случаях, когда я не помню, как сделать что-то в терминале, я просто открываю Google и ищу нужный однострочник. С появлением терминалов типа Claude Code или OpenCode появилась возможность делать то же самое прямо в терминале и, надо сказать, я этим активно пользуюсь (и я точно не один такой). Но всё же обычным терминалом я всё ещё пользуюсь много и не собираюсь от него полностью отказываться в пользу AI-терминалов, поэтому хочется unix-style-команду, которая выполняла бы поход в Google / SO, тем более понятно, что это сделать несложно.
Почему не взял готовое?
Решение от автора статьи Я заменил Google на 50 строк Python. Через месяц я забыл, как пишется tar -xzf хорошее, но лично мне показалось недооформленным. Упомянутые в комментариях альтернативы (+ то, что нашёл сам) – это в основном какие-то более общие решения в контексте AI-терминалов, а мне хотелось именно unix-style: команду, которая делает ровно одну вещь.
Что получилось?
Итак, со всем этим я открыл ноутбук, начал кодить, запустил AI-терминал, описал задачу и пошёл пить чай под тупые видосы с YouTube, периодически сверяясь с тем, что происходит. В итоге имеем питоновский пакет semantic-terminal: ставится через pip и предоставляет одну команду sem, вот её суть:
sem <description> # Сгенерировать команду
sem -r <description> # Сгенерировать и выполнить команду
sem -v <description> # Сгенерировать и объяснить команду
sem ! или sem -r # Выполнить сгенерированную команду
sem ? # Вывести еще раз сгенерированную командуПод капотом простая идея: при запуске в режиме генерации просто скармливаем описание в LLM с указанием “Сделай однострочную команду”, остальное – для удобства.
Две ключевых особенности
В целом, 50-строчный скрипт мне импонировал: минималистичный, только то, что нужно. Но всё-таки у него были две существенные для меня проблемы и одна незначительная. Начну с последней: лично я не люблю интерактивность и предпочёл сделать интерфейс в виде двух режимов: генерация и выполнение. А теперь по существенным проблемам.
Первая заключается в том, что сгенерированная команда выполняется в дочернем процессе, и внутри Python с этим ничего не сделать. В результате выполненная команда не попадает в историю терминала и, соответственно, мы не можем её быстро воспроизвести или найти в истории. Чтобы это обойти, добавил обвязку на bash/powershell sem-run, которую можно опционально поставить через sem-setup.
Вторая проблема заключается в том, что кроме самой команды иногда хочется и разобраться – поэтому добавил режим --verbose, который генерирует не только команду, но и её объяснение. Тут сразу есть приятный бонус: большинство современных LLM мультиязычны, поэтому легко из коробки получить описание на том же языке, на котором был сделан запрос. Тестировал на русском, английском, китайском и испанском.
Быстрый старт
Устанавливаем из PyPI
pip install semantic-terminal .Первым делом нужно сконфигурировать LLM. Самое простое (и быстрое), что я пока нашёл – регистрируем бесплатный аккаунт Groq https://console.groq.com, берём API-ключ и запускаем
sem config set api_keyпосле чего вставляем ключ от аккаунта. Полную конфигурацию смотрите в README. Если хочется сохранять в истории терминала запущенные команды, то запускаем
sem-setupИ используем sem-run для выполнения команд, а не sem -r/sem !. По сути всё, теперь мы готовы!
Примеры
Пример будет один, но с разными опциями: “sem show last 10 commits”. Во-первых, вариант с использованием sem !
$ sem show last 10 commits
$ git log -n 10 --oneline
$ sem !
$ git log -n 10 --oneline
3111e16 (HEAD -> main, tag: v1.2.0, origin/main) Feat/remove OpenAI (#2)
96d6f59 v1.0.1
918daad Test/workflow (#1)
95ce22b (test/number_of_lines) Test number of lines badge
97ad729 [AI] Vibecoded by Claude Opus 4.6
$ history 5
368 sem !
369 history
370 sem show last 10 commits
371 sem !
372 history 5Как видите, в истории sem !. А вот вариант с sem-run:
$ sem show last 10 commits
$ git log -n 10 --oneline
$ sem-run
$ git log -n 10 --oneline
3111e16 (HEAD -> main, tag: v1.2.0, origin/main) Feat/remove OpenAI (#2)
96d6f59 v1.0.1
918daad Test/workflow (#1)
95ce22b (test/number_of_lines) Test number of lines badge
97ad729 [AI] Vibecoded by Claude Opus 4.6
$ history 3
384 sem show last 10 commits
385 git log -n 10 --oneline
386 history 3Ну и, соответственно, примеры из репозитория. На русском:
$ sem -v покажи 10 последних коммитов деревом
Чтобы показать последние коммиты в виде дерева, вы можете использовать команду git log с опцией --graph. Вот что делает эта команда:
* Показывает последние коммиты в виде дерева, где каждая ветка представлена отдельной линией
* Опция --graph позволяет визуализировать историю коммитов
* Опция -10 ограничивает вывод до 10 последних коммитов
* Команда git log используется для просмотра истории коммитов
git log --graph -10На китайском:
$ sem -v 使用树显示10个提交
要显示10个提交记录,可以使用git log命令并结合--oneline和--graph选项来以树形结构显示提交历史。以下是关键点:
* git log命令用于显示提交历史
* --oneline选项使每个提交记录只显示一行
* --graph选项使提交历史以树形结构显示
* --all选项显示所有分支的提交记录
* 使用head选项可以限制显示的提交记录数量
git log --graph --oneline --all -10И на испанском:
$ sem -v Mostrar 10 confirmaciones con el árbol
Para mostrar 10 confirmaciones con el árbol, puedes utilizar el comando git log con las opciones --oneline y --graph. Aquí hay algunos puntos clave sobre este comando:
* El comando git log se utiliza para mostrar un registro de confirmaciones.
* La opción --oneline muestra cada confirmación en una sola línea.
* La opción --graph muestra el árbol de confirmaciones.
* La opción -10 limita la salida a las 10 últimas confirmaciones.
* Este comando asume que estás en el directorio raíz de un repositorio git.
git log --oneline --graph -10И отдельно отмечу, что всё это дело работает довольно шустро (модель llama-3.3-70b-versatile, хост Groq, РКН ничего активно не тестирует), демо смонтировано без изменения скорости и склеек между выполнением команды и получением результата.

В общем, забирайте на здоровье! Если зашло, не забудьте заапвоатить статью и поставить звёздочку репозиторию, это сделает автора очень счастливым!