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
30 changes: 30 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ sha2 = "0.11.0"
sys-locale = "0.3.2"
toml = { version = "1.1.5", default-features = false, features = ["display", "parse", "serde"] }
toml_edit = { version = "0.25.13", default-features = false, features = ["display", "parse"] }
base64 = { version = "0.23.1", default-features = false, features = ["std"] }
zip = { version = "8.6.0", default-features = false, features = ["deflate-flate2-zlib-rs"] }

[target.'cfg(windows)'.dependencies]
self-replace = "1.5.0"
40 changes: 30 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,23 +104,28 @@ eska save -m "chore: Подключён проект eska"
```

В интерактивном терминале `eska init` сам определит тип выгрузки и предложит
выбрать workflow. Выберите вариант стрелками и нажмите Enter. После этого команда
создаст `eska.toml` и недостающие `.gitignore` / `.gitattributes`. Существующий
Git-репозиторий сохраняется; если его нет, создаётся новый с начальной веткой
`main`.
выбрать workflow и установленную платформу 1С. Выберите вариант стрелками и
нажмите Enter. Команда сохранит версию в `eska.toml` и создаст недостающие
`.gitignore` / `.gitattributes`. Существующий Git-репозиторий сохраняется; если
его нет, создаётся новый с начальной веткой `main`.

Для скрипта или перенаправленного ввода workflow нужно передать явно:
Для скрипта или перенаправленного ввода workflow и версию нужно передать явно:

```bash
eska init --workflow trunk
eska init --workflow trunk --platform-version 8.3.27.2325
```

Нестандартный каталог исходников задаётся явно:

```bash
eska init --source sources/configurator --workflow trunk
eska init --source sources/configurator --workflow trunk --platform-version 8.3.27.2325
```

`--select-platform` открывает меню установленных версий. Выбранный `ibcmd` должен
соответствовать версии; `--ibcmd`, `--platform-arch` и `--distrobox` позволяют
уточнить поиск. `init` проверяет версию платформы, но не запускает сборку или
создание информационной базы. Отмена выбора не создаёт файлов проекта.

### Создать новый проект

```bash
Expand Down Expand Up @@ -189,6 +194,15 @@ CF сначала загружается во временную файлову
исходники и настройки проекта публикуются после проверки. Существующее
назначение отклоняется.

Служебные сообщения `new` и `import` используют тематические маркеры:
`✓` — успех, `⚠` — предупреждение, `✗` — ошибка, `↩` — отмена.
В интерактивном терминале пути в результатах, preview и диагностике `eska`
оформляются ссылками OSC 8 на соответствующие файлы или каталоги.
Цвета включаются по тем же правилам, что у `build`; `NO_COLOR` отключает
цвета, сохраняя ссылки. При перенаправлении пути остаются обычным текстом
без управляющих последовательностей. Строки платформы `[INFO]`, `[WARN]`
и других уровней сохраняют только подсветку уровня, без новых маркеров.

### Обновить исходники из файла 1С

```bash
Expand All @@ -214,7 +228,8 @@ alias. Различие UUID/имени или незакоммиченные и

В workspace выбирается текущий участник либо один `-p <имя>`; из корня нужен
явный `-p`. `--dry-run` выполняет реальную распаковку и проверки, но оставляет
проект без изменений. Платформа берётся из настроек проекта/workspace;
проект без изменений; human-вывод завершается сообщением `ℹ` о завершённой
проверке. Платформа берётся из настроек проекта/workspace;
`--platform-version` и `--select-platform` задают одноразовый выбор для импорта.

Публикация выполняется после распаковки и повторной проверки исходников по
Expand Down Expand Up @@ -460,8 +475,9 @@ platform_version = "" # Укажите версию из `eska platform list`
artifacts_directory = "build"
```

`new` и `init` оставляют версию пустой. Для сборки её нужно заполнить либо выбрать
на один запуск; версия найденного `ibcmd` должна точно совпадать с выбранной.
Обычный `new` оставляет версию пустой. `init` и `new --from` сохраняют выбранную
версию. Для сборки незаполненную версию нужно указать в конфиге либо выбрать на
один запуск; версия найденного `ibcmd` должна точно совпадать с выбранной.

