Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,751 @@
|
||||
# Sprinter Commander: план разработки
|
||||
|
||||
Статус: рабочий план
|
||||
|
||||
Связанные документы:
|
||||
[требования](commander-requirements.md),
|
||||
[архитектура](commander-architecture.md),
|
||||
[клавиши и команды](commander-keymap.md),
|
||||
[платформенные пробы P1](p1-platform-probes.md),
|
||||
[экранный backend P2](p2-screen-backend.md),
|
||||
[результаты P2.1](p2-screen-probe-results.md),
|
||||
[результаты P2.2](p2-palette-results.md),
|
||||
[результаты skeleton P2](p2-skeleton-results.md),
|
||||
[результаты файловых панелей P3](p3-panel-results.md),
|
||||
[результаты копирования P4.1](p4-copy-results.md),
|
||||
[результаты запуска EXE P4.2](p4-exec-results.md),
|
||||
[результаты P5](p5-stability-results.md),
|
||||
[результаты F7/P9](p9-mkdir-results.md),
|
||||
[результаты F6/P10](p10-rename-results.md),
|
||||
[результаты F8/P11](p11-delete-results.md),
|
||||
[результаты group-copy/P12](p12-group-copy-results.md),
|
||||
[результаты group-delete/P13](p13-group-delete-results.md),
|
||||
[результаты стандартных цветов/P14](p14-default-colors-results.md),
|
||||
[результаты recursive copy/P15](p15-tree-copy-results.md),
|
||||
[результаты recursive group-copy/P16](p16-group-tree-copy-results.md),
|
||||
[результаты recursive group-delete/P17](p17-tree-delete-results.md),
|
||||
[результаты сохранения метаданных/P18](p18-metadata-results.md),
|
||||
[результаты conflict-policy/P19](p19-copy-policy-results.md),
|
||||
[UI-ориентир VC](ui-reference.md)
|
||||
|
||||
Текущее состояние:
|
||||
|
||||
- P0 — завершена первая редакция документации;
|
||||
- P1 — обязательные платформенные примитивы подтверждены в MAME 0.287;
|
||||
проверка на реальном Sprinter ожидается;
|
||||
- P2.1 — ядро координатного экранного backend прошло MAME 0.287;
|
||||
- P2 — многоцветный двухпанельный skeleton прошёл полный MAME-сценарий,
|
||||
включая scroll, диалоги и повторный cleanup; аппаратная проверка ожидается;
|
||||
- P2.2 — системная многоцветная палитра прошла отдельный MAME-тест;
|
||||
аппаратная проверка ожидается;
|
||||
- P3 — реальные две панели, EMM-store с границей 640/641, сортировка,
|
||||
навигация, синтетическая `..` и предел DSS 35 прошли диагностические и
|
||||
интеграционные MAME-тесты; аппаратная проверка ожидается.
|
||||
- P4 — безопасное однофайловое копирование через EMM/W3 и запуск `.EXE` с
|
||||
полным восстановлением окружения прошли HDD-сценарии MAME; аппаратная
|
||||
проверка ожидается.
|
||||
- P5 — завершён в MAME: пройдены 20 последовательных copy со всеми граничными
|
||||
размерами, 100 refresh, три lifecycle, ENOSPC, readonly, ошибки
|
||||
read/rename/ENOENT, отмена перед commit, смена носителя, отсутствующий EXE и
|
||||
реальный `mdview2`. Аппаратный smoke-тест остаётся внешней проверкой.
|
||||
- 0.2 — начат: независимые сортировки name/ext/size/date и reverse, выбор
|
||||
`Insert`, `*`, `+`/`-` с масками, F7 mkdir и локальный F6 rename
|
||||
реализованы и прошли target/UI-сценарии MAME; следующим идёт расширение
|
||||
файловой job и рекурсивная обработка каталогов. Групповые F5 и F8 уже
|
||||
обрабатывают файлы и выбранные directory roots; для F8 каталоги удаляются
|
||||
после файлов обратным проходом очереди. F5 сохраняет FAT date/time и
|
||||
файловые атрибуты R/H/S/A. Conflict-policy overwrite/skip/rename и all,
|
||||
readonly re-prompt, backup/rollback выполнены; P5/P18 повторно пройдены.
|
||||
Также досрочно реализован стандартный fallback цветов имён без файла
|
||||
конфигурации.
|
||||
|
||||
## 1. Целевые результаты
|
||||
|
||||
Проект делится на три продуктовых рубежа:
|
||||
|
||||
1. **PoC 0.1** — доказана работа архитектуры на Sprinter.
|
||||
2. **Рабочая версия 0.4** — Commander пригоден для повседневных файловых
|
||||
операций.
|
||||
3. **Полная версия 1.0** — реализован основной набор возможностей VC 4.99 с
|
||||
адаптацией к Sprinter.
|
||||
|
||||
Dos Navigator задаёт идеи для расширяемости, но не объём версии 1.0.
|
||||
|
||||
Вся линейка до 1.0 включительно использует одну EMM-страницу на панель и
|
||||
жёсткий предел 640 показываемых записей. Его снятие — отдельная архитектурная
|
||||
задача 2.0+.
|
||||
|
||||
## 2. Допущения для оценки
|
||||
|
||||
Оценки приведены для одного разработчика, знакомого с текущим Sprinter
|
||||
C-Compiler и имеющего доступ к MAME. Один рабочий день означает день
|
||||
сосредоточенной разработки, а не календарный день.
|
||||
|
||||
В оценку входят:
|
||||
|
||||
- реализация;
|
||||
- целевые тесты;
|
||||
- анализ `.asm`/`.map` при платформенной проблеме;
|
||||
- MAME-прогон;
|
||||
- обновление документации.
|
||||
|
||||
В оценку не входят:
|
||||
|
||||
- исправление неизвестных дефектов DSS;
|
||||
- разработка отсутствующего архиватора;
|
||||
- длительное ожидание доступа к реальному железу;
|
||||
- перенос стороннего editor/viewer;
|
||||
- создание графического режима интерфейса.
|
||||
|
||||
Ожидаемая точность оценки:
|
||||
|
||||
- PoC: `-20% / +40%`;
|
||||
- этапы после PoC: `-25% / +60%`;
|
||||
- архивы и editor: оцениваются повторно после исследования доступных программ.
|
||||
|
||||
## 3. Сводный план
|
||||
|
||||
| Этап | Результат | Оценка |
|
||||
|---|---|---:|
|
||||
| P0 | Спецификация и архитектура | 2–3 дня |
|
||||
| P1 | Проверенные платформенные примитивы | 3–5 дней |
|
||||
| P2 | Запускаемый двухпанельный skeleton | 4–5 дней |
|
||||
| P3 | Полноценная навигация по двум панелям | 5–7 дней |
|
||||
| P4 | Копирование одного файла и EXEC | 5–7 дней |
|
||||
| P5 | Стабилизация PoC | 3–5 дней |
|
||||
| 0.2 | Безопасное файловое ядро | 5–7 недель |
|
||||
| 0.4 | Рабочая оболочка и внешние инструменты | 4–6 недель |
|
||||
| 0.6 | Поиск, дерево и расширенные панели | 5–7 недель |
|
||||
| 0.8 | Виртуальные источники и архивы | 6–10 недель |
|
||||
| 1.0 | Надёжность, производительность, релиз | 5–8 недель |
|
||||
|
||||
PoC требует ориентировочно 22–32 рабочих дня. Полная версия 1.0 — примерно
|
||||
29–44 рабочих недели с учётом PoC. После исследования P1 оценки должны быть
|
||||
пересмотрены по фактической скорости разработки.
|
||||
|
||||
## 4. Зависимости этапов
|
||||
|
||||
```text
|
||||
P0 documentation
|
||||
|
|
||||
v
|
||||
P1 platform probes
|
||||
|
|
||||
+------> EXEC probe -------------------+
|
||||
| |
|
||||
v v
|
||||
P2 app/screen/input skeleton P4 EXEC
|
||||
| ^
|
||||
v |
|
||||
P3 panel/store/filesystem --------> P4 copy
|
||||
| |
|
||||
+------------------+-------------------+
|
||||
v
|
||||
P5 PoC hardening
|
||||
|
|
||||
v
|
||||
0.2 safe file core
|
||||
|
|
||||
+----------+-----------+
|
||||
v v
|
||||
0.4 shell/helpers 0.6 search/tree
|
||||
+----------+-----------+
|
||||
v
|
||||
0.8 virtual sources
|
||||
|
|
||||
v
|
||||
1.0
|
||||
|
|
||||
v
|
||||
2.0+ dynamic panel store
|
||||
```
|
||||
|
||||
0.6 допускается начинать после стабилизации интерфейса панелей 0.2, но релиз
|
||||
0.8 требует законченных 0.4 и 0.6.
|
||||
|
||||
## 5. Фаза P0 — проектирование
|
||||
|
||||
### Цель
|
||||
|
||||
Превратить общую идею Commander в набор контрактов, по которым можно писать
|
||||
и проверять код без постоянного возврата к исходникам VC.
|
||||
|
||||
### Работы
|
||||
|
||||
- зафиксировать границы PoC и версии 1.0;
|
||||
- определить компоновку экрана;
|
||||
- определить `ScDirEntry`, `ScPanel`, события и команды;
|
||||
- выбрать режим памяти и владение EMM;
|
||||
- описать безопасное копирование;
|
||||
- описать запуск дочерней программы;
|
||||
- определить клавиши PoC и будущий keymap;
|
||||
- составить acceptance tests;
|
||||
- зафиксировать лицензионное правило для референсов.
|
||||
|
||||
### Артефакты
|
||||
|
||||
- `docs/commander-requirements.md`;
|
||||
- `docs/commander-architecture.md`;
|
||||
- `docs/commander-keymap.md`;
|
||||
- `docs/commander-roadmap.md`.
|
||||
|
||||
### Критерий выхода
|
||||
|
||||
Нет неизвестного продуктового решения, мешающего начать платформенные тесты.
|
||||
Непроверенные технические детали перечислены как задачи P1, а не скрыты в
|
||||
предположениях архитектуры.
|
||||
|
||||
## 6. Фаза P1 — платформенные пробы
|
||||
|
||||
### Цель
|
||||
|
||||
Получить минимальные воспроизводимые программы для всех примитивов, от
|
||||
которых зависит PoC.
|
||||
|
||||
### P1.1. Каталоги и пути
|
||||
|
||||
Проверить:
|
||||
|
||||
- `getcwd`, абсолютные и относительные пути;
|
||||
- `chdir` между двумя каталогами и дисками;
|
||||
- шаблон для перечисления всех файлов;
|
||||
- возвращает ли DSS `.` и `..`;
|
||||
- конец `fnext()` и значение `errno`;
|
||||
- имя корня и переход к родителю;
|
||||
- максимальную практическую длину пути;
|
||||
- поведение при смене/отсутствии носителя.
|
||||
|
||||
Результат: таблица фактического поведения и тестовый `.exe`.
|
||||
|
||||
### P1.2. EMM
|
||||
|
||||
Проверить:
|
||||
|
||||
- выделение блока из трёх страниц;
|
||||
- получение всех физических страниц;
|
||||
- чтение/запись начала и конца каждой страницы;
|
||||
- сохранение W3 вокруг `bank_read/bank_write`;
|
||||
- повторное выделение/освобождение;
|
||||
- понятную ошибку при нехватке памяти.
|
||||
|
||||
Результат: подтверждённая схема трёх страниц PoC.
|
||||
|
||||
### P1.3. Экран
|
||||
|
||||
На базе существующего теста `winrest` проверить app-local wrapper:
|
||||
|
||||
- полный экран 80x32;
|
||||
- вывод с ненулевого offset;
|
||||
- частичный диапазон строк;
|
||||
- все используемые атрибуты;
|
||||
- восстановление после смены видеорежима;
|
||||
- сохранность IX и W3.
|
||||
|
||||
Результат: утверждённый ABI `sc_platform_winrest()`.
|
||||
|
||||
### P1.4. Клавиатура
|
||||
|
||||
Записать фактические `ascii`, `scan`, `kbd_mod_state` для клавиш из
|
||||
`commander-keymap.md`. Отдельно проверить быстрое отпускание Ctrl после
|
||||
`Ctrl+PgUp` и `Ctrl+R`.
|
||||
|
||||
Результат: тестовая таблица и список подтверждённых комбинаций.
|
||||
|
||||
### P1.5. EXEC
|
||||
|
||||
Проверить:
|
||||
|
||||
- формат параметров ESTEX `EXEC`;
|
||||
- требуется ли отдельный `WAIT`;
|
||||
- возврат к вызывающей программе;
|
||||
- состояние W1/W2/W3 после возврата;
|
||||
- состояние видеорежима и CWD;
|
||||
- коды ошибок отсутствующего и повреждённого `.EXE`;
|
||||
- взаимодействие с открытым загрузочным fd multi-bank программы.
|
||||
|
||||
Результат: app-local wrapper и отдельный repro.
|
||||
|
||||
### P1.6. Информация о диске и метаданные
|
||||
|
||||
`DSKINFO` подтверждён в P1. `ATTRIB`, получение и установка даты/времени не
|
||||
блокируют базовый PoC и проверяются перед реализацией соответствующих
|
||||
операций версии 0.2.
|
||||
|
||||
### Критерий выхода P1
|
||||
|
||||
- Все обязательные wrappers имеют воспроизводимый тест.
|
||||
- Необъяснённых регистровых соглашений нет.
|
||||
- Известно минимальное число требуемых страниц и fd.
|
||||
- Архитектура обновлена по результатам проб.
|
||||
|
||||
Критерий достигнут для MAME 0.287 / BIOS 3.06. Подтверждены EMM, DSKINFO,
|
||||
F_FIRST/F_NEXT, полный и частичный WINREST, клавиши PoC, EXEC обоих режимов,
|
||||
WAIT=`0x5A`, восстановление W1/W2/W3 и повторный EMM-тест после child.
|
||||
Фактические значения и скриншоты приведены в
|
||||
[p1-platform-probes.md](p1-platform-probes.md).
|
||||
|
||||
Расширенные отрицательные случаи не блокируют skeleton P2 и перенесены к
|
||||
этапам, где появится использующий их код:
|
||||
|
||||
- переходы между дисками, корень, длинный путь и смена носителя — P3/P5;
|
||||
- исчерпание EMM — P5;
|
||||
- отсутствующий/повреждённый EXE и multi-bank loader fd — P4/P5;
|
||||
- ATTRIB и изменение даты/времени — версия 0.2.
|
||||
|
||||
## 7. Фаза P2 — skeleton приложения
|
||||
|
||||
### Цель
|
||||
|
||||
Получить запускаемое приложение с двумя пустыми панелями, экранной моделью и
|
||||
управлением, но без чтения каталога.
|
||||
|
||||
### Работы
|
||||
|
||||
1. Создать `Makefile`, `src/`, `include/`, `banks/`, `tests/`.
|
||||
2. Добавить `ScApp` и init/cleanup.
|
||||
3. Настроить сборку `--memory big --safe`.
|
||||
4. Выделить EMM-блок и получить три страницы.
|
||||
5. Зафиксировать прошедший P2.1 coordinate-screen probe: полный и частичный
|
||||
`WINREST`, `RDCHAR`, оба направления прямоугольного `SCROLL`, 1000
|
||||
операций и сохранение W3.
|
||||
6. Реализовать `sc_video_system` на `WINREST`/`WRCHAR`/`SCROLL`; не
|
||||
использовать BIOS window descriptors и прямой доступ к VRAM.
|
||||
7. Реализовать screen buffer и полный/частичный present через `sc_video`.
|
||||
8. Добавить `sc_glyphs.h` с CP866-глифами и test рамок, стрелок и block-
|
||||
элементов.
|
||||
9. Реализовать прямоугольный scroll одной панели в обоих направлениях;
|
||||
синхронно сдвигать экранную EMM-модель и проверять границы прямоугольника.
|
||||
10. Нарисовать две панели и нижнюю строку клавиш.
|
||||
11. Реализовать `ScKeyEvent`, `ScCommand` и главный цикл.
|
||||
12. Реализовать `Tab`, навигационные команды-заглушки и подтверждение `F10`.
|
||||
13. Добавить единый message dialog.
|
||||
14. Настроить первый интерактивный MAME-тест со скриншотом.
|
||||
15. Подключить прошедший P2.2 модуль темы: сохранить затрагиваемые записи
|
||||
четырёх планов, задать одинаковые normal/FLASH-пары и восстановить их при
|
||||
cleanup. Повторить тот же тест на реальном Sprinter.
|
||||
|
||||
### Критерий выхода P2
|
||||
|
||||
- `SPRCMD.EXE` собирается в `big`.
|
||||
- Экран соответствует схеме 80x32.
|
||||
- `Tab` меняет активную рамку.
|
||||
- Однострочный scroll не двигает рамку, соседнюю панель и общие строки.
|
||||
- Все соединения рамок, стрелки и block-элементы отображаются ожидаемыми
|
||||
CP866-глифами.
|
||||
- Экран остаётся читаемым во времени с подключённым многоцветным профилем.
|
||||
- Диалог F10 работает в обоих направлениях.
|
||||
- Выход освобождает EMM; повторные запуски не уменьшают свободную память.
|
||||
- В `.map` есть зафиксированный запас HOME и банков.
|
||||
|
||||
MAME-часть этих критериев достигнута 6 сентября 2026 года. Текущий skeleton
|
||||
имеет 7 276 байт heap в HOME, пока не использует W1-банки и дважды подряд
|
||||
восстановил число свободных EMM-страниц после выхода. Отдельный `sc_theme`
|
||||
сохранил/установил/восстановил четыре палитровых плана. Подробный сценарий и
|
||||
кадры: [p2-skeleton-results.md](p2-skeleton-results.md).
|
||||
|
||||
Аппаратный прогон остаётся внешним gate. Многоцветная тема P2.2 прошла MAME;
|
||||
на реальном Sprinter она проверяется вместе с остальными критериями P2.
|
||||
|
||||
## 8. Фаза P3 — панели и каталог
|
||||
|
||||
### Цель
|
||||
|
||||
Реализовать независимую навигацию по настоящей файловой системе.
|
||||
|
||||
### Работы
|
||||
|
||||
- `ScDirEntry` и build-time проверка размера 24 байта;
|
||||
- EMM store get/put/clear;
|
||||
- scan настоящего каталога;
|
||||
- синтетический `..`;
|
||||
- сортировка каталогов и файлов;
|
||||
- panel renderer;
|
||||
- cursor/top и постраничная навигация;
|
||||
- вход в каталог, parent, refresh;
|
||||
- сохранение позиции по имени;
|
||||
- отдельные пути панелей;
|
||||
- предупреждение о пределе 640 записей и отдельный красный маркер
|
||||
ограничения DSS после ошибки 35;
|
||||
- отображение ошибок носителя.
|
||||
|
||||
### Порядок реализации
|
||||
|
||||
1. Одна панель, маленький каталог.
|
||||
2. Пустой каталог и корень.
|
||||
3. Сортировка.
|
||||
4. Прокрутка за 27 строк.
|
||||
5. Вторая независимая панель.
|
||||
6. Большой каталог и предел страницы.
|
||||
7. Ошибки и восстановление CWD.
|
||||
|
||||
### Критерий выхода P3
|
||||
|
||||
- Выполнены `REQ-PANEL`, `REQ-NAV` и `REQ-FS` PoC.
|
||||
- Сто переходов/refresh не меняют EMM free pages.
|
||||
- Каталог на пределе не повреждает screen page.
|
||||
- Перемещение курсора не вызывает `ffirst/fnext`.
|
||||
- После ошибки обе панели остаются управляемыми.
|
||||
|
||||
## 9. Фаза P4 — копирование и запуск
|
||||
|
||||
### P4.1. Копирование
|
||||
|
||||
Порядок работ:
|
||||
|
||||
1. Проверка выбранной записи и построение путей.
|
||||
2. Проверка отсутствия конечного имени.
|
||||
3. Генерация temp с `O_EXCL`.
|
||||
4. Зарезервировать четвёртую EMM-страницу как рабочую область copy job.
|
||||
5. Добавить симметричные операции `bank_read_page()`/`bank_write_page()` для
|
||||
файлового обмена через W3 без полноразмерного буфера в W2.
|
||||
6. Копирование логическими блоками 4096 байт; возможное увеличение блока —
|
||||
только после измерения отзывчивости и скорости.
|
||||
5. 32-битный прогресс.
|
||||
6. Отмена через `Esc`.
|
||||
7. Cleanup на каждой точке ошибки.
|
||||
8. Повторная проверка конечного имени.
|
||||
9. Rename temp и refresh пассивной панели.
|
||||
10. Тесты размеров и побайтовое сравнение.
|
||||
|
||||
### P4.2. EXEC
|
||||
|
||||
Порядок работ:
|
||||
|
||||
1. Запуск минимального дочернего `.EXE`.
|
||||
2. Восстановление видеорежима и экрана.
|
||||
3. Восстановление CWD.
|
||||
4. Refresh панелей.
|
||||
5. Обработка ошибки запуска.
|
||||
6. Запуск существующего viewer как интеграционный тест.
|
||||
|
||||
### Критерий выхода P4
|
||||
|
||||
- Выполнены `REQ-COPY` и `REQ-EXEC`.
|
||||
- Большой файл копируется без 16-битного переполнения.
|
||||
- Cancel/error не оставляют temp.
|
||||
- Существующий файл не изменяется.
|
||||
- После дочерней программы Commander продолжает принимать команды.
|
||||
|
||||
## 10. Фаза P5 — стабилизация PoC 0.1
|
||||
|
||||
### Обязательная матрица
|
||||
|
||||
| Область | Сценарии |
|
||||
|---|---|
|
||||
| Каталог | пустой, один файл, 27/28, synthetic 640/641, DSS >512 физических записей |
|
||||
| Навигация | границы, repeat, две разные глубины каталогов |
|
||||
| Файлы | 0, 1, 4095, 4096, 65535, 65536, более 1 МБ |
|
||||
| Ошибки | ENOENT, EACCES/readonly, ENOSPC, смена носителя |
|
||||
| Copy cleanup | cancel в начале/середине/конце, ошибка read/write/rename |
|
||||
| EXEC | успех, отсутствующий файл, плохой EXE, возврат с другим экраном |
|
||||
| Ресурсы | 100 refresh, 20 copy, повторные запуск/выход |
|
||||
| Экран | полный redraw, dirty rows, диалог, возврат из EXE |
|
||||
|
||||
### Артефакты релиза PoC
|
||||
|
||||
- `SPRCMD.EXE`;
|
||||
- Makefile с `floppy`, `hdd` и `run`;
|
||||
- MAME-тесты и контрольные скриншоты;
|
||||
- test files с известными размерами/checksum;
|
||||
- отчёт размеров HOME/банков;
|
||||
- список известных ограничений;
|
||||
- инструкция запуска.
|
||||
|
||||
### Release gate 0.1
|
||||
|
||||
Все десять критериев раздела 10 требований выполнены. Наличие известной
|
||||
ошибки, способной повредить чужой файл или потерять EMM-блок, блокирует релиз.
|
||||
|
||||
Release gate выполнен в MAME 0.288 / BIOS 3.06 / DSS 1.71.57. Сводка,
|
||||
команды воспроизведения и ограничения зафиксированы в
|
||||
[p5-stability-results.md](p5-stability-results.md) и
|
||||
[poc-0.1-release.md](poc-0.1-release.md). Проверка на реальном Sprinter не
|
||||
подменяется MAME и остаётся обязательным последующим smoke-тестом.
|
||||
|
||||
## 11. Версия 0.2 — безопасное файловое ядро
|
||||
|
||||
### Цель
|
||||
|
||||
Сделать Commander пригодным для реальной работы с файлами без viewer/editor.
|
||||
|
||||
### Функции
|
||||
|
||||
- одна EMM-страница на панель и предел 640 записей сохраняются;
|
||||
- `Insert`, `*`, `+`/`-` и маски выбора — выполнены;
|
||||
- сортировки name/ext/size/date и reverse — выполнены и проверены в MAME;
|
||||
- последовательная очередь выбранных файлов F5 — выполнена;
|
||||
- рекурсивное копирование одного каталога и группы directory roots —
|
||||
выполнено; traversal hardening для больших деревьев остаётся;
|
||||
- F6 local rename — выполнено; межкаталожный/group move остаётся в работе;
|
||||
- F7 mkdir — выполнено и проверено в MAME;
|
||||
- F8 single file/empty-directory delete и recursive group delete выбранных
|
||||
файлов и каталогов — выполнены, включая runtime-cancel; защитная policy
|
||||
остаётся;
|
||||
- cancel между файлами и блоками;
|
||||
- overwrite/skip/rename и варианты all — выполнены для файлов, включая
|
||||
backup/rollback и readonly re-prompt; merge существующих каталогов позже;
|
||||
- проверка свободного места;
|
||||
- сохранение даты, времени и атрибутов обычных файлов — выполнено и
|
||||
проверено exact FAT-тестом; метаданные каталогов не входят в P18;
|
||||
- защита readonly при overwrite — выполнена; delete/move policy остаётся;
|
||||
- подсчёт итогов выбранной группы;
|
||||
- переключение дисков минимум через диалог.
|
||||
|
||||
### Внутренние работы
|
||||
|
||||
- сохранить одностраничный store и добавить к `ScPanel` ключ и направление сортировки;
|
||||
- расширить `ScJob` очередью и стеком каталогов;
|
||||
- сохранить crash-safe temp/commit модель;
|
||||
- добавить единый policy object для ошибок;
|
||||
- определить поведение при частично успешной группе.
|
||||
|
||||
### Критерий выхода 0.2
|
||||
|
||||
- Неделя dogfood без повреждения данных.
|
||||
- Рекурсивные операции проходят дерево глубиной не менее 16 уровней.
|
||||
- Рекурсивная job обрабатывает более 640 файлов суммарно в нескольких
|
||||
каталогах, не превращая саму панель в многостраничную.
|
||||
- Cancel оставляет уже завершённые файлы в определённом документированном
|
||||
состоянии и не оставляет temp.
|
||||
- Все разрушительные команды требуют подтверждения.
|
||||
|
||||
## 12. Версия 0.4 — рабочая оболочка
|
||||
|
||||
### Функции
|
||||
|
||||
- однострочная командная строка;
|
||||
- история команд и каталогов;
|
||||
- интерактивный полноэкранный pseudo-shell по `Ctrl+O`;
|
||||
- вставка имени/пути активной и пассивной панели;
|
||||
- запуск `.EXE` с параметрами;
|
||||
- file associations;
|
||||
- пользовательское меню;
|
||||
- F3 через отдельный viewer;
|
||||
- F4 через отдельный editor;
|
||||
- F9 и базовое меню;
|
||||
- режимы панелей `Brief`/`Details` по образцу VC;
|
||||
- конфигурационный файл;
|
||||
- сохранение путей, sort mode и палитры;
|
||||
- цветовые правила по расширениям; без файла: каталоги белые, EXE жёлтые,
|
||||
остальные файлы светло-серые;
|
||||
- `Ctrl+U`, `Ctrl+O`, root;
|
||||
- полноценный drive dialog;
|
||||
- краткая встроенная помощь.
|
||||
|
||||
### Протокол helper-программ
|
||||
|
||||
До реализации F3/F4 фиксируется небольшой контракт:
|
||||
|
||||
- полный путь передаётся аргументом;
|
||||
- код возврата различает успех, отмену и ошибку;
|
||||
- helper не обязан восстанавливать экран;
|
||||
- Commander всегда восстанавливает режим и перечитывает затронутую панель;
|
||||
- для editor предусматривается признак изменения файла.
|
||||
|
||||
### Критерий выхода 0.4
|
||||
|
||||
Commander можно использовать как основную оболочку DSS для навигации,
|
||||
операций, запуска программ, просмотра и редактирования файлов.
|
||||
|
||||
## 13. Версия 0.6 — возможности VC-класса
|
||||
|
||||
### Функции
|
||||
|
||||
- quick search по текущей панели;
|
||||
- постоянные фильтры/маски панели;
|
||||
- quick-view panel;
|
||||
- info panel;
|
||||
- размеры каталогов;
|
||||
- сравнение каталогов;
|
||||
- поиск файлов по имени;
|
||||
- поиск текста в файлах, если скорость приемлема;
|
||||
- виртуальная панель результатов поиска;
|
||||
- дерево каталогов;
|
||||
- история посещённых каталогов;
|
||||
- descriptions (`description.ion`/настраиваемое имя), если формат выбран;
|
||||
- изменение атрибутов и времени через UI.
|
||||
|
||||
### Архитектурный gate
|
||||
|
||||
Перед началом поиска должен быть стабилен интерфейс `ScSource`. Результаты
|
||||
поиска не должны притворяться настоящим каталогом с помощью специальных
|
||||
проверок по всему UI: они реализуются как отдельный source kind.
|
||||
|
||||
### Критерий выхода 0.6
|
||||
|
||||
Поиск и дерево работают на объёмах, превышающих near-memory, а возврат из
|
||||
виртуальной панели не теряет прежнее состояние настоящей панели.
|
||||
|
||||
## 14. Версия 0.8 — виртуальные источники и архивы
|
||||
|
||||
### Обязательные исследования
|
||||
|
||||
- какие архиваторы реально существуют для Sprinter;
|
||||
- можно ли получить листинг без распаковки;
|
||||
- достаточно ли внешнего процесса и list-файла;
|
||||
- какие форматы стоит поддерживать первыми;
|
||||
- сколько памяти требует нативный decoder;
|
||||
- разрешает ли лицензия включать выбранную реализацию.
|
||||
|
||||
### Предпочтительная последовательность
|
||||
|
||||
1. Внешний архиватор по шаблону команды.
|
||||
2. Просмотр архива как read-only `SC_SOURCE_ARCHIVE`.
|
||||
3. Извлечение выбранных файлов.
|
||||
4. Копирование файла в архив, если внешний инструмент поддерживает.
|
||||
5. Только затем — нативный decoder для одного востребованного формата.
|
||||
|
||||
### Дополнительные функции
|
||||
|
||||
- мышь;
|
||||
- локализация строк через resource file;
|
||||
- расширенная помощь;
|
||||
- bookmarks;
|
||||
- protocol внешних plugin/helper-программ;
|
||||
- сохранённые наборы конфигурации.
|
||||
|
||||
### Критерий выхода 0.8
|
||||
|
||||
Архивная и поисковая панели используют тот же panel UI без специальных
|
||||
ветвей в renderer и навигации. Ошибка внешнего архиватора не повреждает
|
||||
исходный архив.
|
||||
|
||||
## 15. Версия 1.0 — релизная стабилизация
|
||||
|
||||
К этому этапу уже должны быть закончены все назначенные функции 0.2–0.8.
|
||||
Отдельно проверяются три обязательных релизных контракта:
|
||||
|
||||
- командная строка и интерактивный полноэкранный pseudo-shell по `Ctrl+O`;
|
||||
- сортировка каждой панели по имени, расширению, размеру и дате, по
|
||||
возрастанию и убыванию;
|
||||
- подсветка по типу файла с настраиваемыми цветами и заданным поведением
|
||||
при отсутствии конфигурации.
|
||||
|
||||
Предел панели 640 записей в 1.0 остаётся штатным документированным
|
||||
ограничением.
|
||||
|
||||
### Надёжность
|
||||
|
||||
- проверка всех cleanup-path;
|
||||
- защита от двойного освобождения;
|
||||
- тесты нехватки EMM;
|
||||
- тесты предела файловых дескрипторов;
|
||||
- смена и извлечение носителя;
|
||||
- read-only и disk full;
|
||||
- повреждённые каталоги/архивы;
|
||||
- отмена каждой длительной операции;
|
||||
- безопасное обновление конфигурации через temp/rename.
|
||||
|
||||
### Производительность
|
||||
|
||||
- профилирование чтения больших каталогов;
|
||||
- профилирование сортировок EMM;
|
||||
- минимизация переключений W3;
|
||||
- группировка dirty rows;
|
||||
- размер блока copy по фактическим измерениям;
|
||||
- размер HOME и каждого банка;
|
||||
- время холодного запуска и возврата из helper.
|
||||
|
||||
### Совместимость
|
||||
|
||||
- MAME 0.287 / BIOS 3.06;
|
||||
- реальный Sprinter Sp2000;
|
||||
- DSS 1.71.57;
|
||||
- floppy и HDD;
|
||||
- минимум две конфигурации доступной EMM;
|
||||
- CP866 и Rus/Lat состояние клавиатуры.
|
||||
|
||||
### Документация релиза
|
||||
|
||||
- руководство пользователя;
|
||||
- полный keymap;
|
||||
- описание конфигурации;
|
||||
- восстановление после прерванной операции;
|
||||
- ограничения файловой системы;
|
||||
- лицензии и благодарности;
|
||||
- руководство сборки;
|
||||
- архитектурная памятка для добавления source/job/bank.
|
||||
|
||||
### Release gate 1.0
|
||||
|
||||
- Нет известных дефектов потери или скрытой порчи данных.
|
||||
- Все обязательные функции требований 1.0 реализованы; перенос любой из них
|
||||
требует нового явного решения о составе релиза.
|
||||
- Пройдены автоматические MAME-тесты и ручной hardware checklist.
|
||||
- Размеры HOME/банков имеют документированный запас.
|
||||
- Чистая сборка воспроизводима штатной командой проекта.
|
||||
|
||||
## 16. Версия 2.0+
|
||||
|
||||
Первый архитектурный рубеж после 1.0 — просмотр каталогов, содержащих более
|
||||
640 записей. Перед реализацией сравниваются два варианта.
|
||||
|
||||
**Вариант A: потоковые логические страницы.** Рекомендуемый первый шаг:
|
||||
|
||||
- в EMM по-прежнему находится только текущая страница и не более 640 строк;
|
||||
- виртуальные `<<< PAGE n` и `>>> PAGE n` занимают места в этом лимите;
|
||||
- при переходе каталог сканируется заново до требуемой логической позиции;
|
||||
- каталоги и файлы отбираются двумя проходами, чтобы каталоги оставались
|
||||
первыми во всём потоке;
|
||||
- сортировка выполняется только внутри текущей страницы и так обозначается
|
||||
в UI;
|
||||
- изменение каталога между проходами сбрасывает просмотр на первую страницу.
|
||||
|
||||
Текущий DSS API `F_FIRST/F_NEXT` не принимает ключ или направление
|
||||
сортировки. Незавершённые итераторы двух панелей не сохраняются: каждый
|
||||
переход заканчивает перебор либо начинает новый.
|
||||
|
||||
Платформенная предпосылка варианта A: стабильный DSS 1.71 не умеет перейти
|
||||
за 512-ю физическую FAT-запись и возвращает код 35. Потоковые страницы
|
||||
становятся реализуемыми только после перехода на расширенный режим
|
||||
`F_FIRST` (`B=0x80/0x81`) из экспериментальной ветки `beta_cdfs` либо после
|
||||
эквивалентного исправления DSS. До этого `>>> MORE...` является только
|
||||
информирующим маркером, а не переходом на страницу 2. Детали:
|
||||
[dss-large-directories.md](dss-large-directories.md).
|
||||
|
||||
**Вариант B: динамический EMM-store.** Он нужен, только если потребуются
|
||||
глобальная сортировка и произвольный переход между страницами:
|
||||
|
||||
- выбор модели 1024, 2048 или динамического предела по результатам замеров;
|
||||
- выделение и освобождение динамической цепочки EMM-страниц;
|
||||
- межстраничная сортировка или индекс без полной копии списка в W2;
|
||||
- определённое поведение при нехватке EMM на части каталога;
|
||||
- нагрузочные тесты многостраничных списков и отмены во время scan/sort.
|
||||
|
||||
Для обоих вариантов виртуальные записи имеют отдельный тип и не участвуют в
|
||||
выделении, файловых операциях и сортировке. Точный номер версии после 1.0
|
||||
фиксируется отдельным release gate; базовый релиз 1.0 от этого не зависит.
|
||||
|
||||
Прочий backlog, не влияющий на релиз 1.0:
|
||||
|
||||
- нативные архивные codecs;
|
||||
- FTP/serial/network source при наличии транспорта;
|
||||
- disk image source;
|
||||
- сравнение и синхронизация деревьев;
|
||||
- макросы;
|
||||
- очередь нескольких jobs;
|
||||
- background copy, только если появится безопасная модель многозадачности;
|
||||
- интеграция viewer/editor в банки Commander;
|
||||
- дополнительные режимы экрана.
|
||||
|
||||
DOS-специфические функции DN — CD player, modem terminal, disk recovery,
|
||||
spreadsheet, games и desktop окон — остаются отдельными приложениями.
|
||||
|
||||
## 17. Правило изменения плана
|
||||
|
||||
После каждого release gate обновляются:
|
||||
|
||||
1. Фактическое время этапа.
|
||||
2. Размер HOME и банков.
|
||||
3. Число обязательных EMM-страниц.
|
||||
4. Открытые платформенные риски.
|
||||
5. Состав следующей версии.
|
||||
|
||||
Новая функция не добавляется в текущий этап без одного из решений:
|
||||
|
||||
- она устраняет блокирующий риск текущего release gate;
|
||||
- она дешевле сейчас из-за уже изменяемого интерфейса;
|
||||
- другая функция того же объёма явно исключается из этапа.
|
||||
|
||||
Такой обмен фиксируется в этом документе, чтобы PoC и 1.0 не расширялись
|
||||
неуправляемо.
|
||||
Reference in New Issue
Block a user