Repository navigation
LexiQode 0.2.4
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
Строка коммита была подписью, а не кнопкой: список истории читался, но изменение
за каждой строкой — нет, а это единственное, для чего список коммитов существует.
- Клик по коммиту открывает заголовок (хеш, автор, когда, тема, тело) и
список файлов со статусом — добавлен, изменён, удалён, переименован. - Клик по файлу открывает его изменение, нарисованное
DiffEditorMonaco:
добавленная строка зелёная, удалённая красная — как в 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проверяет, что список подсказок остаётся внутри
редактора и в обычном окне, и в узком.