```bash
eska platform list
Expand Down Expand Up @@ -774,6 +790,10 @@ eska init

Тип определяется по XML, а имя — по каталогу. Если каталог не подходит под
переносимый формат `[a-z0-9][a-z0-9_-]*`, укажите `eska init --name my-orders`.
Версия платформы наследуется из корня без запуска `ibcmd`. `--platform-version`
или `--select-platform` сохраняют переопределение только у нового участника.
Если в корне версия не задана, `init` предлагает выбрать её; без интерактивного
терминала требуется `--platform-version`.
Вложенный Git repository, `.gitignore`, `.gitattributes` и member-level workflow
не создаются. `--workflow` в workspace отклоняется как корневая настройка.

Expand Down
27 changes: 24 additions & 3 deletions docs/ide-protocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,14 +200,35 @@ JavaScript не округлял большие значения. Они лок
| `metadata/root` | нет | `node:Node` |
| `metadata/children` | `node:NodeId,hideEmptyRootSections?:bool` (default true) | `nodes:Node[]` в порядке Конфигуратора |
| `metadata/get` | `objectId` | `object:Object` из уже открытой навигации |
| `metadata/properties` | `objectId` | `properties:Property[]` |
| `metadata/properties` | `objectId` | `properties:Property[],picture?:PicturePreview` |
| `metadata/source` | `node:NodeId` | `sources:[{path:Path,role,inline:[{metadataKind,name}]}]` |
| `metadata/search` | `text:string,limit?:1..500,synonymLanguage?:string` | `progress:Progress,hits:Hit[],truncated:bool` |
| `metadata/reveal` | `objectId` найденного элемента | `ancestry:NodeId[]` |
| `metadata/refresh` | `node:NodeId` | `affected:ObjectId[]` и новое generation |
| `metadata/index` | `action:"start"|"cancel"|"resume"|"status"` | `progress:Progress` |
| `metadata/indexErrors` | `offset?:number,limit?:1..500` | `errors:[{objectId,code,details}],nextOffset:number|null` |

С API 1.4 capability `picturePreview:true` означает, что `metadata/properties`
добавляет `picture` для `common-picture`. У других типов поле отсутствует.
`PicturePreview` — `{status:"ready",mimeType:string,data:string,fileName:string}`
или `{status:"missing"|"unsupported"|"invalid"|"too_large"|"unavailable"}`.
`data` содержит стандартный Base64 исходных байтов; имя файла служит подписью,
а не путём для открытия. Ошибка превью не отменяет получение свойств.
Поля и статусы не зависят от языка. Старые клиенты могут игнорировать это поле.

Читается только файл из `CommonPictures/<имя>/Ext/Picture.xml` →
`Picture/<xr:Abs>`. Поддерживаются PNG, JPEG, GIF, BMP, ICO, WebP и SVG;
MIME определяется содержимым. В ZIP выбирается вариант без `interfaceVariant`,
затем SVG или вариант с наибольшей объявленной площадью. Некорректный манифест
не заменяется произвольным изображением из архива: возвращается статус ошибки.
Если манифеста нет, используется SVG или файл с наибольшим числовым именем,
затем лексический порядок.
ZIP поддерживает Stored/DEFLATE; распаковки на диск нет. Лимиты: архив 32 MiB,
картинка 8 MiB, каждый XML 64 KiB, 512 записей архива. Ссылки содержат только
имя файла; выход через symlink за source запрещён. Бинарные данные не кешируются:
повторный запрос читает актуальную картинку. Декодирование изображения и его
размеров выполняет клиент; неподдерживаемые браузером варианты дают ошибку превью.

Предопределённые элементы имеют `metadataKind:"predefined-item"`. Их группа —
обычный `collection` с `collection:{kind:"metadata",metadataKind:"predefined-item"}`;
она загружает Predefined.xml при `metadata/children`. Элементы сохраняют
Expand Down Expand Up @@ -243,8 +264,8 @@ code=unsupported_metadata, details={diagnostics:Diagnostic[]}.
перестраивает поисковые записи, переиспользуя кеш, но не обнаруживает пропущенные
file events: для этого нужен refresh. Смена root-фильтра — только представление;
не изменяет IDs, generation и вложенные группы. Группа модулей идёт первой,
expandedByDefault следует T65; клиенты не заменяют пользовательское раскрытие
при каждом новом ответе этим первоначальным значением.
expandedByDefault для группы модулей равен false (T65); клиенты не заменяют
пользовательское раскрытие при каждом новом ответе этим первоначальным значением.

## Планировщик и отмена

Expand Down
46 changes: 44 additions & 2 deletions docs/roadmap/02-project-creation.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,26 @@ workspace, locale-independent JSON и 12 PTY-сценариев RU/EN. Наст
ошибочный файл и общая временная область workspace. Настоящий ERF
для этого повторного прогона не использовался.

Представление `new/import` дополнено маркерами результата, preview,
предупреждения, ошибки и отмены. Нативные строки уровней платформы
сохраняют только подсветку. Все структурированные пути в human-сообщениях
этих команд, включая ошибки discovery/config/platform и recovery-копии,
в TTY оформляются ссылками OSC 8. `cli/path_output` переиспользуется
и для прежней ссылки `build` на каталог артефакта; URI кодирует байты
пути и специальные символы, видимый текст экранирует управляющие символы.
Каждый поток самостоятельно определяет TTY; `NO_COLOR` отключает цвета,
ссылки сохраняются. Redirected-вывод не содержит ANSI/OSC 8, JSON v1
не меняется. Human `import --dry-run` завершается информационным сообщением.
T82 остаётся `DONE`.

Проверки представления: полный fmt/check/strict Clippy/test/Rustdoc успешен,
583 теста прошли, 6 opt-in тестов пропущены. 42 PTY-прогона RU/EN покрыли
четыре типа файлов, standalone/workspace, подтверждение/отмену,
`NO_COLOR`, независимый TTY stdout/stderr, JSON и ссылки на ошибочные
относительные пути из manifest. Настоящая `8.3.27.2325` проверена на
CF/CFE/EPF; входные файлы сохранили SHA-256. Повторный настоящий ERF
и нативные Windows/macOS-прогоны не выполнялись.

## T04 — `eska new`

**Статус:** `DONE`
Expand Down Expand Up @@ -221,13 +241,35 @@ rollback сценарии протестированы.
дескрипторов в одном каталоге отклоняются. Ссылки разрешаются только внутри
корня, конфигурация сохраняет нормализованный относительный source.

Дополнение 2026-09-30: `init` использует тот же выбор установленной платформы,
что `new --from`, и сохраняет `[build].platform_version` до завершения
инициализации. Для standalone без TTY обязательны `--workflow` и
`--platform-version`. `--select-platform` открывает меню; параметры `--ibcmd`,
`--platform-arch`, `--distrobox` уточняют поиск. Проверяется точное соответствие
версии `ibcmd`, без создания базы или сборки. Отмена и ошибки выбора происходят
до записи config и Git-файлов.

В workspace `init` по умолчанию наследует версию корня без запуска платформы.
Явный выбор или незаполненная версия корня сохраняют member-level
`platform_version`; каталог артефактов и workflow остаются корневыми. Проверка
возможности включения участника выполняется до выбора платформы. Внутренний
`project::init::apply` теперь принимает валидированные `BuildSettings`, а
`WorkspaceInitPlan::with_build_settings` задаёт переопределение после preflight.

Проверки дополнения: полный fmt/check/strict Clippy/test/Rustdoc проходит,
586 тестов успешно, 6 явно пропущены. CLI-тесты покрывают RU/EN, сохранение версии,
наследование и переопределение, ошибки до записи и сохранность XML/Git-файлов.
14 PTY-сценариев RU/EN проверяют оба меню, отмену и восстановление терминала;
2 из них используют установленную 1С 8.3.27.2325 через Distrobox. Проверки
выполнены на Linux; Windows/macOS не запускались. T06 остаётся `DONE`.

Тип определяется из namespace-aware XML: `Configuration`, расширение с
`ConfigurationExtensionPurpose` в его `Properties`, `ExternalDataProcessor` или
`ExternalReport`. `ConfigurationExtensionCompatibilityMode` не используется как
признак расширения, поскольку встречается и в обычных конфигурациях. Корневой
элемент — `MetaDataObject` в `http://v8.1c.ru/8.3/MDClasses`. Поэтому `--type`
не требуется и не добавлен. В TTY запрашивается только неизвестный workflow;
без TTY он обязателен через флаг. Общий selector получил параметр заголовка и
не требуется и не добавлен. В TTY запрашиваются неизвестный workflow и платформа;
без TTY они обязательны через флаги. Общий selector получил параметр заголовка и
единый список workflow, управление клавишами и fallback раскладки сохранены.
RU/EN help, результат, отмена и структурированные ошибки локализованы.

Expand Down
4 changes: 2 additions & 2 deletions docs/roadmap/13-metadata-and-ide.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,8 @@ IDs четырёх типов проектов совпадают с прежн
объекта, менеджера, набора записей, менеджера значения и другие роли из матрицы
T60. Модули `.bin` без BSL скрыты; сам владеющий объект остаётся видимым.
Модули конфигурации также получают отдельную первую группу перед «Общие».
Подтверждено: только существующие BSL-файлы, группа раскрыта при первом
открытии владельца; дальнейшее состояние сохраняет T77.
Подтверждено: только существующие BSL-файлы. По запросу от 2026-09-30 группа
«Модули» свернута при первом открытии владельца; дальнейшее состояние сохраняет T77.

Иллюстрация требуемых различий, окончательный порядок подтверждают fixtures:

Expand Down
Loading