Skip to content

LexiQode 0.2.4

Choose a tag to compare

@KentoGasai KentoGasai released this 28 Oct 06:47
· 6 commits to main since this release

LexiQode 0.2.4

Скачайте LexiQode-0.2.4-win32-x64.zip, распакуйте куда угодно и запустите
LexiQode.exe. Ничего не устанавливается, права администратора не нужны. Сверьте
скачанное с файлом .sha256, приложенным рядом. Настройки и данные лежат вне папки
программы, поэтому распаковка поверх прежней версии их не трогает.

Это патч к 0.2.3: пять вещей, которые в панели системы контроля версий, в подсказках
редактора и в показе работы ассистента не работали так, как задумано, и которые
нельзя было починить настройкой.

Что исправлено

Коммит нельзя было отправить, а удалённый репозиторий — получить

git push не вызывался ниоткуда: в службе git не было такого метода, в списке
каналов — такого канала, в панели — такой кнопки. Коммит делался и оставался
локальным, и ничто на экране не говорило, что дальше нужен терминал. То же с
pull и fetch: удалённый репозиторий не читался вообще.

  • Под веткой стоит строка из трёх кнопок — «Проверить удалённый», «Забрать
    изменения», «Отправить изменения». Каждая называет себя, пока работает, и
    отказывается нажиматься второй раз, поэтому медленная сеть не выглядит как
    мёртвая кнопка. У каждой есть подсказка: fetch узнаёт, что нового на сервере, и
    не трогает файлы; pull приносит коммиты в текущую ветку; push отправляет
    ваши.
  • Ветка без upstream отправляется и начинает отслеживать удалённую. Первая
    отправка новой ветки иначе падала бы с сообщением про upstream, которое
    читается как отказ.
  • git pull идёт только fast-forward. Слияние или rebase, запущенные кнопкой,
    без возможности увидеть конфликт, — это способ оставить рабочую копию в
    состоянии, которого никто не просил. Всё, что не fast-forward, сообщается
    словами git, чтобы это можно было сделать в терминале, где конфликт виден.
  • git fetch --prune убирает ветки, которых на сервере больше нет, и делает
    счётчики «впереди/позади» правдой.
  • Отказ не проглатывается: «нет upstream», «rejected», «authentication failed» —
    это и есть ответ на вопрос, почему отправка не прошла.

Коммит открывается как список файлов, а файл — как цветной diff

Строка коммита была подписью, а не кнопкой: список истории читался, но изменение
за каждой строкой — нет, а это единственное, для чего список коммитов существует.

  • Клик по коммиту открывает заголовок (хеш, автор, когда, тема, тело) и
    список файлов
    со статусом — добавлен, изменён, удалён, переименован.
  • Клик по файлу открывает его изменение, нарисованное DiffEditor Monaco:
    добавленная строка зелёная, удалённая красная — как в VSCode. Это два документа,
    которые сравниваются, а не один документ из строк + и -.
  • Стороны берутся из git show <rev>:<path> и <rev>^:<path>: у первого коммита
    родителя нет, и «до» там пусто, а не ошибка.

Видно, что ассистент меняет в коде.

Строка вызова говорила «write_file src/app.js» и всё: единственное, что хочется
проверить перед тем, как доверять ходу, — что именно изменилось, — на экране не
было.

  • Инструмент, меняющий файл, сообщает обе стороны изменения. write_file и
    edit_file кладут в результат содержимое файла до и после, ядро передаёт его в
    событии tool_end, а окно показывает изменение.
  • Изменение — отдельный блок в чате, а не строка внутри «Действий». Первая
    версия прятала его в строку вызова, а та лежит за двумя раскрытиями — список
    действий шага и сама строка, — поэтому человеку нужно было открыть две вещи,
    чтобы найти одну. Это и читалось как «ты спрятал изменённый файл под
    „Действия“». Теперь блок стоит в ленте сам по себе, между действиями и ответом.
  • Блок раскрывается прямо в чате и показывает только изменённые строки.
    Добавленная строка зелёная, удалённая красная, вокруг — несколько строк
    контекста. Весь файл намеренно не рисуется: это похоронило бы изменение в файле.
  • Рядом — кнопка «открыть файл», которая открывает тот же файл в редакторе,
    где его можно прочитать целиком.
  • Строка файла говорит, сколько изменилось (+5 −1), ещё до раскрытия.
  • Почему это делает ядро, а не окно. Окно не может прочитать файл «до»: оно
    узнаёт о вызове из события tool_start, а локальная запись завершается раньше,
    чем такой чтение вернётся. Первая версия читала файл сама и получала пустой
    diff, потому что «до» уже содержало новое содержимое. Обе стороны знает только
    инструмент, поэтому он их и сообщает.
  • Запись, ничего не изменившая, не предлагает diff — блока нет.

