Эта заметка вдохновлена статьей Я заменил Google на 50 строк Python. Через месяц я забыл, как пишется tar -xzf. В какой-то момент, в очередной раз после нажатия Alt+Tab для переключения в браузер, чтобы быстро найти какой-то линуксовый однострочник, я понял, что хватит это терпеть, и полез искать упомянутую статью. Перечитав её и прошерстив комментарии, я понял, что некоторые нужные мне вещи сделаны не совсем так, как хотелось бы, поэтому пошёл пилить свой велосипед. Итак, представляю вам semantic-terminal:

  • Ставится через pip: pip install semantic-terminal

  • Unix-style утилита sem, которая прокидывает аргументы в LLM с промтом: “Сделей однострочник”

  • Опционально предоставляет подробное описание однострочника на языке запроса

  • Опциональная утилита sem-run, запускающая сгенерированную команду с сохранением в истории терминала

  • Задержка генерации меньше 1с при условии … кхм хм … стабильного интернета

Мотивация

Работаю я в основном в 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, РКН ничего активно не тестирует), демо смонтировано без изменения скорости и склеек между выполнением команды и получением результата.

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


Если вам понравилась статья — поставьте плюс, автору всегда приятно когда его работу ценят. Возможно вас также заинтересует мой канал А зачем это нужно? где я рассказываю о том, что математику и алгоритмы придумали не только для собеседований в бигтехи.

Также я завел сайт, где публикую большие статьи, сама это статья доступна на русском/английском языках Semantic terminal: AI-генератор однострочников по описанию на естественном языке