@iwonz/ywtc 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +12 -24
- package/dist/report-ui/index.html +7 -7
- package/docs/assets/readme-header.png +0 -0
- package/docs/assets/report-header-transparent.png +0 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes to `ywtc` are documented in this file. Versions follow [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [4.1.1](https://github.com/iwonz/ywtc/compare/v4.1.0...v4.1.1) (2026-10-16)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **reports:** streamline report presentation and documentation ([0e9d14d](https://github.com/iwonz/ywtc/commit/0e9d14dd3e6c89380fd4c86aeb5193c1a7f3792a))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Maintenance
|
|
14
|
+
|
|
15
|
+
* **homebrew:** update formula to v4.1.0 ([f56cd34](https://github.com/iwonz/ywtc/commit/f56cd347eda1e682a8668a093188a4069e7ec5a8))
|
|
16
|
+
|
|
5
17
|
## [4.1.0](https://github.com/iwonz/ywtc/compare/v4.0.1...v4.1.0) (2026-10-16)
|
|
6
18
|
|
|
7
19
|
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## Описание
|
|
8
8
|
|
|
9
|
-
`ywtc` — CLI для переноса страниц между Yandex Wiki и Confluence и экспорта в Markdown или автономный HTML.
|
|
9
|
+
`ywtc` — CLI для переноса страниц между Yandex Wiki и Confluence и экспорта в Markdown или автономный HTML. Он сохраняет структуру и содержимое, продолжает операции по state-файлу и не удаляет source или destination автоматически.
|
|
10
10
|
|
|
11
11
|
Требуются Node.js `>=24` и npm `>=11.5.1`. Лицензия — [MIT](LICENSE).
|
|
12
12
|
|
|
@@ -29,15 +29,11 @@
|
|
|
29
29
|
| Ограничение | Поведение ywtc |
|
|
30
30
|
| --- | --- |
|
|
31
31
|
| История версий | Переносится только актуальное содержимое страницы. |
|
|
32
|
-
| Реакции
|
|
33
|
-
| Комментарии непосредственно к attachments, blog posts и custom content | Не входят в архив страницы; читаются только footer/inline page comments. |
|
|
32
|
+
| Реакции и комментарии не к странице | Реакции не копируются. Комментарии к attachments, blog posts и custom content не входят в архив: читаются только footer/inline page comments. |
|
|
34
33
|
| Пользовательские сущности, watchers, права и ограничения доступа | Не создаются; исходное авторство комментариев сохраняется в архивном тексте, а destination-объекты создаются пользователем текущего токена и наследуют права destination. |
|
|
35
34
|
| Удалённые, недоступные или не возвращённые source API страницы | Не восстанавливаются; недоступность и пропуски фиксируются в state и отчёте. |
|
|
36
|
-
| Точная
|
|
37
|
-
| Сторонние и неизвестные macros/виджеты | Не подменяются приблизительным macro без доказанного эквивалента: сохраняются безопасным статическим представлением и raw snapshot с явной degradation. |
|
|
35
|
+
| Точная геометрия, произвольный CSS, скрипты и неизвестные widgets/macros | Не исполняются и не подменяются недоказанным эквивалентом. Содержимое сохраняется статически, через fallback или raw snapshot; неполнота отмечается как degradation. |
|
|
38
36
|
| Внешние файлы и изображения, не принадлежащие source | Не копируются; абсолютный URL, подпись и доступные размеры сохраняются как external reference без ухудшения статуса. Недоступный source-managed ресурс считается неполным переносом. |
|
|
39
|
-
| Активные скрипты, iframe, формы и интерактивное поведение embed-объектов | Не исполняются в destination; вместо них сохраняется безопасное статическое представление или raw snapshot. |
|
|
40
|
-
| Пиксельная идентичность и поведение vendor-specific элементов без эквивалента | Используется ближайшее семантическое представление; различия явно отмечаются в отчёте. |
|
|
41
37
|
|
|
42
38
|
## Установка
|
|
43
39
|
|
|
@@ -72,7 +68,7 @@ ywtc update --install --via brew # явно через Homebrew
|
|
|
72
68
|
|
|
73
69
|
## Конфигурация
|
|
74
70
|
|
|
75
|
-
|
|
71
|
+
Рабочий каталог выбирается так: `--workdir` → текущий каталог с `ywtc.config.yaml` → `~/.ywtc`. Родительские каталоги не просматриваются; `migrate` автоматически создаёт отсутствующий workspace.
|
|
76
72
|
|
|
77
73
|
```text
|
|
78
74
|
~/.ywtc/
|
|
@@ -80,11 +76,7 @@ ywtc update --install --via brew # явно через Homebrew
|
|
|
80
76
|
└── .states/ # state, cache и отчёты
|
|
81
77
|
```
|
|
82
78
|
|
|
83
|
-
`ywtc init --interactive` требует TTY,
|
|
84
|
-
|
|
85
|
-
`ywtc migrate --interactive` использует тот же порядок выбора workspace, последовательно настраивает source, destination, scope, комментарии и файловый ZIP, а затем по умолчанию запускает dry-run. После него можно открыть отчёт, изменить параметры, повторить проверку или явно начать live-перенос. При неполном inventory, root error, `failed`, `blocked` или настоящем `conflict` live-действие скрывается.
|
|
86
|
-
|
|
87
|
-
Обычный `ywtc init` без wizard создаёт безопасный пустой шаблон для автоматизации или ручного управления. Полный пример с Yandex Wiki, Confluence Data Center, Confluence Cloud и сетевыми лимитами: [`ywtc.config.example.yaml`](ywtc.config.example.yaml).
|
|
79
|
+
`ywtc init --interactive` требует TTY, настраивает оба провайдера, скрывает токены и проверяет API и авторизацию, но не права конкретных страниц: их проверяют `doctor` и `migrate`. Для существующего workspace можно изменить профили или начать заново с backup YAML в `.states/backups/`; state сохраняется. Обычный `ywtc init` создаёт пустой шаблон. Полный пример: [`ywtc.config.example.yaml`](ywtc.config.example.yaml).
|
|
88
80
|
|
|
89
81
|
### Поля профилей
|
|
90
82
|
|
|
@@ -235,7 +227,7 @@ ywtc migrate --source https://wiki.example.com/team/start \
|
|
|
235
227
|
ywtc reports open last
|
|
236
228
|
```
|
|
237
229
|
|
|
238
|
-
|
|
230
|
+
`doctor` без endpoints проверяет workspace и конфигурацию, а с source и destination выполняет page-specific read-only capability-preflight.
|
|
239
231
|
|
|
240
232
|
## Файловый экспорт
|
|
241
233
|
|
|
@@ -247,21 +239,17 @@ Markdown создаёт `index.md`, `pages/`, `attachments/`, `.ywtc-export.json
|
|
|
247
239
|
|
|
248
240
|
## State
|
|
249
241
|
|
|
250
|
-
|
|
242
|
+
State хранится в `<workdir>/.states/<automatic-id>.json`. ID строится из канонических профилей и ID source/destination, для экспорта — также из формата; форма locator, `scope` и `source-status` его не меняют. Относительный `--state` остаётся внутри workspace. Live-run блокирует state от параллельной записи; подтверждённо stale lock восстанавливается.
|
|
251
243
|
|
|
252
244
|
### Повторные запуски
|
|
253
245
|
|
|
254
246
|
- Одинаковые source и destination автоматически подхватывают один state независимо от формы URL/ID/slug.
|
|
255
247
|
- Переключение `current → all` расширяет тот же state новыми страницами без дубликатов; обратное переключение не удаляет mappings вне текущего выбора.
|
|
256
248
|
- Подтверждённая state-mapping означает, что source авторитетен: отличающийся body, title или parent mapped-страницы обновляется поверх актуальной destination-версии, а прежнее содержимое остаётся в истории провайдера.
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
- Страница с прежним неизменённым служебным placeholder ywtc автоматически получает полноценный source-derived контент.
|
|
262
|
-
- Ошибка отдельного файла оставляет полный текст и source-ссылку, фиксирует `partial` и повторяет ресурс при следующем запуске.
|
|
263
|
-
- Неизменённые архивы комментариев и ZIP проверяются и переиспользуются без дубликатов. Mapped Confluence-архив обновляется новой версией из source, а Yandex Wiki получает новую архивную ревизию, поскольку Public API не предоставляет update comments.
|
|
264
|
-
- Удалённый mapped-комментарий создаётся заново. Исчезнувшие из доступного source API комментарии отмечаются `stale` и автоматически не удаляются.
|
|
249
|
+
- Неверный parent исправляется до потомков. Временный `404` повторяется с backoff; устойчиво пропавшая mapping восстанавливается под ожидаемым родителем с сохранением прежнего ID.
|
|
250
|
+
- Страницы и файлы сверяются по ID, размеру и SHA-256. Cache переиспользуется; неудачные вложения получают стабильные уникальные имена и повторяются без `--fresh`.
|
|
251
|
+
- Прежний неизменённый placeholder заменяется source-derived контентом. Ошибка файла оставляет полный текст и source-ссылку, даёт `partial` и повторяется позже.
|
|
252
|
+
- Архивы комментариев и ZIP проверяются и переиспользуются. Confluence-архив обновляется версией, Yandex Wiki получает новую ревизию; удалённый mapped-комментарий создаётся заново, исчезнувший source-архив помечается `stale`.
|
|
265
253
|
- Запуск с `--no-comments` не обращается к comment API и не удаляет ранее созданные архивы; следующий обычный запуск дополнит тот же state.
|
|
266
254
|
- `conflict` используется только при доказанной неоднозначности immutable ownership/identity: несколько source mappings на один destination ID, несовпадение возвращённого immutable ID или несколько равноправных ownership-кандидатов. Версия, title, URL, slug, parent, fingerprint, HTTP `409`, слово `conflict` в сообщении и коллизия имени сами по себе конфликтом не являются.
|
|
267
255
|
- `--fresh` игнорирует mappings; перед live-run прежний state сохраняется как backup, а destination может получить новые объекты.
|
|
@@ -273,7 +261,7 @@ Markdown создаёт `index.md`, `pages/`, `attachments/`, `.ywtc-export.json
|
|
|
273
261
|
|
|
274
262
|
Каждый запуск создаёт `<workdir>/.states/reports/<run-id>/index.html` и очищенный `report.json`, затем печатает run ID, `file://` URL и команду повторного открытия. `--open-report` открывает отчёт сразу; `ywtc reports list` показывает историю, `ywtc reports open <run-id>` — выбранный запуск, а `ywtc reports open last` или `ywtc reports open` — последний корректный.
|
|
275
263
|
|
|
276
|
-
Автономный HTML-отчёт работает без сети.
|
|
264
|
+
Автономный HTML-отчёт работает без сети. Плоская сводка показывает статус, время, ненулевые показатели source/destination и metadata в порядке `RUN ID`, `STATE`, `SOURCE`, `DESTINATION`; source и destination открываются по безопасным ссылкам. `report.json` доступен для скачивания. Нулевые необязательные показатели и пустые категории скрываются.
|
|
277
265
|
|
|
278
266
|
Ниже находится раскрытое дерево исходной иерархии, включая исключённые страницы; доступны поиск, фильтры проблем и прямые ссылки на source/destination. Строка страницы открывает только доступные вкладки файлов, комментариев, сравнения и проблем. Ошибки и зависимые `blocked` объекты подсвечиваются в дереве и объясняются в деталях. RU/EN и system/light/dark переключаются иконками; выбор сохраняется локально. Интерфейс адаптирован для мобильного экрана.
|
|
279
267
|
|