Подсказки в редакторе не помещались и последней не было видно

Monaco даёт списку подсказок фиксированную ширину 430 px и, с
fixedOverflowWidgets, ставит его относительно окна, а не редактора: его
собственная раскладка ограничивает размер окном. В окне, где редактор уже 430 px —
открыты и панель ассистента, и боковая панель, — список уходит за правый край
редактора и под панель ассистента, и закрытой оказывается как раз сигнатура, ради
которой список и открыт. Замер probe-suggest-fit.cjs: в окне 900 px редактор был
168 px, а список уходил на 372 px за его край.

  • Высота была второй половиной той же ошибки. Список ограничивался долей
    окна, а не редактора, поэтому при открытой панели терминала редактор короткий,
    а список выше него: Monaco прижимал его к нижнему краю, и последняя строка
    вставала вплотную к панели, которая начинается ровно там. Это и читалось как
    «внизу какая-то маленькая панель её закрывает». Теперь высота ограничена высотой
    редактора, и Monaco может перевернуть список вверх от курсора.
  • Список держится в нескольких пикселях от нижнего края. Вплотную — это и было
    то, что видел человек: собственная рамка последней строки лежала на границе, а
    панель ниже рисовалась поверх неё.
  • Ширина и высота списка ограничены редактором. Процентом это не выразить —
    содержащий блок виджета это окно, поэтому editor.js измеряет редактор и
    публикует --editor-width и --editor-height, а правило читает их.
  • Список сдвигается внутрь, если позиция выводит его наружу. Одного размера
    мало: Monaco ставит список у курсора и разрешает ему выходить за редактор.
    Наблюдатель за стилем виджета возвращает его внутрь — размер при этом остаётся
    решением Monaco.

Что ещё стоит знать

  • 214 тестов окна и 175 тестов ядра. Замеры, открывающие окно, запускайте по
    одному: два окна перекрывают друг друга, и кадры у фонового окна тормозятся.
  • Семь тестов работают с настоящим репозиторием и настоящим удалённым: отправка
    доходит до удалённого (проверяется его git log, а не ответ команды), ветка без
    upstream начинает его отслеживать, pull приносит коммит с удалённого в рабочую
    копию, fetch сообщает расхождение и не трогает рабочую копию, show показывает
    изменение коммита и умеет первый коммит без родителя, а отправка без удалённого —
    отказ со словами git, а не падение.
  • Замер probe-commit-view.cjs открывает настоящий репозиторий, кликает коммит,
    читает список файлов со статусами и открывает файл, проверяя, что diff сравнивает
    две разные версии и что в нём есть и добавленные, и удалённые строки.
  • Замер probe-agent-change.cjs доводит ход до конца против заглушки, которая
    просит write_file: блок изменений появляется вне списка действий, называет
    файл и счётчик (+5 −1), раскрывается прямо в чате и показывает только
    изменённые строки с контекстом, а кнопка «открыть файл» открывает тот же файл в
    редакторе. Файл на диске совпадает с тем, что записал инструмент.
  • Замер probe-suggest-fit.cjs проверяет, что список подсказок остаётся внутри
    редактора и в обычном окне, и в узком.