Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ on:
env:
CARGO_TERM_COLOR: always

defaults:
run:
working-directory: rust.src

jobs:
build-and-test:
name: Build & Test
Expand All @@ -22,8 +18,6 @@ jobs:
- uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
with:
workspaces: rust.src

- name: Build release
run: make release
Expand Down
11 changes: 3 additions & 8 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@ jobs:
name: Build ${{ matrix.target }}
runs-on: ${{ matrix.os }}

defaults:
run:
working-directory: rust.src

strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -51,7 +47,6 @@ jobs:

- uses: Swatinem/rust-cache@v2
with:
workspaces: rust.src
key: ${{ matrix.target }}

- name: Run tests
Expand All @@ -73,16 +68,16 @@ jobs:
run: |
mkdir -p "${{ steps.archive.outputs.dir }}"
cp "target/${{ matrix.target }}/release/${BINARY_NAME}" "${{ steps.archive.outputs.dir }}/"
cp ../README.md "${{ steps.archive.outputs.dir }}/" 2>/dev/null || true
cp ../LICENSE-MIT ../LICENSE-APACHE "${{ steps.archive.outputs.dir }}/" 2>/dev/null || true
cp README.md "${{ steps.archive.outputs.dir }}/" 2>/dev/null || true
cp LICENSE-MIT LICENSE-APACHE "${{ steps.archive.outputs.dir }}/" 2>/dev/null || true
cd _dist
tar czf "${{ steps.archive.outputs.name }}.tar.gz" "${{ steps.archive.outputs.name }}"

- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ steps.archive.outputs.name }}
path: rust.src/_dist/${{ steps.archive.outputs.name }}.tar.gz
path: _dist/${{ steps.archive.outputs.name }}.tar.gz
if-no-files-found: error

