@iwonz/ywtc 4.0.1 → 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 +26 -0
- package/README.md +45 -57
- package/dist/cli-arguments.d.ts +3 -2
- package/dist/cli-arguments.js +42 -37
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli.js +18 -141
- package/dist/cli.js.map +1 -1
- package/dist/interactive-init.d.ts +3 -3
- package/dist/interactive-init.js +7 -5
- package/dist/interactive-init.js.map +1 -1
- package/dist/interactive-migrate.d.ts +23 -0
- package/dist/interactive-migrate.js +578 -0
- package/dist/interactive-migrate.js.map +1 -0
- package/dist/migration-command.d.ts +19 -0
- package/dist/migration-command.js +160 -0
- package/dist/migration-command.js.map +1 -0
- package/dist/report-ui/index.html +19 -25
- package/dist/{init-prompts.d.ts → wizard-prompts.d.ts} +2 -2
- package/dist/{init-prompts.js → wizard-prompts.js} +3 -3
- package/dist/wizard-prompts.js.map +1 -0
- package/docs/assets/readme-header.png +0 -0
- package/docs/assets/report-header-transparent.png +0 -0
- package/package.json +3 -7
- package/dist/init-prompts.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
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
|
+
|
|
17
|
+
## [4.1.0](https://github.com/iwonz/ywtc/compare/v4.0.1...v4.1.0) (2026-10-16)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* **cli:** add interactive migration wizard ([b185d42](https://github.com/iwonz/ywtc/commit/b185d421ec1ed46643a9e0d899a4d8c47e259bd5))
|
|
23
|
+
* **reports:** replace report UI with Mantine ([8ca093d](https://github.com/iwonz/ywtc/commit/8ca093de620fdfb762a6946a04ee868c14a11b0f))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Maintenance
|
|
27
|
+
|
|
28
|
+
* **homebrew:** update formula to v4.0.1 ([e3d7aa6](https://github.com/iwonz/ywtc/commit/e3d7aa6450d78c23fbab33b6ba14d96baf919f81))
|
|
29
|
+
* **release:** retry validated release workflow ([b1fca35](https://github.com/iwonz/ywtc/commit/b1fca35926dccb8616d04d4b5901263f99f2ec74))
|
|
30
|
+
|
|
5
31
|
## [4.0.1](https://github.com/iwonz/ywtc/compare/v4.0.0...v4.0.1) (2026-10-16)
|
|
6
32
|
|
|
7
33
|
|
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
|
|
|
@@ -66,15 +62,13 @@ ywtc update --install --via brew # явно через Homebrew
|
|
|
66
62
|
|
|
67
63
|
## Минимальный сценарий
|
|
68
64
|
|
|
69
|
-
- [ ] Установите
|
|
70
|
-
- [ ]
|
|
71
|
-
- [ ]
|
|
72
|
-
- [ ] Выполните предложенную wizard команду первой миграции с `--dry-run`, подставив полные URL страниц.
|
|
73
|
-
- [ ] Проверьте план и повторите команду без `--dry-run`.
|
|
65
|
+
- [ ] Установите `ywtc` одним из способов выше.
|
|
66
|
+
- [ ] Выполните `ywtc init --interactive`.
|
|
67
|
+
- [ ] Выполните `ywtc migrate --interactive`.
|
|
74
68
|
|
|
75
69
|
## Конфигурация
|
|
76
70
|
|
|
77
|
-
|
|
71
|
+
Рабочий каталог выбирается так: `--workdir` → текущий каталог с `ywtc.config.yaml` → `~/.ywtc`. Родительские каталоги не просматриваются; `migrate` автоматически создаёт отсутствующий workspace.
|
|
78
72
|
|
|
79
73
|
```text
|
|
80
74
|
~/.ywtc/
|
|
@@ -82,9 +76,7 @@ ywtc update --install --via brew # явно через Homebrew
|
|
|
82
76
|
└── .states/ # state, cache и отчёты
|
|
83
77
|
```
|
|
84
78
|
|
|
85
|
-
`ywtc init --interactive` требует TTY,
|
|
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
|
|
|
@@ -165,7 +157,8 @@ Confluence Server, Data Center Basic Auth и OAuth app-flow не поддерж
|
|
|
165
157
|
| --- | --- |
|
|
166
158
|
| `ywtc init [--workdir <path>] [--interactive]` | Создать шаблон либо настроить и проверить подключения в TTY wizard |
|
|
167
159
|
| `ywtc doctor [options]` | Проверить workspace; с source и destination выполнить read-only preflight |
|
|
168
|
-
| `ywtc migrate --
|
|
160
|
+
| `ywtc migrate --interactive` | Выбрать параметры, выполнить dry-run и явно продолжить live-перенос в TTY wizard |
|
|
161
|
+
| `ywtc migrate --source <locator> --destination <locator\|directory> [options]` | Неинтерактивно перенести или экспортировать выбранный граф страниц |
|
|
169
162
|
| `ywtc reports list [--workdir <path>]` | Показать локальные отчёты от новых к старым |
|
|
170
163
|
| `ywtc reports open [run-id\|last] [--workdir <path>]` | Открыть выбранный отчёт; `last` или отсутствие аргумента открывает последний корректный |
|
|
171
164
|
| `ywtc update [--install] [--via npm\|brew]` | Проверить или установить обновление безопасным для текущего канала способом |
|
|
@@ -174,28 +167,30 @@ Confluence Server, Data Center Basic Auth и OAuth app-flow не поддерж
|
|
|
174
167
|
|
|
175
168
|
### Опции
|
|
176
169
|
|
|
177
|
-
|
|
|
178
|
-
| --- | --- | --- | --- |
|
|
179
|
-
| `--
|
|
180
|
-
| `--
|
|
181
|
-
| `--source
|
|
182
|
-
| `--destination
|
|
183
|
-
| `--
|
|
184
|
-
| `--
|
|
185
|
-
| `--
|
|
186
|
-
| `--
|
|
187
|
-
| `--
|
|
188
|
-
| `--
|
|
189
|
-
| `--
|
|
190
|
-
| `--
|
|
191
|
-
| `--
|
|
192
|
-
| `--
|
|
193
|
-
| `--
|
|
194
|
-
| `--
|
|
195
|
-
| `--install` | `update` | default `false` | Установить найденное обновление |
|
|
196
|
-
| `--via <channel>` | `update` | `npm` или `brew` | Явно выбрать совместимый канал обновления |
|
|
197
|
-
|
|
|
198
|
-
|
|
|
170
|
+
| Полная опция | Short | Команды | Обязательность / значения | Назначение |
|
|
171
|
+
| --- | --- | --- | --- | --- |
|
|
172
|
+
| `--interactive` | `-i` | `init`, `migrate` | требует stdin/stdout TTY | Запустить обязательный мастер настройки или миграции |
|
|
173
|
+
| `--workdir <path>` | `-w` | `init`, `doctor`, `migrate`, `reports` | config в CWD или `~/.ywtc` | Явно выбрать workspace; поддерживается `~/...` |
|
|
174
|
+
| `--source <value>` | `-s` | `doctor`, `migrate` | обязательно для неинтерактивного `migrate`; в `doctor` вместе с destination | URL, page ID или Yandex slug |
|
|
175
|
+
| `--destination <value>` | `-d` | `doctor`, `migrate` | обязательно для неинтерактивного `migrate`; в `doctor` вместе с source | Родительская страница или каталог экспорта |
|
|
176
|
+
| `--source-profile <name>` | `-S` | `doctor`, `migrate` | при неоднозначном коротком locator | Профиль source из `connections` |
|
|
177
|
+
| `--destination-profile <name>` | `-D` | `doctor`, `migrate` | при неоднозначном remote locator | Профиль destination; несовместим с файловым экспортом |
|
|
178
|
+
| `--scope <mode>` | `-m` | `doctor`, `migrate` | `page`, `subtree` (default), `linked` | Граница выбора страниц |
|
|
179
|
+
| `--source-status <status>` | `-t` | `doctor`, `migrate` | `all` (default) или `current` | Статус автоматически обнаруживаемых страниц; явно заданный root включается всегда |
|
|
180
|
+
| `--comments` / `--no-comments` | `-C` / `-N` | `doctor`, `migrate` | комментарии включены по умолчанию | Архивировать page comments или полностью отключить их чтение и запись |
|
|
181
|
+
| `--format <format>` | `-f` | `doctor`, `migrate` | `markdown` или `html` | Делает destination файловым каталогом |
|
|
182
|
+
| `--archive` | `-a` | `migrate` | только с файловым destination | Дополнительно создать ZIP рядом с каталогом |
|
|
183
|
+
| `--dry-run` | `-n` | `migrate` | default `false`; default-действие wizard | Discovery и план без записи в destination |
|
|
184
|
+
| `--fresh` | `-F` | `migrate` | default `false` | Игнорировать mappings текущего state |
|
|
185
|
+
| `--open-report` | `-o` | `migrate` | default `false` | Открыть итоговый HTML-отчёт; ошибка браузера не меняет результат миграции |
|
|
186
|
+
| `--concurrency <n>` | `-j` | `migrate` | `1..64`; иначе config default | Общая параллельность; профильные лимиты сохраняются |
|
|
187
|
+
| `--state <path>` | `-r` | `migrate` | внутри workspace | Явный state вместо автоматического |
|
|
188
|
+
| `--install` | `-i` | `update` | default `false` | Установить найденное обновление |
|
|
189
|
+
| `--via <channel>` | `-c` | `update` | `npm` или `brew` | Явно выбрать совместимый канал обновления |
|
|
190
|
+
| `--help` | `-h` | CLI и команды | необязательно | Справка |
|
|
191
|
+
| `--version` | `-v` | CLI | необязательно | Версия |
|
|
192
|
+
|
|
193
|
+
Одинаковые short-алиасы относятся только к своей команде: например, `migrate -i` запускает wizard, а `update -i` устанавливает обновление. В интерактивном режиме переданные опции становятся редактируемыми начальными значениями; без него `source` и `destination` обязательны.
|
|
199
194
|
|
|
200
195
|
### Локаторы
|
|
201
196
|
|
|
@@ -223,21 +218,16 @@ ywtc migrate --source https://wiki.example.com/team/start \
|
|
|
223
218
|
--destination https://confluence.example.com/confluence/pages/viewpage.action?pageId=123 \
|
|
224
219
|
--scope linked
|
|
225
220
|
|
|
226
|
-
#
|
|
227
|
-
ywtc migrate --source https://wiki.example.com/team/start \
|
|
228
|
-
--destination https://confluence.example.com/confluence/pages/viewpage.action?pageId=123 \
|
|
229
|
-
--scope page
|
|
230
|
-
|
|
231
|
-
# Создать автономный HTML-экспорт
|
|
221
|
+
# Создать автономный HTML-экспорт и ZIP
|
|
232
222
|
ywtc migrate --source https://wiki.example.com/team/start \
|
|
233
223
|
--destination ./exports/knowledge-base \
|
|
234
|
-
--format html
|
|
224
|
+
--format html --archive
|
|
235
225
|
|
|
236
226
|
# Открыть последний корректный отчёт
|
|
237
227
|
ywtc reports open last
|
|
238
228
|
```
|
|
239
229
|
|
|
240
|
-
|
|
230
|
+
`doctor` без endpoints проверяет workspace и конфигурацию, а с source и destination выполняет page-specific read-only capability-preflight.
|
|
241
231
|
|
|
242
232
|
## Файловый экспорт
|
|
243
233
|
|
|
@@ -249,21 +239,17 @@ Markdown создаёт `index.md`, `pages/`, `attachments/`, `.ywtc-export.json
|
|
|
249
239
|
|
|
250
240
|
## State
|
|
251
241
|
|
|
252
|
-
|
|
242
|
+
State хранится в `<workdir>/.states/<automatic-id>.json`. ID строится из канонических профилей и ID source/destination, для экспорта — также из формата; форма locator, `scope` и `source-status` его не меняют. Относительный `--state` остаётся внутри workspace. Live-run блокирует state от параллельной записи; подтверждённо stale lock восстанавливается.
|
|
253
243
|
|
|
254
244
|
### Повторные запуски
|
|
255
245
|
|
|
256
246
|
- Одинаковые source и destination автоматически подхватывают один state независимо от формы URL/ID/slug.
|
|
257
247
|
- Переключение `current → all` расширяет тот же state новыми страницами без дубликатов; обратное переключение не удаляет mappings вне текущего выбора.
|
|
258
248
|
- Подтверждённая state-mapping означает, что source авторитетен: отличающийся body, title или parent mapped-страницы обновляется поверх актуальной destination-версии, а прежнее содержимое остаётся в истории провайдера.
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
- Страница с прежним неизменённым служебным placeholder ywtc автоматически получает полноценный source-derived контент.
|
|
264
|
-
- Ошибка отдельного файла оставляет полный текст и source-ссылку, фиксирует `partial` и повторяет ресурс при следующем запуске.
|
|
265
|
-
- Неизменённые архивы комментариев и ZIP проверяются и переиспользуются без дубликатов. Mapped Confluence-архив обновляется новой версией из source, а Yandex Wiki получает новую архивную ревизию, поскольку Public API не предоставляет update comments.
|
|
266
|
-
- Удалённый 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`.
|
|
267
253
|
- Запуск с `--no-comments` не обращается к comment API и не удаляет ранее созданные архивы; следующий обычный запуск дополнит тот же state.
|
|
268
254
|
- `conflict` используется только при доказанной неоднозначности immutable ownership/identity: несколько source mappings на один destination ID, несовпадение возвращённого immutable ID или несколько равноправных ownership-кандидатов. Версия, title, URL, slug, parent, fingerprint, HTTP `409`, слово `conflict` в сообщении и коллизия имени сами по себе конфликтом не являются.
|
|
269
255
|
- `--fresh` игнорирует mappings; перед live-run прежний state сохраняется как backup, а destination может получить новые объекты.
|
|
@@ -275,7 +261,9 @@ Markdown создаёт `index.md`, `pages/`, `attachments/`, `.ywtc-export.json
|
|
|
275
261
|
|
|
276
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` — последний корректный.
|
|
277
263
|
|
|
278
|
-
Автономный HTML-отчёт работает без сети.
|
|
264
|
+
Автономный HTML-отчёт работает без сети. Плоская сводка показывает статус, время, ненулевые показатели source/destination и metadata в порядке `RUN ID`, `STATE`, `SOURCE`, `DESTINATION`; source и destination открываются по безопасным ссылкам. `report.json` доступен для скачивания. Нулевые необязательные показатели и пустые категории скрываются.
|
|
265
|
+
|
|
266
|
+
Ниже находится раскрытое дерево исходной иерархии, включая исключённые страницы; доступны поиск, фильтры проблем и прямые ссылки на source/destination. Строка страницы открывает только доступные вкладки файлов, комментариев, сравнения и проблем. Ошибки и зависимые `blocked` объекты подсвечиваются в дереве и объясняются в деталях. RU/EN и system/light/dark переключаются иконками; выбор сохраняется локально. Интерфейс адаптирован для мобильного экрана.
|
|
279
267
|
|
|
280
268
|
HTML/JSON, итог терминала и `reports list` используют одинаковые счётчики. Известный source volume отделён от подтверждённых transferred bytes; неизвестные размеры отмечены явно. `report.json` не содержит содержимое страниц, тексты комментариев или preview HTML — они остаются только в локальном `index.html`.
|
|
281
269
|
|
package/dist/cli-arguments.d.ts
CHANGED
|
@@ -23,8 +23,8 @@ export type CliCommand = {
|
|
|
23
23
|
format?: ExportFormat;
|
|
24
24
|
} | {
|
|
25
25
|
command: 'migrate';
|
|
26
|
-
source
|
|
27
|
-
destination
|
|
26
|
+
source?: string;
|
|
27
|
+
destination?: string;
|
|
28
28
|
sourceProfile?: string;
|
|
29
29
|
destinationProfile?: string;
|
|
30
30
|
scope: TransferScope;
|
|
@@ -38,6 +38,7 @@ export type CliCommand = {
|
|
|
38
38
|
concurrency?: number;
|
|
39
39
|
stateFilename?: string;
|
|
40
40
|
openReport: boolean;
|
|
41
|
+
interactive: boolean;
|
|
41
42
|
} | {
|
|
42
43
|
command: 'reports-list';
|
|
43
44
|
workdir?: string;
|
package/dist/cli-arguments.js
CHANGED
|
@@ -23,24 +23,24 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
23
23
|
.showSuggestionAfterError(true);
|
|
24
24
|
program.command('init')
|
|
25
25
|
.description('Create a workspace or configure it with a guided terminal wizard')
|
|
26
|
-
.option('--workdir <path>', 'workspace to initialize')
|
|
27
|
-
.option('--interactive', 'configure Yandex Wiki and Confluence in a TTY wizard', false)
|
|
26
|
+
.option('-w, --workdir <path>', 'workspace to initialize')
|
|
27
|
+
.option('-i, --interactive', 'configure Yandex Wiki and Confluence in a TTY wizard', false)
|
|
28
28
|
.action((options) => {
|
|
29
29
|
const workdir = nonEmpty(options.workdir, '--workdir');
|
|
30
30
|
onCommand({ command: 'init', interactive: options.interactive, ...(workdir ? { workdir } : {}) });
|
|
31
31
|
});
|
|
32
32
|
program.command('doctor')
|
|
33
33
|
.description('Validate profiles and optionally perform read-only endpoint preflight')
|
|
34
|
-
.option('--workdir <path>', 'workspace to inspect')
|
|
35
|
-
.option('--source <locator>', 'source page URL, ID, or slug')
|
|
36
|
-
.option('--destination <locator>', 'destination page URL, ID, slug, or directory')
|
|
37
|
-
.option('--source-profile <name>', 'named source connection')
|
|
38
|
-
.option('--destination-profile <name>', 'named destination connection')
|
|
39
|
-
.addOption(new Option('--scope <scope>', 'selection scope').choices(['page', 'subtree', 'linked']).default('subtree'))
|
|
40
|
-
.addOption(new Option('--source-status <status>', 'automatically discovered page status').choices(['all', 'current']).default('all'))
|
|
41
|
-
.option('--comments', 'read and archive page comments (default)', true)
|
|
42
|
-
.option('--no-comments', 'skip all comment API calls and archive work')
|
|
43
|
-
.addOption(new Option('--format <format>', 'filesystem format').choices(['markdown', 'html']))
|
|
34
|
+
.option('-w, --workdir <path>', 'workspace to inspect')
|
|
35
|
+
.option('-s, --source <locator>', 'source page URL, ID, or slug')
|
|
36
|
+
.option('-d, --destination <locator>', 'destination page URL, ID, slug, or directory')
|
|
37
|
+
.option('-S, --source-profile <name>', 'named source connection')
|
|
38
|
+
.option('-D, --destination-profile <name>', 'named destination connection')
|
|
39
|
+
.addOption(new Option('-m, --scope <scope>', 'selection scope').choices(['page', 'subtree', 'linked']).default('subtree'))
|
|
40
|
+
.addOption(new Option('-t, --source-status <status>', 'automatically discovered page status').choices(['all', 'current']).default('all'))
|
|
41
|
+
.option('-C, --comments', 'read and archive page comments (default)', true)
|
|
42
|
+
.option('-N, --no-comments', 'skip all comment API calls and archive work')
|
|
43
|
+
.addOption(new Option('-f, --format <format>', 'filesystem format').choices(['markdown', 'html']))
|
|
44
44
|
.action((options) => {
|
|
45
45
|
const source = nonEmpty(options.source, '--source');
|
|
46
46
|
const destination = nonEmpty(options.destination, '--destination');
|
|
@@ -62,23 +62,24 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
program.command('migrate')
|
|
65
|
-
.description('Transfer or export a page graph')
|
|
66
|
-
.
|
|
67
|
-
.
|
|
68
|
-
.option('
|
|
69
|
-
.option('--
|
|
70
|
-
.
|
|
71
|
-
.addOption(new Option('
|
|
72
|
-
.
|
|
73
|
-
.option('--
|
|
74
|
-
.
|
|
75
|
-
.
|
|
76
|
-
.option('--
|
|
77
|
-
.option('--
|
|
78
|
-
.option('--
|
|
79
|
-
.option('--
|
|
80
|
-
.option('--
|
|
81
|
-
.option('--
|
|
65
|
+
.description('Transfer or export a page graph, optionally through a TTY wizard')
|
|
66
|
+
.option('-i, --interactive', 'choose migration parameters and dry-run/live actions in a TTY wizard', false)
|
|
67
|
+
.option('-s, --source <locator>', 'source page URL, ID, or slug (required without --interactive)')
|
|
68
|
+
.option('-d, --destination <locator>', 'destination page URL, ID, slug, or directory (required without --interactive)')
|
|
69
|
+
.option('-S, --source-profile <name>', 'named source connection')
|
|
70
|
+
.option('-D, --destination-profile <name>', 'named destination connection')
|
|
71
|
+
.addOption(new Option('-m, --scope <scope>', 'selection scope').choices(['page', 'subtree', 'linked']).default('subtree'))
|
|
72
|
+
.addOption(new Option('-t, --source-status <status>', 'automatically discovered page status').choices(['all', 'current']).default('all'))
|
|
73
|
+
.option('-C, --comments', 'read and archive page comments (default)', true)
|
|
74
|
+
.option('-N, --no-comments', 'skip all comment API calls and archive work')
|
|
75
|
+
.addOption(new Option('-f, --format <format>', 'filesystem format').choices(['markdown', 'html']))
|
|
76
|
+
.option('-a, --archive', 'also create a ZIP for filesystem output', false)
|
|
77
|
+
.option('-w, --workdir <path>', 'workspace (configured CWD, then ~/.ywtc)')
|
|
78
|
+
.option('-n, --dry-run', 'discover and render without destination writes', false)
|
|
79
|
+
.option('-F, --fresh', 'ignore mappings and preserve existing live state as a backup', false)
|
|
80
|
+
.option('-o, --open-report', 'open the generated HTML report in the system browser', false)
|
|
81
|
+
.option('-j, --concurrency <n>', 'orchestration concurrency from 1 to 64', concurrency)
|
|
82
|
+
.option('-r, --state <path>', 'state path inside workdir')
|
|
82
83
|
.action((options) => {
|
|
83
84
|
const source = nonEmpty(options.source, '--source');
|
|
84
85
|
const destination = nonEmpty(options.destination, '--destination');
|
|
@@ -86,14 +87,15 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
86
87
|
const destinationProfile = nonEmpty(options.destinationProfile, '--destination-profile');
|
|
87
88
|
const workdir = nonEmpty(options.workdir, '--workdir');
|
|
88
89
|
const stateFilename = nonEmpty(options.state, '--state');
|
|
89
|
-
if (options.
|
|
90
|
+
if (!options.interactive && (!source || !destination)) {
|
|
91
|
+
throw new Error('migrate requires both --source and --destination unless --interactive is used.');
|
|
92
|
+
}
|
|
93
|
+
if (!options.interactive && options.archive && !options.format)
|
|
90
94
|
throw new Error('--archive requires --format markdown|html and a directory destination.');
|
|
91
|
-
if (options.format && /^https?:\/\//i.test(destination))
|
|
95
|
+
if (!options.interactive && options.format && destination && /^https?:\/\//i.test(destination))
|
|
92
96
|
throw new Error('--format cannot be used with a remote HTTP(S) destination.');
|
|
93
97
|
onCommand({
|
|
94
98
|
command: 'migrate',
|
|
95
|
-
source,
|
|
96
|
-
destination,
|
|
97
99
|
scope: options.scope,
|
|
98
100
|
sourceStatus: options.sourceStatus,
|
|
99
101
|
comments: options.comments,
|
|
@@ -101,6 +103,9 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
101
103
|
dryRun: options.dryRun,
|
|
102
104
|
fresh: options.fresh,
|
|
103
105
|
openReport: options.openReport,
|
|
106
|
+
interactive: options.interactive,
|
|
107
|
+
...(source ? { source } : {}),
|
|
108
|
+
...(destination ? { destination } : {}),
|
|
104
109
|
...(sourceProfile ? { sourceProfile } : {}),
|
|
105
110
|
...(destinationProfile ? { destinationProfile } : {}),
|
|
106
111
|
...(options.format ? { format: options.format } : {}),
|
|
@@ -112,7 +117,7 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
112
117
|
const reports = program.command('reports').description('List and open local migration reports');
|
|
113
118
|
reports.command('list')
|
|
114
119
|
.description('List valid reports from newest to oldest')
|
|
115
|
-
.option('--workdir <path>', 'workspace containing reports')
|
|
120
|
+
.option('-w, --workdir <path>', 'workspace containing reports')
|
|
116
121
|
.action((options) => {
|
|
117
122
|
const workdir = nonEmpty(options.workdir, '--workdir');
|
|
118
123
|
onCommand({ command: 'reports-list', ...(workdir ? { workdir } : {}) });
|
|
@@ -120,7 +125,7 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
120
125
|
reports.command('open')
|
|
121
126
|
.description('Open a report by run ID, or the latest report with "last" or no selector')
|
|
122
127
|
.argument('[run-id|last]', 'report run ID from "ywtc reports list", or "last"')
|
|
123
|
-
.option('--workdir <path>', 'workspace containing reports')
|
|
128
|
+
.option('-w, --workdir <path>', 'workspace containing reports')
|
|
124
129
|
.action((runIdValue, options) => {
|
|
125
130
|
const runId = nonEmpty(runIdValue, 'run-id');
|
|
126
131
|
const workdir = nonEmpty(options.workdir, '--workdir');
|
|
@@ -128,8 +133,8 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
128
133
|
});
|
|
129
134
|
program.command('update')
|
|
130
135
|
.description('Check for a newer release and optionally update a safe installation')
|
|
131
|
-
.option('--install', 'install after checking', false)
|
|
132
|
-
.addOption(new Option('--via <channel>', 'force a compatible installation channel').choices(['npm', 'brew']))
|
|
136
|
+
.option('-i, --install', 'install after checking', false)
|
|
137
|
+
.addOption(new Option('-c, --via <channel>', 'force a compatible installation channel').choices(['npm', 'brew']))
|
|
133
138
|
.action((options) => onCommand({
|
|
134
139
|
command: 'update',
|
|
135
140
|
install: options.install,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../src/cli-arguments.ts"],"names":[],"mappings":"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"}
|