@iwonz/ywtc 2.0.3 → 3.1.0
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 +40 -0
- package/README.md +162 -166
- package/dist/cli-arguments.d.ts +1 -0
- package/dist/cli-arguments.js +10 -8
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli.js +21 -9
- package/dist/cli.js.map +1 -1
- package/dist/clients/confluence-cloud.d.ts +1 -0
- package/dist/clients/confluence-cloud.js +6 -0
- package/dist/clients/confluence-cloud.js.map +1 -1
- package/dist/clients/confluence.d.ts +1 -0
- package/dist/clients/confluence.js +9 -0
- package/dist/clients/confluence.js.map +1 -1
- package/dist/clients/yandex-wiki.d.ts +2 -1
- package/dist/clients/yandex-wiki.js +12 -0
- package/dist/clients/yandex-wiki.js.map +1 -1
- package/dist/config.d.ts +3 -6
- package/dist/config.js +45 -51
- package/dist/config.js.map +1 -1
- package/dist/connection-verifier.d.ts +17 -0
- package/dist/connection-verifier.js +94 -0
- package/dist/connection-verifier.js.map +1 -0
- package/dist/filesystem-export.d.ts +0 -1
- package/dist/filesystem-export.js +26 -3
- package/dist/filesystem-export.js.map +1 -1
- package/dist/http.d.ts +2 -1
- package/dist/http.js +4 -2
- package/dist/http.js.map +1 -1
- package/dist/init-prompts.d.ts +49 -0
- package/dist/init-prompts.js +63 -0
- package/dist/init-prompts.js.map +1 -0
- package/dist/interactive-config.d.ts +37 -0
- package/dist/interactive-config.js +226 -0
- package/dist/interactive-config.js.map +1 -0
- package/dist/interactive-init.d.ts +20 -0
- package/dist/interactive-init.js +446 -0
- package/dist/interactive-init.js.map +1 -0
- package/dist/report.d.ts +1 -2
- package/dist/report.js +0 -1
- package/dist/report.js.map +1 -1
- package/dist/state.d.ts +0 -1
- package/dist/state.js +79 -13
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/workspace.d.ts +12 -7
- package/dist/workspace.js +31 -53
- package/dist/workspace.js.map +1 -1
- package/docs/assets/readme-header.png +0 -0
- package/package.json +2 -3
- package/ywtc.config.example.yaml +4 -6
- package/.env.example +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes to `ywtc` are documented in this file. Versions follow [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [3.1.0](https://github.com/iwonz/ywtc/compare/v3.0.0...v3.1.0) (2026-10-15)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* **init:** add interactive setup wizard ([d4699b4](https://github.com/iwonz/ywtc/commit/d4699b4106808239a0cd773dc1c2c42aef5b2dab))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Continuous Integration
|
|
14
|
+
|
|
15
|
+
* **release:** retrigger publication workflow ([23e4094](https://github.com/iwonz/ywtc/commit/23e4094adde2189a7c28bf330275b1a0b9ccaca3))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Maintenance
|
|
19
|
+
|
|
20
|
+
* **homebrew:** update formula to v3.0.0 ([875ec34](https://github.com/iwonz/ywtc/commit/875ec34402154e5af52d9c2282a6419ab6a33346))
|
|
21
|
+
|
|
22
|
+
## [3.0.0](https://github.com/iwonz/ywtc/compare/v2.0.3...v3.0.0) (2026-10-15)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### ⚠ BREAKING CHANGES
|
|
26
|
+
|
|
27
|
+
* **workspace:** consolidate runtime configuration
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
|
|
31
|
+
* **workspace:** consolidate runtime configuration ([123f13b](https://github.com/iwonz/ywtc/commit/123f13ba2883de034b9b8f458fd01ad02576be70))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Documentation
|
|
35
|
+
|
|
36
|
+
* **readme:** depict universal transfer paths ([1c7d01f](https://github.com/iwonz/ywtc/commit/1c7d01f907205bed8a44a8dc7819717a84130316))
|
|
37
|
+
* **readme:** stabilize information architecture ([03eb3e3](https://github.com/iwonz/ywtc/commit/03eb3e3ee8aefb76a00237aec7e2561184b214f5))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Maintenance
|
|
41
|
+
|
|
42
|
+
* **ci:** resume release after commit validation ([1540b51](https://github.com/iwonz/ywtc/commit/1540b51727e6ca58816a1099b2add73a3eacf7cf))
|
|
43
|
+
* **homebrew:** update formula to v2.0.3 ([63262bb](https://github.com/iwonz/ywtc/commit/63262bb13e5765aa2f3a15f04e6f98a0379f247e))
|
|
44
|
+
|
|
5
45
|
## [2.0.3](https://github.com/iwonz/ywtc/compare/v2.0.2...v2.0.3) (2026-10-15)
|
|
6
46
|
|
|
7
47
|
|
package/README.md
CHANGED
|
@@ -1,34 +1,27 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="docs/assets/readme-header.png" alt="Yandex Wiki and Confluence
|
|
2
|
+
<img src="docs/assets/readme-header.png" alt="Yandex Wiki and Confluence sources moving through ywtc to Confluence, Yandex Wiki, Markdown, and HTML destinations" width="100%">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# ywtc
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Описание
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
`ywtc` — CLI для переноса страниц между Yandex Wiki и Confluence и экспорта в Markdown или автономный HTML. Утилита сохраняет структуру, ссылки и вложения, явно отмечает деградации и продолжает прерванные операции по state-файлу. Исходные данные и страницы назначения автоматически не удаляются.
|
|
10
|
+
|
|
11
|
+
Требуются Node.js `>=24` и npm `>=11.5.1`. Лицензия — [MIT](LICENSE).
|
|
10
12
|
|
|
11
13
|
## Возможности
|
|
12
14
|
|
|
13
15
|
| Что переносится | Результат |
|
|
14
16
|
| --- | --- |
|
|
15
17
|
| Страницы и иерархия | Одна страница, структурное поддерево или граф связанных страниц |
|
|
16
|
-
| Заголовки, текст, списки, цитаты,
|
|
18
|
+
| Заголовки, текст, списки, цитаты, код и таблицы | Нативная разметка назначения, насколько это допускает формат |
|
|
17
19
|
| Внутренние ссылки и якоря | Переписываются на перенесённые страницы; внешние остаются внешними |
|
|
18
20
|
| Изображения и вложения | Потоковая передача с проверкой имени, размера и SHA-256 |
|
|
19
21
|
| Yandex notes, cuts, tabs и Grid | Ближайший нативный эквивалент; Grid становится статической таблицей |
|
|
20
|
-
| Confluence macros и resource identifiers | Сохраняются напрямую
|
|
21
|
-
| Неподдерживаемые vendor-конструкции | Читаемый fallback и raw snapshot
|
|
22
|
-
| История, комментарии, пользователи,
|
|
23
|
-
|
|
24
|
-
## Минимальный сценарий
|
|
25
|
-
|
|
26
|
-
- [ ] Установите CLI: `npm install -g @iwonz/ywtc`.
|
|
27
|
-
- [ ] Создайте workspace: `ywtc init`.
|
|
28
|
-
- [ ] Заполните `~/.ywtc/ywtc.config.yaml` и секреты в `~/.ywtc/.env`.
|
|
29
|
-
- [ ] Проверьте доступ: `ywtc doctor --source <source> --destination <destination>`.
|
|
30
|
-
- [ ] Выполните dry-run: `ywtc migrate --source <source> --destination <destination> --dry-run`.
|
|
31
|
-
- [ ] Повторите команду без `--dry-run`.
|
|
22
|
+
| Confluence macros и resource identifiers | Сохраняются напрямую при переносе между Confluence либо преобразуются |
|
|
23
|
+
| Неподдерживаемые vendor-конструкции | Читаемый fallback и raw snapshot в attachment или `_source/` |
|
|
24
|
+
| История, комментарии, пользователи, права и watchers | Не переносятся |
|
|
32
25
|
|
|
33
26
|
## Установка
|
|
34
27
|
|
|
@@ -36,7 +29,7 @@
|
|
|
36
29
|
# npm
|
|
37
30
|
npm install -g @iwonz/ywtc
|
|
38
31
|
|
|
39
|
-
# без глобальной установки
|
|
32
|
+
# npx без глобальной установки
|
|
40
33
|
npx @iwonz/ywtc@latest --version
|
|
41
34
|
|
|
42
35
|
# Homebrew
|
|
@@ -45,196 +38,220 @@ brew trust --tap iwonz/ywtc
|
|
|
45
38
|
brew install ywtc
|
|
46
39
|
```
|
|
47
40
|
|
|
48
|
-
Homebrew 7 требует
|
|
41
|
+
Homebrew 7 требует доверить сторонний tap; команда `brew trust` относится только к `iwonz/ywtc`.
|
|
49
42
|
|
|
50
|
-
|
|
43
|
+
Обновление:
|
|
51
44
|
|
|
52
45
|
```bash
|
|
53
|
-
ywtc update
|
|
54
|
-
ywtc update --install #
|
|
55
|
-
ywtc update --install --via brew
|
|
46
|
+
ywtc update # только проверка
|
|
47
|
+
ywtc update --install # канал текущей установки
|
|
48
|
+
ywtc update --install --via brew # явно через Homebrew
|
|
56
49
|
```
|
|
57
50
|
|
|
58
|
-
##
|
|
51
|
+
## Минимальный сценарий
|
|
52
|
+
|
|
53
|
+
- [ ] Установите CLI одним из способов выше.
|
|
54
|
+
- [ ] Запустите `ywtc init --interactive` и настройте обязательные подключения Yandex Wiki и Confluence.
|
|
55
|
+
- [ ] Дождитесь read-only проверки API и авторизации: конфиг сохраняется только после её успеха.
|
|
56
|
+
- [ ] Выполните предложенную wizard команду первой миграции с `--dry-run`, заменив placeholders страниц.
|
|
57
|
+
- [ ] Проверьте план и повторите команду без `--dry-run`.
|
|
58
|
+
|
|
59
|
+
## Конфигурация
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
Для рабочих команд каталог выбирается в порядке: `--workdir` → текущий каталог, если непосредственно в нём есть `ywtc.config.yaml` → `~/.ywtc`. Поиск по родительским каталогам не выполняется. `ywtc init --interactive` предлагает путь с default `~/.ywtc`; переданный `--workdir` становится редактируемым начальным значением. `migrate` автоматически инициализирует отсутствующий workspace.
|
|
61
62
|
|
|
62
63
|
```text
|
|
63
64
|
~/.ywtc/
|
|
64
|
-
├──
|
|
65
|
-
|
|
66
|
-
├── ywtc.config.yaml # подключения без секретов
|
|
67
|
-
└── .states/ # state, cache и HTML-отчёты
|
|
65
|
+
├── ywtc.config.yaml # подключения, настройки и токены; mode 0600 при создании
|
|
66
|
+
└── .states/ # state, cache и отчёты
|
|
68
67
|
```
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
```yaml
|
|
73
|
-
schemaVersion: 2
|
|
74
|
-
defaults:
|
|
75
|
-
timeoutMs: 30000
|
|
76
|
-
concurrency: 4
|
|
77
|
-
|
|
78
|
-
connections:
|
|
79
|
-
wiki-prod:
|
|
80
|
-
type: yandex-wiki
|
|
81
|
-
apiUrl: https://api.wiki.yandex.net/v1
|
|
82
|
-
webUrl: https://wiki.example.ru
|
|
83
|
-
authType: oauth
|
|
84
|
-
tokenEnv: YANDEX_WIKI_TOKEN
|
|
85
|
-
organization: {type: yandex360, id: organization-id}
|
|
86
|
-
|
|
87
|
-
confluence-prod:
|
|
88
|
-
type: confluence
|
|
89
|
-
deployment: data-center
|
|
90
|
-
baseUrl: https://confluence.example.ru/confluence
|
|
91
|
-
authType: pat
|
|
92
|
-
tokenEnv: CONFLUENCE_TOKEN
|
|
93
|
-
```
|
|
69
|
+
`ywtc init --interactive` требует TTY, проводит через обязательные настройки обоих провайдеров, скрывает токены и делает только read-only connection probes. Проверка подтверждает API и авторизацию, но не права конкретных страниц: они проверяются `doctor` или `migrate`. Для существующего workspace доступны изменение выбранных профилей, выход без изменений и настройка с нуля с backup прежнего YAML в `.states/backups/`; state не удаляется.
|
|
94
70
|
|
|
95
|
-
|
|
96
|
-
YANDEX_WIKI_TOKEN=
|
|
97
|
-
CONFLUENCE_TOKEN=
|
|
98
|
-
# Для Confluence Cloud:
|
|
99
|
-
CONFLUENCE_EMAIL=
|
|
100
|
-
```
|
|
71
|
+
Обычный `ywtc init` без wizard создаёт безопасный пустой шаблон для автоматизации или ручного управления. Полный пример с Yandex Wiki, Confluence Data Center, Confluence Cloud и сетевыми лимитами: [`ywtc.config.example.yaml`](ywtc.config.example.yaml).
|
|
101
72
|
|
|
102
|
-
|
|
73
|
+
### Поля профилей
|
|
74
|
+
|
|
75
|
+
| Поле | Для кого | Обязательность / значения | Назначение |
|
|
76
|
+
| --- | --- | --- | --- |
|
|
77
|
+
| `defaults.timeoutMs` | файл | `1000..300000`, default `30000` | Таймаут HTTP-запроса |
|
|
78
|
+
| `defaults.concurrency` | файл | `1..64`, default `4` | Общая параллельность операции |
|
|
79
|
+
| `connections.<name>` | файл | минимум один; имя `[a-z0-9._-]+` | Именованное подключение |
|
|
80
|
+
| `type` | все профили | `yandex-wiki` или `confluence` | Тип провайдера |
|
|
81
|
+
| `token` | все профили | непустой для используемого профиля | OAuth, IAM, PAT или API token |
|
|
82
|
+
| `apiUrl` | Yandex Wiki | URL Public API v1 | API endpoint |
|
|
83
|
+
| `webUrl` | Yandex Wiki | URL | Базовый адрес Wiki для ссылок и выбора профиля |
|
|
84
|
+
| `authType` | Yandex Wiki | `oauth` (default) или `iam` | Схема авторизации |
|
|
85
|
+
| `organization.type` | Yandex Wiki | `yandex360` (default) или `cloud` | Заголовок `X-Org-Id` или `X-Cloud-Org-Id` |
|
|
86
|
+
| `organization.id` | Yandex Wiki | непустая строка | ID организации |
|
|
87
|
+
| `deployment` | Confluence | `data-center` или `cloud` | Тип развёртывания |
|
|
88
|
+
| `baseUrl` | Confluence | URL | Адрес инстанса, включая context path |
|
|
89
|
+
| `authType` | Confluence | `pat` для Data Center; `api-token` для Cloud | Схема авторизации |
|
|
90
|
+
| `email` | Confluence Cloud | непустой для используемого профиля | Email Atlassian-аккаунта |
|
|
91
|
+
| `limits.readConcurrency` | все профили | `1..64`, default `4` | Параллельные чтения |
|
|
92
|
+
| `limits.writeConcurrency` | все профили | `1..32`, default `2` | Параллельные записи |
|
|
93
|
+
| `limits.downloadConcurrency` | все профили | `1..32`, default `2` | Параллельные скачивания |
|
|
94
|
+
| `limits.uploadConcurrency` | все профили | `1..32`, default `2` | Параллельные загрузки |
|
|
95
|
+
| `limits.requestsPerSecond` | все профили | `1..1000`, default `8` | Средняя частота запросов |
|
|
96
|
+
| `limits.burst` | все профили | `1..1000`, default `8` | Допустимый кратковременный burst |
|
|
97
|
+
|
|
98
|
+
Конфигурация строгая: неизвестные поля считаются ошибкой. Все значения, включая токены, email, таймауты и лимиты, читаются только из `ywtc.config.yaml`; process environment их не переопределяет. Файл рабочего каталога игнорируется Git, а токены маскируются в диагностике и отчётах.
|
|
99
|
+
|
|
100
|
+
## Направления и совместимость
|
|
101
|
+
|
|
102
|
+
| Source | Destination | Поддержка |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| Yandex Wiki | Confluence | Да |
|
|
105
|
+
| Yandex Wiki | Yandex Wiki | Да, включая другой профиль или инстанс |
|
|
106
|
+
| Confluence | Yandex Wiki | Да |
|
|
107
|
+
| Confluence | Confluence | Да, включая другой профиль или инстанс |
|
|
108
|
+
| Yandex Wiki или Confluence | Markdown | Да |
|
|
109
|
+
| Yandex Wiki или Confluence | статический HTML | Да |
|
|
110
|
+
|
|
111
|
+
| Система | Контракт | Авторизация |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| Yandex Wiki | Public API v1; новые необязательные поля принимаются | OAuth или пользовательский IAM; `X-Org-Id`/`X-Cloud-Org-Id` |
|
|
114
|
+
| Confluence Data Center | 7.9+ без верхней границы; capabilities проверяются до записи | Bearer PAT |
|
|
115
|
+
| Confluence Cloud | REST v2 для страниц и REST v1 для attachments | Email + API token |
|
|
116
|
+
|
|
117
|
+
Confluence Server, Data Center Basic Auth и OAuth app-flow не поддерживаются. Совместимость определяется preflight-проверкой необходимых API/capabilities, а не сертификацией каждой patch-версии.
|
|
103
118
|
|
|
104
119
|
## Как получить токены
|
|
105
120
|
|
|
106
121
|
### Yandex Wiki
|
|
107
122
|
|
|
108
|
-
- [ ] Создайте приложение в [Яндекс OAuth](https://oauth.yandex.ru/)
|
|
109
|
-
- [ ] Выдайте
|
|
110
|
-
- [ ] Получите OAuth-токен
|
|
123
|
+
- [ ] Создайте приложение в [Яндекс OAuth](https://oauth.yandex.ru/).
|
|
124
|
+
- [ ] Выдайте права Wiki на чтение; для destination также нужны права записи.
|
|
125
|
+
- [ ] Получите OAuth-токен пользователя с доступом к страницам. Для федеративного пользователя Yandex Cloud допустим IAM-токен и `authType: iam`.
|
|
111
126
|
- [ ] Найдите ID организации в **Yandex Tracker → Администрирование → Организации**.
|
|
112
|
-
- [ ] Укажите `organization.type: yandex360` для Яндекс 360
|
|
113
|
-
- [ ]
|
|
127
|
+
- [ ] Укажите `organization.type: yandex360` для Яндекс 360 или `cloud` для Cloud Organization.
|
|
128
|
+
- [ ] Запишите токен в `connections.<name>.token` выбранного профиля.
|
|
114
129
|
|
|
115
130
|
### Confluence Data Center
|
|
116
131
|
|
|
117
132
|
- [ ] Откройте **Avatar → Settings → Personal access tokens → Create token**.
|
|
118
|
-
- [ ] Создайте PAT и
|
|
133
|
+
- [ ] Создайте PAT и запишите его в `connections.<name>.token`.
|
|
119
134
|
- [ ] Используйте `deployment: data-center` и `authType: pat`.
|
|
120
|
-
- [ ]
|
|
135
|
+
- [ ] Проверьте права на чтение source и создание/изменение страниц и вложений destination.
|
|
121
136
|
|
|
122
137
|
### Confluence Cloud
|
|
123
138
|
|
|
124
139
|
- [ ] Создайте [Atlassian API token](https://id.atlassian.com/manage-profile/security/api-tokens).
|
|
125
|
-
- [ ] Используйте `deployment: cloud`, `authType: api-token`, `
|
|
126
|
-
- [ ]
|
|
127
|
-
- [ ] Проверьте доступ аккаунта к source
|
|
128
|
-
|
|
129
|
-
## Направления и совместимость
|
|
130
|
-
|
|
131
|
-
| Source | Destination | Поддержка |
|
|
132
|
-
| --- | --- | --- |
|
|
133
|
-
| Yandex Wiki | Confluence | Да |
|
|
134
|
-
| Yandex Wiki | Yandex Wiki | Да, включая другой профиль/инстанс |
|
|
135
|
-
| Confluence | Yandex Wiki | Да |
|
|
136
|
-
| Confluence | Confluence | Да, включая другой профиль/инстанс |
|
|
137
|
-
| Yandex Wiki или Confluence | Markdown | Да |
|
|
138
|
-
| Yandex Wiki или Confluence | статический HTML | Да |
|
|
140
|
+
- [ ] Используйте `deployment: cloud`, `authType: api-token`, `token` и `email`.
|
|
141
|
+
- [ ] Запишите API token и email аккаунта непосредственно в выбранный профиль.
|
|
142
|
+
- [ ] Проверьте доступ аккаунта к source и destination spaces.
|
|
139
143
|
|
|
140
|
-
|
|
141
|
-
| --- | --- | --- |
|
|
142
|
-
| Yandex Wiki | Public API v1; tolerant parsing новых необязательных полей | OAuth или пользовательский IAM; `X-Org-Id`/`X-Cloud-Org-Id` |
|
|
143
|
-
| Confluence Data Center | 7.9+ без искусственной верхней границы; capabilities проверяются до записи | Bearer PAT |
|
|
144
|
-
| Confluence Cloud | Текущий публичный REST v2 для страниц и v1 для attachments | Email + API token |
|
|
144
|
+
## Параметры
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
### Команды
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
| Команда | Назначение |
|
|
149
|
+
| --- | --- |
|
|
150
|
+
| `ywtc init [--workdir <path>] [--interactive]` | Создать шаблон либо настроить и проверить подключения в TTY wizard |
|
|
151
|
+
| `ywtc doctor [options]` | Проверить workspace; с source и destination выполнить read-only preflight |
|
|
152
|
+
| `ywtc migrate --source <locator> --destination <locator\|directory> [options]` | Перенести или экспортировать выбранный граф страниц |
|
|
153
|
+
| `ywtc update [--install] [--via npm\|brew]` | Проверить или установить обновление безопасным для текущего канала способом |
|
|
154
|
+
| `ywtc --help`, `ywtc <command> --help` | Показать общую или командную справку |
|
|
155
|
+
| `ywtc --version` | Показать версию |
|
|
149
156
|
|
|
150
|
-
|
|
151
|
-
ywtc migrate --source <locator> --destination <locator|directory> [options]
|
|
152
|
-
```
|
|
157
|
+
### Опции
|
|
153
158
|
|
|
154
|
-
|
|
|
159
|
+
| Опция | Команды | Обязательность / значения | Назначение |
|
|
155
160
|
| --- | --- | --- | --- |
|
|
156
|
-
| `--source <value>` |
|
|
157
|
-
| `--destination <value>` |
|
|
158
|
-
| `--source-profile <name>` |
|
|
159
|
-
| `--destination-profile <name>` |
|
|
160
|
-
| `--scope <mode>` |
|
|
161
|
-
| `--format <format>` |
|
|
162
|
-
| `--archive` |
|
|
163
|
-
| `--dry-run` |
|
|
164
|
-
| `--
|
|
165
|
-
| `--
|
|
166
|
-
| `--
|
|
167
|
-
| `--
|
|
168
|
-
|
|
169
|
-
|
|
161
|
+
| `--source <value>` | `doctor`, `migrate` | обязательно для `migrate`; в `doctor` вместе с destination | URL, page ID или Yandex slug |
|
|
162
|
+
| `--destination <value>` | `doctor`, `migrate` | обязательно для `migrate`; в `doctor` вместе с source | Родительская страница или каталог экспорта |
|
|
163
|
+
| `--source-profile <name>` | `doctor`, `migrate` | при неоднозначном коротком locator | Профиль source из `connections` |
|
|
164
|
+
| `--destination-profile <name>` | `doctor`, `migrate` | при неоднозначном remote locator | Профиль destination; несовместим с файловым экспортом |
|
|
165
|
+
| `--scope <mode>` | `doctor`, `migrate` | `page`, `subtree` (default), `linked` | Граница выбора страниц |
|
|
166
|
+
| `--format <format>` | `doctor`, `migrate` | `markdown` или `html` | Делает destination файловым каталогом |
|
|
167
|
+
| `--archive` | `migrate` | только вместе с `--format` | Дополнительно создать ZIP рядом с каталогом |
|
|
168
|
+
| `--dry-run` | `migrate` | default `false` | Discovery и план без записи в destination |
|
|
169
|
+
| `--fresh` | `migrate` | default `false` | Игнорировать mappings текущего state |
|
|
170
|
+
| `--concurrency <n>` | `migrate` | `1..64`; иначе config default | Общая параллельность; профильные лимиты сохраняются |
|
|
171
|
+
| `--state <path>` | `migrate` | внутри workspace | Явный state вместо автоматического |
|
|
172
|
+
| `--workdir <path>` | `init`, `doctor`, `migrate` | config в CWD или `~/.ywtc` | Явно выбрать workspace; поддерживается `~/...` |
|
|
173
|
+
| `--interactive` | `init` | требует stdin/stdout TTY | Обязательный wizard Yandex Wiki + Confluence; без частично сохранённого конфига |
|
|
174
|
+
| `--install` | `update` | default `false` | Установить найденное обновление |
|
|
175
|
+
| `--via <channel>` | `update` | `npm` или `brew` | Явно выбрать совместимый канал обновления |
|
|
176
|
+
| `-h`, `--help` | CLI и команды | необязательно | Справка |
|
|
177
|
+
| `-v`, `--version` | CLI | необязательно | Версия |
|
|
178
|
+
|
|
179
|
+
### Локаторы
|
|
180
|
+
|
|
181
|
+
- Yandex Wiki: полный URL, числовой page ID или slug, например `team/start`.
|
|
182
|
+
- Confluence: числовой page ID, URL с `pageId=<id>` либо URL с `/pages/<id>` или `/content/<id>`.
|
|
183
|
+
- Полный URL автоматически выбирает профиль по нормализованному base URL.
|
|
184
|
+
- Короткий ID/slug выбирается автоматически только при единственном подходящем профиле; иначе нужен `--source-profile` или `--destination-profile`.
|
|
185
|
+
- Каталог является файловой destination только вместе с `--format`.
|
|
170
186
|
|
|
171
187
|
### Scope
|
|
172
188
|
|
|
173
189
|
- `page` — только исходная страница.
|
|
174
|
-
- `subtree` — страница и все структурные потомки;
|
|
175
|
-
- `linked` — детерминированный BFS по внутренним ссылкам и page/include references до фиксированной точки. Циклы
|
|
190
|
+
- `subtree` — страница и все структурные потомки; default.
|
|
191
|
+
- `linked` — детерминированный BFS по внутренним ссылкам и page/include references до фиксированной точки. Циклы завершаются безопасно, каждая страница обрабатывается один раз; внешние и недоступные ссылки не обходятся и попадают в отчёт.
|
|
176
192
|
|
|
177
193
|
## Частые примеры
|
|
178
194
|
|
|
179
195
|
```bash
|
|
180
|
-
#
|
|
181
|
-
ywtc
|
|
182
|
-
|
|
183
|
-
|
|
196
|
+
# Wizard в отдельном workspace
|
|
197
|
+
ywtc init --interactive --workdir ./migration
|
|
198
|
+
|
|
199
|
+
# Неинтерактивная инициализация для ручного или автоматизированного заполнения YAML
|
|
200
|
+
ywtc init --workdir ./migration
|
|
201
|
+
|
|
202
|
+
# Yandex Wiki → Confluence: граф связанных страниц
|
|
203
|
+
ywtc migrate --source https://wiki.example.com/team/start \
|
|
204
|
+
--destination https://confluence.example.com/confluence/pages/viewpage.action?pageId=123 \
|
|
184
205
|
--scope linked
|
|
185
206
|
|
|
186
|
-
# Confluence → Yandex Wiki
|
|
187
|
-
ywtc migrate \
|
|
188
|
-
--
|
|
189
|
-
--destination-profile wiki-prod --destination team/archive \
|
|
190
|
-
--scope subtree
|
|
207
|
+
# Confluence → Yandex Wiki
|
|
208
|
+
ywtc migrate --source-profile confluence-prod --source 123456 \
|
|
209
|
+
--destination-profile wiki-prod --destination team/archive
|
|
191
210
|
|
|
192
|
-
#
|
|
211
|
+
# Yandex Wiki → Yandex Wiki: одна страница
|
|
193
212
|
ywtc migrate --source-profile wiki-prod --source team/start \
|
|
194
|
-
--destination-profile
|
|
213
|
+
--destination-profile wiki-archive --destination archive/start --scope page
|
|
214
|
+
|
|
215
|
+
# Confluence → Confluence: новый state в отдельном workspace
|
|
216
|
+
ywtc migrate --workdir ./migration --source-profile confluence-prod --source 123456 \
|
|
217
|
+
--destination-profile confluence-archive --destination 654321 --fresh
|
|
195
218
|
|
|
196
|
-
# Автономный HTML
|
|
219
|
+
# Автономный HTML и ZIP
|
|
197
220
|
ywtc migrate --source-profile confluence-prod --source 123456 \
|
|
198
221
|
--destination ./exports/knowledge-base --format html --scope linked --archive
|
|
199
222
|
|
|
200
|
-
# Markdown
|
|
201
|
-
ywtc migrate --
|
|
202
|
-
--destination ./
|
|
223
|
+
# Markdown dry-run
|
|
224
|
+
ywtc migrate --source-profile wiki-prod --source team/start \
|
|
225
|
+
--destination ./exports/knowledge-base --format markdown --dry-run
|
|
203
226
|
```
|
|
204
227
|
|
|
205
|
-
`doctor` принимает те же
|
|
228
|
+
Wizard проверяет только доступность API и авторизацию без страниц и внешних записей. `doctor` принимает те же endpoints, profiles, `scope` и `format`: без endpoints он проверяет workspace, конфигурацию и секреты, а с обоими endpoints выполняет page-specific read-only capability-preflight.
|
|
206
229
|
|
|
207
230
|
## Файловый экспорт
|
|
208
231
|
|
|
209
|
-
Markdown создаёт `index.md`, `pages/`, `attachments/`,
|
|
232
|
+
Markdown создаёт `index.md`, `pages/`, `attachments/`, `.ywtc-export.json` и, при деградациях, `_source/`. HTML создаёт автономный адаптивный сайт с локальным `assets/site.css`; он работает через `file://` и на static hosting без CDN или внешнего runtime.
|
|
210
233
|
|
|
211
|
-
Экспорт строится в staging-каталоге. Существующий каталог заменяется только при
|
|
234
|
+
Экспорт сначала строится в staging-каталоге. Существующий каталог заменяется только при строгом актуальном manifest с `tool: ywtc` и той же canonical identity, а прежний каталог сохраняется как timestamped backup. `--archive` оставляет каталог и создаёт новый ZIP, не перезаписывая существующий архив.
|
|
212
235
|
|
|
213
|
-
## State
|
|
236
|
+
## State
|
|
214
237
|
|
|
215
|
-
|
|
238
|
+
По умолчанию state хранится в `<workdir>/.states/<automatic-id>.json`. ID строится из канонических профилей и ID source/destination, а для файлового экспорта также из формата; форма locator и `scope` на ID не влияют. State имеет единственный строгий актуальный формат без поля версии. Несоответствующий файл не преобразуется и не изменяется. Относительный `--state` разрешается внутри workspace, выход за его границы запрещён.
|
|
216
239
|
|
|
217
|
-
|
|
218
|
-
- Страница, изменённая вручную после прошлого запуска, получает `conflict` и не перезаписывается.
|
|
219
|
-
- `--fresh` начинает с чистых mappings; live-run сохраняет прежний state как backup и может создать новые страницы.
|
|
220
|
-
- State schema v1 не мигрируется автоматически и остаётся нетронутой.
|
|
221
|
-
- SIGINT/SIGTERM останавливает постановку новых задач, сохраняет state/report и возвращает `130`/`143`.
|
|
222
|
-
- Каждый запуск создаёт `.states/reports/<run-id>/index.html` и `report.json`: направление, дерево, link graph, циклы, вложения, размеры, деградации, ошибки и side-by-side preview.
|
|
240
|
+
### Повторные запуски
|
|
223
241
|
|
|
224
|
-
|
|
242
|
+
- Одинаковые source и destination автоматически подхватывают один state независимо от формы URL/ID/slug.
|
|
243
|
+
- Уже сопоставленные страницы и вложения обновляются без создания дубликатов.
|
|
244
|
+
- Страница, изменённая вручную после прошлого запуска, получает `conflict` и не перезаписывается.
|
|
245
|
+
- `--fresh` игнорирует mappings; перед live-run прежний state сохраняется как backup, а destination может получить новые объекты.
|
|
246
|
+
- Удалённые из source объекты автоматически не удаляются из destination.
|
|
225
247
|
|
|
226
|
-
|
|
248
|
+
При SIGINT/SIGTERM новые задачи не ставятся, активные безопасные операции завершаются, state и отчёт сохраняются. Коды выхода: `0` — completed; `1` — partial или verification failure; `2` — usage/config/preflight; `130`/`143` — остановка сигналом.
|
|
227
249
|
|
|
228
|
-
|
|
250
|
+
## Отчёты
|
|
229
251
|
|
|
230
|
-
|
|
231
|
-
| --- | --- |
|
|
232
|
-
| `--target <value>` | `--destination <value>` |
|
|
233
|
-
| `--single-page` | `--scope page` |
|
|
234
|
-
| Один набор env-подключений | Именованные подключения в `ywtc.config.yaml`; `.env` содержит только секреты |
|
|
235
|
-
| State schema v1 | Новый автоматический provider-neutral state v2 |
|
|
252
|
+
Каждый запуск создаёт `<workdir>/.states/reports/<run-id>/index.html` и `report.json`. Отчёт содержит направление, профили, дерево и link graph, циклы, вложения, размеры, деградации, raw snapshots, ошибки и side-by-side preview страниц; unversioned JSON доступен для автоматической обработки.
|
|
236
253
|
|
|
237
|
-
|
|
254
|
+
Итоговый статус запуска: `completed`, `completed-with-warnings`, `partial`, `failed`, `cancelled` или `interrupted`. Для страниц фиксируются `discovered`, `planned`, `skeleton-created`, `complete`, `partial`, `conflict`, `failed` и `blocked`.
|
|
238
255
|
|
|
239
256
|
## Разработка
|
|
240
257
|
|
|
@@ -246,27 +263,6 @@ npm run workspace:init
|
|
|
246
263
|
npm run check
|
|
247
264
|
```
|
|
248
265
|
|
|
249
|
-
`npm run check` запускает
|
|
250
|
-
|
|
251
|
-
## Релизы (для сопровождающего)
|
|
252
|
-
|
|
253
|
-
Release Please формирует PR из Conventional Commits. После его проверки и merge workflow повторяет полный quality gate, создаёт GitHub Release, публикует npm-пакет с OIDC provenance и обновляет проверенную Homebrew-формулу. Версии `package.json`, lock-файла и changelog вручную не меняются; регулярные релизы не требуют npm OTP или `NPM_TOKEN`.
|
|
254
|
-
|
|
255
|
-
Если GitHub Release уже создан, а публикация остановилась, повторите существующий тег идемпотентным recovery:
|
|
256
|
-
|
|
257
|
-
```bash
|
|
258
|
-
gh workflow run release.yml --repo iwonz/ywtc -f release_tag=vX.Y.Z
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
Recovery проверяет неизменённый tag актуальным trusted validator, не перезаписывает существующую npm-версию и восстанавливает только недостающие artifacts, release notes и Homebrew-формулу.
|
|
262
|
-
|
|
263
|
-
Одноразовая инициализация нового npm-пакета выполняется так:
|
|
264
|
-
|
|
265
|
-
- [ ] Установить npm `>=11.15`, выполнить `npm login` и проверить владельца через `npm whoami`.
|
|
266
|
-
- [ ] Опубликовать placeholder с интерактивной 2FA: `npm run release:bootstrap`; не передавать OTP в файлах, командах или CI.
|
|
267
|
-
- [ ] Выполнить `npm trust github @iwonz/ywtc --file release.yml --repo iwonz/ywtc --allow-publish`.
|
|
268
|
-
- [ ] В **Settings → Actions → General → Workflow permissions** включить **Allow GitHub Actions to create and approve pull requests**; возможности каждого job дополнительно ограничены его `permissions`.
|
|
269
|
-
|
|
270
|
-
Для `@iwonz/ywtc` эта инициализация уже выполнена. Подробности: [npm trusted publishing](https://docs.npmjs.com/trusted-publishers/) и [`npm trust`](https://docs.npmjs.com/cli/v11/commands/npm-trust/).
|
|
266
|
+
`npm run check` запускает проверку репозитория и секретов, production audit уровня high/critical, TypeScript, Biome, Knip, тесты, сборку, проверку npm-пакета и строгую OpenSpec-валидацию. Любое изменение проходит полный OpenSpec-цикл из [`AGENTS.md`](AGENTS.md).
|
|
271
267
|
|
|
272
|
-
|
|
268
|
+
Release Please рассчитывает SemVer из Conventional Commits. После merge release PR GitHub Actions проверяет релиз, публикует GitHub Release и npm-пакет через OIDC provenance, затем обновляет и проверяет Homebrew-формулу. Версии и changelog вручную не изменяются.
|
package/dist/cli-arguments.d.ts
CHANGED
package/dist/cli-arguments.js
CHANGED
|
@@ -22,11 +22,12 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
22
22
|
.showHelpAfterError('(run ywtc --help for usage)')
|
|
23
23
|
.showSuggestionAfterError(true);
|
|
24
24
|
program.command('init')
|
|
25
|
-
.description('Create or
|
|
25
|
+
.description('Create a workspace or configure it with a guided terminal wizard')
|
|
26
26
|
.option('--workdir <path>', 'workspace to initialize')
|
|
27
|
+
.option('--interactive', 'configure Yandex Wiki and Confluence in a TTY wizard', false)
|
|
27
28
|
.action((options) => {
|
|
28
29
|
const workdir = nonEmpty(options.workdir, '--workdir');
|
|
29
|
-
onCommand({ command: 'init', ...(workdir ? { workdir } : {}) });
|
|
30
|
+
onCommand({ command: 'init', interactive: options.interactive, ...(workdir ? { workdir } : {}) });
|
|
30
31
|
});
|
|
31
32
|
program.command('doctor')
|
|
32
33
|
.description('Validate profiles and optionally perform read-only endpoint preflight')
|
|
@@ -64,7 +65,7 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
64
65
|
.addOption(new Option('--scope <scope>', 'selection scope').choices(['page', 'subtree', 'linked']).default('subtree'))
|
|
65
66
|
.addOption(new Option('--format <format>', 'filesystem format').choices(['markdown', 'html']))
|
|
66
67
|
.option('--archive', 'also create a ZIP for filesystem output', false)
|
|
67
|
-
.option('--workdir <path>', 'workspace (
|
|
68
|
+
.option('--workdir <path>', 'workspace (configured CWD, then ~/.ywtc)')
|
|
68
69
|
.option('--dry-run', 'discover and render without destination writes', false)
|
|
69
70
|
.option('--fresh', 'ignore mappings and preserve existing live state as a backup', false)
|
|
70
71
|
.option('--concurrency <n>', 'orchestration concurrency from 1 to 64', concurrency)
|
|
@@ -108,10 +109,6 @@ export function createCliProgram(onCommand = () => undefined) {
|
|
|
108
109
|
return program;
|
|
109
110
|
}
|
|
110
111
|
export function parseCliArguments(argv) {
|
|
111
|
-
if (argv.includes('--target'))
|
|
112
|
-
throw new Error('--target was removed in ywtc 2.0. Use --destination.');
|
|
113
|
-
if (argv.includes('--single-page'))
|
|
114
|
-
throw new Error('--single-page was removed in ywtc 2.0. Use --scope page.');
|
|
115
112
|
if (argv.length === 0 || (argv.length === 1 && ['--help', '-h'].includes(argv[0])))
|
|
116
113
|
return { command: 'help' };
|
|
117
114
|
if (argv.length === 1 && ['--version', '-v'].includes(argv[0]))
|
|
@@ -127,7 +124,12 @@ export function parseCliArguments(argv) {
|
|
|
127
124
|
const output = [];
|
|
128
125
|
const program = createCliProgram((command) => { parsed = command; });
|
|
129
126
|
program.exitOverride();
|
|
130
|
-
|
|
127
|
+
for (const command of program.commands)
|
|
128
|
+
command.exitOverride();
|
|
129
|
+
const writers = { writeOut: (value) => output.push(value), writeErr: (value) => output.push(value) };
|
|
130
|
+
program.configureOutput(writers);
|
|
131
|
+
for (const command of program.commands)
|
|
132
|
+
command.configureOutput(writers);
|
|
131
133
|
try {
|
|
132
134
|
program.parse(['node', 'ywtc', ...argv], { from: 'node' });
|
|
133
135
|
}
|
|
@@ -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;AAiC5C,SAAS,QAAQ,CAAC,KAAyB,EAAE,MAAc;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAClI,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAA2C,GAAG,EAAE,CAAC,SAAS;IACzF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,oDAAoD,CAAC;SACjE,OAAO,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC;SAC1C,kBAAkB,CAAC,6BAA6B,CAAC;SACjD,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SACpB,WAAW,CAAC,
|
|
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;AAiC5C,SAAS,QAAQ,CAAC,KAAyB,EAAE,MAAc;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAClI,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,YAA2C,GAAG,EAAE,CAAC,SAAS;IACzF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,oDAAoD,CAAC;SACjE,OAAO,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC;SAC1C,kBAAkB,CAAC,6BAA6B,CAAC;SACjD,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SACpB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,sDAAsD,EAAE,KAAK,CAAC;SACtF,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACvD,SAAS,CAAC,EAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;SACtB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAClD,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;SAC5D,MAAM,CAAC,yBAAyB,EAAE,8CAA8C,CAAC;SACjF,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;SAC5D,MAAM,CAAC,8BAA8B,EAAE,8BAA8B,CAAC;SACtE,SAAS,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACrH,SAAS,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;SAC7F,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAC1E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACjK,SAAS,CAAC;YACR,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,OAAO,CAAC,KAAsB;YACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,WAAW,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAC,kBAAkB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,MAAsB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;SACvB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,cAAc,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;SACpE,cAAc,CAAC,yBAAyB,EAAE,8CAA8C,CAAC;SACzF,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;SAC5D,MAAM,CAAC,8BAA8B,EAAE,8BAA8B,CAAC;SACtE,SAAS,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACrH,SAAS,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;SAC7F,MAAM,CAAC,WAAW,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;SACtE,MAAM,CAAC,WAAW,EAAE,gDAAgD,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,SAAS,EAAE,8DAA8D,EAAE,KAAK,CAAC;SACxF,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,EAAE,WAAW,CAAC;SAClF,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;SACrD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAE,CAAC;QACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,CAAE,CAAC;QACpE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAC1E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAClI,IAAI,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACvI,SAAS,CAAC;YACR,OAAO,EAAE,SAAS;YAClB,MAAM;YACN,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,KAAsB;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAC,kBAAkB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,MAAsB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAC,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;SACtB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,WAAW,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACpD,SAAS,CAAC,IAAI,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;SAC5G,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC;QAC7B,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,GAAG,EAAE,OAAO,CAAC,GAAqB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC,CAAC,CAAC;IACN,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;QAAE,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC;IAC9G,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAAE,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YAClE,CAAC,CAAC,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAiD,EAAC;YAC7E,CAAC,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC;IACxB,CAAC;IACD,IAAI,MAA8B,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,YAAY,EAAE,CAAC;IACvB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,YAAY,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,EAAC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,CAAC;IACnH,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAgD;IACtE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,eAAe,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;IACjF,OAAO,OAAO,EAAE,eAAe,EAAE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;AACjE,CAAC"}
|