release:
Expand Down
File renamed without changes.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ and this project aims to follow [Semantic Versioning](https://semver.org/spec/v2

## [Unreleased]

### Changed

- Flattened the `rust.src/` directory into the repository root and standardized
the project on Rust, dropping the Hare implementation. README, Makefile,
PLAN-0001, and GitHub Actions (CI/release) were updated to remove `rust.src`
paths and Hare references.

## [0.2.1] - 2026-06-29

### Fixed
Expand Down
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion rust.src/Makefile → Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Makefile for the Rust implementation of `be` (rust.src).
# Makefile for the Rust implementation of `be`.
# All build and verification is funneled through these targets.

.PHONY: all build run test lint fmt fmt-check clippy check clean release install
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ A minimal Linux terminal editor focused on distraction-free writing and note-tak

- RFC: `docs/rfcs/0001.md`
- RFC status: `review`
- Implementation language (current preference): `Hare` *(provisional; may return to Rust)*
- Implementation language: `Rust`

## Product idea (MVP)

Expand All @@ -31,6 +31,7 @@ Post-MVP ideas include theme customization, custom keybindings, and full-file pr

## Repository structure

- `src/` — Rust source code
- `docs/rfcs/` — RFC documents and index
- `AGENTS.md` — project workflow and agent rules

Expand Down
112 changes: 0 additions & 112 deletions docs/PLAN-0001-rust.md

This file was deleted.

152 changes: 72 additions & 80 deletions docs/PLAN-0001.md
Original file line number Diff line number Diff line change
@@ -1,116 +1,108 @@
# PLAN-0001 — Реализация RFC-0001 на Hare
# PLAN-0001 — Реализация RFC-0001 на Rust

Связанный RFC: `docs/rfcs/0001.md` (status: `review`)

## 1) Цель

Собрать минималистичный Linux CLI-редактор для фокусного редактирования заметок:
- активная строка в центре;
- ограниченный контекст сверху/снизу;
- минимальный UI и быстрые клавиши.
Реализовать тот же функциональный объём RFC-0001, но на Rust с акцентом на устойчивость и расширяемость.

## 2) Границы

### MVP
- Открытие файла: `be <path>`
- Базовое редактирование (вставка, удаление, Enter, Backspace, стрелки)
- Сохранение `Ctrl+S`, выход `Ctrl+Q` (с подтверждением при несохранённых изменениях)
- `be <path>`
- Базовое редактирование
- `Ctrl+S` / `Ctrl+Q` (+ подтверждение при dirty-состоянии)
- Статус-строка:
- слева: `[filename] [saved|modified]`
- справа: `Ln <line>, Col <col>`
- `Ctrl+O` — настройки
- `?` — помощь
- Настройки MVP:
- `lines_before`
- `lines_after`
- `cursor_on_open: start | end`
- `[filename] [saved|modified]`
- `Ln <line>, Col <col>`
- `Ctrl+O` (настройки), `?` (помощь)
- `lines_before`, `lines_after`, `cursor_on_open`
- Конфигурация:
- путь: `$XDG_CONFIG_HOME/be/config.toml` (fallback `~/.config/be/config.toml`)
- если файл отсутствует, создаётся автоматически при первом запуске с дефолтными значениями.

### Post-MVP
- Тема
- Переопределение горячих клавиш
- Горячая клавиша «показать весь файл» (preview + скроллинг)
- Темы
- Настройка хоткеев
- Полнофайловый preview со скроллингом

## 3) Технический подход (Hare)
## 3) Технический стек (предложение)

- Ввод: raw mode (termios), чтение клавиш/escape-последовательностей
- Рендер: ANSI escape codes, перерисовка кадра
- Модули:
- `input`
- `buffer`
- `viewport`
- `renderer`
- `fileio`
- `settings`
- `help`
- Linux-first (xterm/kitty/alacritty/gnome-terminal)
Минимальный практичный набор:
- `crossterm` — ввод/события/терминальный режим
- `unicode-width` — корректная ширина символов в терминале
- ANSI-рендер вручную (или облегчённый слой поверх `crossterm`)

## 4) План по этапам
Примечание: `ratatui` можно подключить позже, если ручной рендер станет слишком дорогим в поддержке.

## Этап 0 — Каркас
- Структура проекта и точка входа
- Парсинг аргументов CLI (`<path>`, `--lines`, `--readonly`)
- Инициализация конфигурации (загрузка из `config.toml` или создание файла по умолчанию)
- Загрузка файла в буфер
## 4) Архитектура

**Готовность:** бинарник открывает файл и завершает работу без редактирования.
Модули:
- `input`
- `buffer`
- `viewport`
- `renderer`
- `file_io`
- `settings`
- `help`

## Этап 1 — Ядро редактирования
- Буфер строк + курсор
- Операции редактирования
- Навигация стрелками
Поток: `Input -> Buffer -> Viewport -> Renderer`.

**Готовность:** можно редактировать текст в памяти, без финального UI.
## 5) План по этапам

## Этап 2 — Фокусный viewport
- Центрирование активной строки
- Контекст `before/after`
- Приглушение соседних строк
## Этап 0 — Bootstrap
- Cargo-проект
- CLI-аргументы
- инициализация конфигурации (чтение `config.toml` или автосоздание дефолтного файла)
- загрузка файла

**Готовность:** на экране стабильно виден фокусный фрагмент.
**Готовность:** файл открывается, контур приложения рабочий.

## Этап 3Статус-строка и действия
- `[filename] [saved|modified]`
- `Ln/Col`
- `Ctrl+S`, `Ctrl+Q`, подтверждение выхода
## Этап 1Buffer + Cursor
- модель текста
- операции вставки/удаления
- навигация

**Готовность:** полный MVP-цикл open/edit/save/quit.
**Готовность:** редактирование в памяти без полного UI.

## Этап 4Панели `Ctrl+O` и `?`
- Экран настроек MVP
- Экран помощи
- Применение настроек в рантайме
## Этап 2Viewport
- центрирование курсора
- контекст до/после
- вычисление видимых строк

**Готовность:** настройки меняются и сразу влияют на viewport.
**Готовность:** корректный фокусный вывод при перемещении.

## Этап 5Стабилизация
- Проверка в нескольких терминалах Linux
- Фикс мерцания/артефактов
- Ошибки доступа к файлам и readonly-поток
## Этап 3Renderer + Status
- отрисовка активной/соседних строк
- статус-строка в формате RFC
- подавление мерцания (батч-обновление кадра)

**Готовность:** готово к статусу RFC `accepted`/`implemented`.
**Готовность:** стабильный интерактивный экран.

## 5) Риски и триггеры пересмотра языка
## Этап 4 — Actions
- `Ctrl+S`
- `Ctrl+Q` (+confirm)
- `Ctrl+O`
- `?`

Триггеры перехода с Hare на Rust:
- значительная сложность TUI/ввода;
- сложные edge-cases Unicode/ширины символов;
- отсутствие нужных библиотек/инструментов;
- падение скорости итераций.
**Готовность:** полный пользовательский сценарий MVP.

## 6) Минимальная проверка качества
## Этап 5 — Hardening
- обработка ошибок ввода/вывода
- readonly режим
- smoke-тесты в разных терминалах Linux

На каждом этапе:
- ручной smoke-test (open/edit/save/quit);
- проверка статус-строки и `Ln/Col`;
- проверка `cursor_on_open=start|end`;
- проверка recovery при ошибке сохранения.
**Готовность:** качественная MVP-версия для ежедневного использования.

## 7) Definition of Done (MVP)
## 6) Риски

- Все пункты MVP из RFC реализованы;
- Работа подтверждена минимум в 2 Linux-терминалах;
- Документация (README/CHANGELOG) обновлена при релизе;
- RFC-статус меняется через `rfc-cli`.
- Возможный рост сложности из-за overengineering.
- Лишние зависимости, если не держать MVP-границы.

## 7) Контрольный список качества

- Корректная работа `Ln/Col` на всех действиях
- Проверка dirty-state (`saved|modified`)
- Проверка `cursor_on_open=start|end`
- Проверка сохранения и ошибок прав доступа
- Проверка производительности на больших заметках
Loading