@naparnik/mcp 0.1.0 → 0.10.9
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 +1344 -0
- package/LICENSE.md +8 -1
- package/README.md +279 -23
- package/THIRD-PARTY.md +59 -0
- package/dist/chunk-JBXYRTS4.js +21450 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.js +449 -15
- package/dist/index.d.ts +1490 -16
- package/dist/index.js +1 -1
- package/package.json +15 -11
- package/dist/chunk-T6UWKM37.js +0 -4989
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,1344 @@
|
|
|
1
|
+
# Изменения @naparnik/mcp
|
|
2
|
+
|
|
3
|
+
## 0.10.9 — 2026-09-20. Движок доезжает до рабочего сам
|
|
4
|
+
|
|
5
|
+
Скачанная начинка доводится до рабочего состояния тем же путём, которым её
|
|
6
|
+
доводит `setup`: ставится Python, собирается окружение, проходит проверка, и
|
|
7
|
+
только потом версия становится текущей. До этого автоустановка оставляла
|
|
8
|
+
скачанное кандидатом, и после перезапуска человек слышал «движок не установлен».
|
|
9
|
+
|
|
10
|
+
## 0.10.8 — 2026-09-20. Одна установка вместо двух, и ключ больше не пропадает
|
|
11
|
+
|
|
12
|
+
Движок монтажа качается той же командой, что ставит расширение: у Codex — прямо
|
|
13
|
+
в терминале, у Claude Desktop — фоном на первом запуске. Раньше человек ставил
|
|
14
|
+
расширение, перезапускал программу и только потом узнавал, что теперь качается
|
|
15
|
+
движок; перезапуск нужен один, и после него всё готово к работе.
|
|
16
|
+
|
|
17
|
+
Повторная установка больше не стирает ключ. Если новый ключ не задан, берётся
|
|
18
|
+
тот, что уже стоит в настройках: обновление на свежую версию перестало
|
|
19
|
+
превращаться в «ключ не задан» у того, у кого ключ никуда не девался.
|
|
20
|
+
|
|
21
|
+
## 0.10.7 — 2026-09-19. Один проект собирает несколько видео, звук и свои эффекты
|
|
22
|
+
|
|
23
|
+
`plan_edit` теперь принимает общий проект `naparnik-project/1`: несколько
|
|
24
|
+
исходников, точные фрагменты, параллельные видеодорожки, отдельный звук,
|
|
25
|
+
геометрию и эффекты из `mine`. `plan` показывает сохранённую редакцию,
|
|
26
|
+
`render` собирает её тем же Runner и теми же заданиями, а `wait` и `preview`
|
|
27
|
+
работают как раньше. Новых MCP-инструментов нет — их по-прежнему восемь.
|
|
28
|
+
|
|
29
|
+
Вместе с движком приехал скилл `composer` и четыре проверяемых примера:
|
|
30
|
+
последовательный монтаж, split-screen, picture-in-picture и пользовательский
|
|
31
|
+
эффект. Согласие связано с точным отпечатком проекта, исходников и кода шага;
|
|
32
|
+
изменение любого из них требует показать редакцию человеку снова.
|
|
33
|
+
|
|
34
|
+
## 0.10.6 — 2026-09-19. Обновление сначала проверяет ваши доработки
|
|
35
|
+
|
|
36
|
+
Новая версия теперь ставится рядом с рабочей и проверяется своим Python до
|
|
37
|
+
переключения. Папка `mine` проходит отдельную проверку совместимости. Если
|
|
38
|
+
проверка не знает ответа или находит поломку, прежняя версия остаётся рабочей,
|
|
39
|
+
а кандидат сохраняется для разбора. Старые версии пока не удаляются: место на
|
|
40
|
+
диске дешевле, чем потерянный откат.
|
|
41
|
+
|
|
42
|
+
Два экземпляра одного пользовательского шага получили разные рабочие папки, а
|
|
43
|
+
правка объявленного helper или библиотеки сбрасывает его кэш. Добавлен чистый
|
|
44
|
+
компилятор общей композиции с точным временем кадров и звука; он пока не
|
|
45
|
+
включён в обычный монтаж, пока Runner не научится исполнять его связи целиком.
|
|
46
|
+
|
|
47
|
+
## 0.10.5 — 2026-09-18. Запись экрана возвращается в кадр столько раз, сколько нужно
|
|
48
|
+
|
|
49
|
+
Раньше Напарник показывал запись экрана один раз за ролик — даже если вы
|
|
50
|
+
просили её дважды. Теперь окон столько, сколько их в плане: показали себя,
|
|
51
|
+
ушли на скринкаст, вернулись лицом на пару секунд, снова на скринкаст.
|
|
52
|
+
|
|
53
|
+
Второй показ идёт ДАЛЬШЕ, а не сначала: запись продолжается с того места, где
|
|
54
|
+
остановилась. Нужно с другого — скажите, с какой она секунды, и он возьмёт
|
|
55
|
+
оттуда. Если записи на все окна не хватает, он скажет об этом до сборки и
|
|
56
|
+
числами, а не отдаст ролик без половины показанного.
|
|
57
|
+
|
|
58
|
+
## 0.10.4 — 2026-09-18. Напарник говорит, что у него есть кроме монтажа
|
|
59
|
+
|
|
60
|
+
Вместе с монтажом на ваш компьютер приехали чужие наработки по визуалу,
|
|
61
|
+
движению и вкусу — и Напарник до сих пор молчал о том, что они у него есть.
|
|
62
|
+
Теперь при первой же проверке он их перечисляет: что это, про что и с чего
|
|
63
|
+
начинать читать.
|
|
64
|
+
|
|
65
|
+
Пользоваться ими можно не только в ролике. Попросите презентацию, картинку
|
|
66
|
+
или страницу — он возьмёт оттуда приёмы и наши замеры так же, как берёт их
|
|
67
|
+
для монтажа. Видео для этого не нужно вовсе.
|
|
68
|
+
|
|
69
|
+
## 0.10.3 — 2026-09-18. В ролике будет то, на что вы сказали «да»
|
|
70
|
+
|
|
71
|
+
Напарник больше ничего не собирает, пока вы не согласились. Он пересказывает
|
|
72
|
+
план построчно — хук, крупности, подписи, счётчики, звук, — и ждёт вашего
|
|
73
|
+
«да». Сказали «поменяй тут» — согласие снимается само, и он пересказывает
|
|
74
|
+
заново. Лишнего в готовом ролике не появится: хука во весь экран, которого вы
|
|
75
|
+
не просили, счётчиков поверх записи экрана, подписей из ниоткуда.
|
|
76
|
+
|
|
77
|
+
Просьба узкая — работа узкая. «Просто ускорь», «убери паузы» — и он ускорит и
|
|
78
|
+
уберёт, а придумывать к этому ролик не станет.
|
|
79
|
+
|
|
80
|
+
А если наш план вообще не про то — скажите своими словами, каким должен быть
|
|
81
|
+
ролик. Напарник напишет план целиком по вашей просьбе и покажет его; монтаж
|
|
82
|
+
сверит написанное со своими мерками и, если что-то выходит за них, объяснит
|
|
83
|
+
словами, что именно и почему. Передумали — «забудь, предложи своё», и он
|
|
84
|
+
вернётся к обычному плану.
|
|
85
|
+
|
|
86
|
+
Ещё теперь можно вычеркнуть целую строку плана: «без субтитров», «без звуковых
|
|
87
|
+
ударов».
|
|
88
|
+
|
|
89
|
+
## 0.10.2 — 2026-09-18. Напарник знает, где написано, как дописать его самого
|
|
90
|
+
|
|
91
|
+
Попросили то, чего монтаж пока не делает, — Напарник больше не отвечает
|
|
92
|
+
«так не умею». Он открывает на вашем компьютере описание того, как устроен шаг
|
|
93
|
+
монтажа, и пишет недостающий шаг сам: наезд, замедление, стоп-кадр, картинку в
|
|
94
|
+
картинке, свою графику, свой звук на слово. Написанное ложится в вашу папку,
|
|
95
|
+
работает вместе с нашим монтажом и переживает обновления.
|
|
96
|
+
|
|
97
|
+
Раньше он посылал сам себя за этим описанием туда, куда войти не может, и
|
|
98
|
+
поэтому отказывал.
|
|
99
|
+
|
|
100
|
+
## 0.10.1 — 2026-09-18. Карточка в начале ролика
|
|
101
|
+
|
|
102
|
+
Теперь можно попросить: «сделай в начале карточку на семь секунд, напиши там,
|
|
103
|
+
о чём видео». Напарник поставит её перед роликом — фирменный фон, заголовок и
|
|
104
|
+
вторая строка помельче, текст на ней появляется, а не стоит с первого кадра.
|
|
105
|
+
Сам ролик при этом остаётся прежним кадр в кадр: карточка добавляется, а не
|
|
106
|
+
заменяет начало.
|
|
107
|
+
|
|
108
|
+
Длительность своя — скажите словами. Убрать карточку тоже словами. Работает и
|
|
109
|
+
там, где вы просили «просто убери паузы»: карточка не про речь.
|
|
110
|
+
|
|
111
|
+
## 0.10.0 — 2026-09-17. Сначала план словами, потом сборка. Шесть инструментов вместо четырнадцати
|
|
112
|
+
|
|
113
|
+
Напарник больше не бросается монтировать по первой просьбе. Сначала он
|
|
114
|
+
собирает план словами: что за чем идёт, какие слова на экране, где вставки,
|
|
115
|
+
что куда въезжает. План читается как текст, и его правят разговором — «это
|
|
116
|
+
слово не то», «здесь крупнее», «пусть заезжает слева». Сборка запускается
|
|
117
|
+
после вашего «да», а не до него.
|
|
118
|
+
|
|
119
|
+
Рядом с движком теперь лежат скиллы дизайна и анимации — те самые, по которым
|
|
120
|
+
работают люди. Напарник читает их сам и пишет план уже по ним, поэтому кадр
|
|
121
|
+
получается собранным, а не случайным. Скиллы стоят целиком, со своими
|
|
122
|
+
лицензиями; чужой код мы не запускаем.
|
|
123
|
+
|
|
124
|
+
Инструментов стало шесть вместо четырнадцати: проверка и установка, план,
|
|
125
|
+
правка плана, сборка, просмотр и форма выбора. Меньше названий — меньше
|
|
126
|
+
шансов, что Напарник возьмётся не за то. Знания переехали к движку на ваш
|
|
127
|
+
компьютер: за ними больше не ходят к нам.
|
|
128
|
+
|
|
129
|
+
Правки плана теперь доходят до кадра все до одной. Раньше часть просьб
|
|
130
|
+
принималась молча, а в готовом ролике ничего не менялось — двенадцать таких
|
|
131
|
+
мест закрыты, и там, где сделать нельзя, приходит отказ словами.
|
|
132
|
+
|
|
133
|
+
## 0.9.51 — 2026-09-18. Свой шаг из чата, ключ не в командной строке
|
|
134
|
+
|
|
135
|
+
Свой шаг теперь ставится словами. «Проверить свой шаг» разбирает папку, которую
|
|
136
|
+
вы написали сами, и говорит по пунктам, что в ней чинить. «Порядок шагов
|
|
137
|
+
монтажа» показывает, чем идёт монтаж и чей он — наш или ваш, — и правит ваш
|
|
138
|
+
порядок: поставить свой шаг до или после этапа, подменить шаг у этапа, убрать
|
|
139
|
+
этап. Пишется только ваша копия в папке mine: наш порядок не трогается, и
|
|
140
|
+
обновление движка вашу копию не заменяет.
|
|
141
|
+
|
|
142
|
+
Проверка окружения называет действующий порядок шагов и говорит вслух, если в
|
|
143
|
+
монтаже работает ваш код: чужой шаг исполняется вместе с монтажом, и знать об
|
|
144
|
+
этом надо до работы, а не после.
|
|
145
|
+
|
|
146
|
+
Ключ подписки больше не принимается аргументом командной строки: он виден в
|
|
147
|
+
списке процессов, остаётся в истории оболочки и попадает на запись экрана.
|
|
148
|
+
Ключ задаётся переменной среды — так его и присылает бот — или вводится по
|
|
149
|
+
вопросу установщика, ввод при этом не показывается.
|
|
150
|
+
|
|
151
|
+
## 0.9.50 — 2026-09-17. «Хочу иначе»: три двери
|
|
152
|
+
|
|
153
|
+
Попросили то, чего монтаж пока не делает, — Напарник знает, куда идти: цвет,
|
|
154
|
+
шрифт и кегль правятся в стиле; тот же приём другой раскладкой — это вариант;
|
|
155
|
+
а своё, чего нет вовсе, кладётся своим шагом в папку mine в доме Напарника,
|
|
156
|
+
и обновления её не трогают. Подробности он берёт из знания «Хочу иначе».
|
|
157
|
+
Проверка окружения теперь пишет рядом с каждым шагом его имя: этим именем
|
|
158
|
+
шаг зовут в redo и так называют папку своего шага.
|
|
159
|
+
|
|
160
|
+
## 0.9.49 — 2026-09-18. Монтажёр спрашивает сам
|
|
161
|
+
|
|
162
|
+
На первом ролике Напарник сам спрашивает, что нужно: субтитры, цвет картинки,
|
|
163
|
+
паузы, свой фирменный стиль. Ответили — форма показывает карточки только по
|
|
164
|
+
выбранному, на кадре вашего ролика; «Готово» запоминает. Второй ролик идёт без
|
|
165
|
+
вопросов. Ничего не выбрали — это тоже запоминается, и вопрос не повторится.
|
|
166
|
+
Раньше форму приходилось звать словами «покажи варианты», о которых никто не
|
|
167
|
+
знал.
|
|
168
|
+
|
|
169
|
+
Проверка окружения перечисляет вопросы по разделам. Совет о том, как будет
|
|
170
|
+
выглядеть ролик, Напарник даёт по своему знанию о вкусе, а не наугад.
|
|
171
|
+
|
|
172
|
+
## 0.9.48 — 2026-09-18. Мир, крупности и графика по плану
|
|
173
|
+
|
|
174
|
+
Лестница хода работы называет новые этапы движка: фон за героем, крупности
|
|
175
|
+
по плану, графику по плану. Раньше оболочка молча пропускала их, и человек
|
|
176
|
+
не видел, чем занят монтаж.
|
|
177
|
+
|
|
178
|
+
Начинка того же дня. Мир за героем: движок сам рисует тёмную плоскость с
|
|
179
|
+
сеткой ровно в длину ролика или берёт картинку человека; вырез и свет
|
|
180
|
+
включаются планом, а не ключом. Крупности по плану: весь кадр, окно снизу с
|
|
181
|
+
головой над кромкой, крупный план с глазами на трети высоты; движение даёт
|
|
182
|
+
только рез. Графика по плану: хук, накопительный ряд чипов, счётчик, цитата,
|
|
183
|
+
бейдж шага, финальная плашка; приёмка меряет их движение по готовому файлу.
|
|
184
|
+
Вопрос формы «Свой стиль: три варианта»: палитра, пара шрифтов и раскладка
|
|
185
|
+
считаются по кадру человека, контраст меряется, выбор ложится в стиль
|
|
186
|
+
набором. Приёмка «текст на лице». Знания под подпиской сжаты до 3 КБ.
|
|
187
|
+
|
|
188
|
+
## 0.9.47 — 2026-09-17. Один чат вместо семи помощников, план ролика, папка на ролик
|
|
189
|
+
|
|
190
|
+
Помощники монтажа больше не кладутся файлами в папки Клода и Codex. Монтаж
|
|
191
|
+
ведёт один разговор: что делать, Напарник говорит сам, коротко и по порядку.
|
|
192
|
+
Инструменты «Поставить помощников» и «Запомнить правило» убраны; правила
|
|
193
|
+
(«паузы держи подлиннее») запоминаются в стиле через форму выбора. Инструкция
|
|
194
|
+
модели ужалась с четырнадцати килобайт до трёх и называет только живые
|
|
195
|
+
инструменты.
|
|
196
|
+
|
|
197
|
+
Проверка окружения сразу говорит, что монтаж умеет: шаги, вопросы, наборы и
|
|
198
|
+
чей стиль приходят тем же ответом. Отдельная справка «Что умеет монтаж» больше
|
|
199
|
+
не нужна — на старте один вызов вместо двух.
|
|
200
|
+
|
|
201
|
+
Движок сам составляет план ролика: ритм, крупности, накопительный ряд на
|
|
202
|
+
перечислении, счётчик на числительном, окно записи экрана, акценты субтитров и
|
|
203
|
+
звуковые события — по речи, брифу и таблицам замеров. Ответ о задании содержит
|
|
204
|
+
план словами, рядом с версией ложится `plan-vN.md`. Правка готового ролика —
|
|
205
|
+
одна операция `plan_edit`, с пересборкой из кеша за секунды; «в субтитре не то
|
|
206
|
+
слово» правится без распознавания заново. Под подпиской.
|
|
207
|
+
|
|
208
|
+
Папка на ролик: движок сам держит порядок в папке человека. `reels` — что в
|
|
209
|
+
папке: ролики с заголовками, версиями и состоянием задания плюс файлы, роликом
|
|
210
|
+
ещё не ставшие. `reel_open` — завести ролик: папка `reels/<дата>-<имя>/`, роли
|
|
211
|
+
файлов по замеру (а не по имени), бриф `reel.json`, исходники переезжают в
|
|
212
|
+
`source/`. Два дубля с речью разом движок не выбирает сам — спрашивает. Файл,
|
|
213
|
+
у которого уже есть проект, в новый ролик не переезжает; два файла с одинаковым
|
|
214
|
+
именем не затирают друг друга; папка, документ или ссылка за пределы папки —
|
|
215
|
+
отказ словами, ни один файл не двигается. Оба инструмента работают и без
|
|
216
|
+
подписки: ролик собирает `montage`, он и спрашивает.
|
|
217
|
+
|
|
218
|
+
Счётчик вызовов: строка на каждый вызов инструмента в `calls.jsonl` дома, ровно
|
|
219
|
+
четыре поля и потолок в мегабайт — наш замер скорости, аргументов в нём нет.
|
|
220
|
+
|
|
221
|
+
## 0.9.46 — 2026-09-15. Сорок цветов вместо двухсот сорока
|
|
222
|
+
|
|
223
|
+
В наборе осталось сорок фильтров: отобраны самые сильные и попарно
|
|
224
|
+
непохожие. Ближайшая пара теперь отличается в сто раз заметнее, чем на
|
|
225
|
+
полном наборе, — листать одинаковые карточки больше не надо.
|
|
226
|
+
|
|
227
|
+
Вопрос называется «Цвет видео», а не «Фильтр на картинку»: мы делаем ролики.
|
|
228
|
+
Ползунки рядом — «Настроить цвет вручную», чтобы два вопроса не звались
|
|
229
|
+
одинаково.
|
|
230
|
+
|
|
231
|
+
Холст цвета повторяет углы кадра: выбор фильтра больше не съедает рамку и
|
|
232
|
+
скругление.
|
|
233
|
+
|
|
234
|
+
## 0.9.45 — 2026-09-15. Лесенка не наезжает, тени мягче
|
|
235
|
+
|
|
236
|
+
Строки лесенки перекрывали друг друга: шаг считался по капители, а слово
|
|
237
|
+
занимает весь кегль — «У» и «Д» уходят ниже. Теперь шаг берётся от кегля.
|
|
238
|
+
|
|
239
|
+
Тени под буквами стали прозрачнее втрое: плотные слои читались как обводка,
|
|
240
|
+
которой в ролике нет.
|
|
241
|
+
|
|
242
|
+
## 0.9.44 — 2026-09-14. Шрифт заводится двоичным, минуя CSP
|
|
243
|
+
|
|
244
|
+
Песочница хоста приходит с «default-src 'none'», а «font-src» в ней не
|
|
245
|
+
объявлен вовсе: правило @font-face с адресом — включая «data:» — отбивается
|
|
246
|
+
до загрузки, и в консоли виджета остаётся отказ, которого никто не видит.
|
|
247
|
+
|
|
248
|
+
Теперь гарнитура заводится через FontFace с двоичными данными: сетевого
|
|
249
|
+
запроса нет, запрещать нечего, и выбранный шрифт виден в кадре.
|
|
250
|
+
|
|
251
|
+
## 0.9.43 — 2026-09-14. Шрифт в превью наконец виден
|
|
252
|
+
|
|
253
|
+
Правило @font-face уезжало в браузер без format(), и в песочнице хоста он
|
|
254
|
+
молча его пропускал: файл приезжал, а буквы оставались системными. Теперь
|
|
255
|
+
формат назван явно, и выбранная гарнитура видна в кадре.
|
|
256
|
+
|
|
257
|
+
Заодно убран лишний поход к движку: за файлом шрифта идёт обычная перепечка,
|
|
258
|
+
а не отдельный вызов следом за ней.
|
|
259
|
+
|
|
260
|
+
## 0.9.42 — 2026-09-14. Акцент в строке, место сверху, смена шрифта
|
|
261
|
+
|
|
262
|
+
Главное слово выделяется цветом и в раскладке «Строкой» — прежде цветным оно
|
|
263
|
+
было только в лесенке, и выбор цвета в строке ничего не менял.
|
|
264
|
+
|
|
265
|
+
У места строки появился третий вариант — «Сверху»: строка над лицом, в
|
|
266
|
+
верхней трети кадра.
|
|
267
|
+
|
|
268
|
+
Смена шрифта наконец видна в превью. Правило @font-face заводилось один раз
|
|
269
|
+
под одним именем, и браузер считал все следующие гарнитуры повтором первой.
|
|
270
|
+
|
|
271
|
+
## 0.9.41 — 2026-09-14. Восемь правок по форме
|
|
272
|
+
|
|
273
|
+
Основные субтитры снова белые: цвет красит ГЛАВНОЕ слово, а старый ключ
|
|
274
|
+
«colors.text» — наследие версий, где красилась вся строка, — вопрос теперь
|
|
275
|
+
снимает сам. Квадрат «Белый» показывает белое, а не то, что выбрано сейчас.
|
|
276
|
+
|
|
277
|
+
Шрифты: «Системного» варианта больше нет — только названия начертаний. Смена
|
|
278
|
+
шрифта перерисовывает превью: файл гарнитуры приезжает от движка.
|
|
279
|
+
|
|
280
|
+
Сетка: порция кратна двенадцати, и последний ряд всегда полон — вторая
|
|
281
|
+
строка больше не обрывается на середине. «Показать ещё» без чисел и
|
|
282
|
+
показывает набор ЦЕЛИКОМ, а не следующую горсть.
|
|
283
|
+
|
|
284
|
+
Значок «во весь экран» переехал в угол виджета: разворачивается форма, а не
|
|
285
|
+
картинка.
|
|
286
|
+
|
|
287
|
+
Договор вопросов формы поднят на naparnik-choices/6.
|
|
288
|
+
|
|
289
|
+
## 0.9.40 — 2026-09-14. Превью рисует браузер, а не движок
|
|
290
|
+
|
|
291
|
+
Картинку в форме складывает сама форма: движок отдаёт сырьё — чистый кадр
|
|
292
|
+
ролика, числа вида, умолчания, таблицы цвета и файл шрифта, — а субтитры,
|
|
293
|
+
фильтр и ползунки браузер кладёт на кадр сам.
|
|
294
|
+
|
|
295
|
+
Отсюда три починки разом. «Белый» после жёлтого даёт белый, «Внизу» после
|
|
296
|
+
«По центру» ставит строку вниз: пустой вариант означает «вернуть в
|
|
297
|
+
умолчание», и умолчания теперь у формы есть. Вспышка цвета в рамке ушла
|
|
298
|
+
вместе со вторым путём картинки — он был единственной причиной.
|
|
299
|
+
|
|
300
|
+
Фильтры считает шейдер: та же таблица 17³, какой ffmpeg красит ролик.
|
|
301
|
+
Ползунок двигают — кадр меняется в тот же миг, без похода к движку.
|
|
302
|
+
|
|
303
|
+
Договор вопросов формы поднят на naparnik-choices/5.
|
|
304
|
+
|
|
305
|
+
## 0.9.39 — 2026-09-14. «Какие есть шрифты» — теперь можно спросить
|
|
306
|
+
|
|
307
|
+
Набор из 61 начертания уехал покупателю ещё 10 сентября, а назвать шрифт он
|
|
308
|
+
мог только точным именем из описи — и взять его было неоткуда: папку с
|
|
309
|
+
двоичными файлами человек не читает, а имя файла и настоящее имя начертания
|
|
310
|
+
расходятся (`gnyrwn977.otf` внутри зовётся «Gunny Rewritten»).
|
|
311
|
+
|
|
312
|
+
Новый инструмент `fonts` спрашивает набор у движка и отвечает строкой на
|
|
313
|
+
шрифт: имя для стиля, семейство с начертанием, покрытые алфавиты, лицензия.
|
|
314
|
+
Алфавит стоит рядом с именем не для полноты — половина набора разрезана по
|
|
315
|
+
алфавитам, и латинский шрифт под русскую речь даёт отказ на замере; увидеть
|
|
316
|
+
это надо ДО того, как человек назовёт шрифт.
|
|
317
|
+
|
|
318
|
+
Суммы файлов, их вес и строки копирайта модели не отдаются: движок печатает
|
|
319
|
+
на весь набор 22 КБ, две трети из них не отвечают ни на один вопрос человека.
|
|
320
|
+
|
|
321
|
+
Подписки инструмент не требует: посмотреть, что лежит в наборе, — витрина.
|
|
322
|
+
|
|
323
|
+
## 0.9.38 — 2026-09-14. Цвет — квадратом, шрифт — словом
|
|
324
|
+
|
|
325
|
+
Цвет и шрифт показывались кадром ролика: каждый показ формы гонял рендер
|
|
326
|
+
ради того, что видно и без ролика, а человек ждал. Теперь цвет — квадрат
|
|
327
|
+
этого цвета, шрифт — слово, набранное этим шрифтом. Рисуются мгновенно,
|
|
328
|
+
приходят все сразу, «Показать ещё» им не нужна.
|
|
329
|
+
|
|
330
|
+
Договор вопросов формы поднят на naparnik-choices/5: у вопроса появилось
|
|
331
|
+
поле «card» — чем показывать варианты.
|
|
332
|
+
|
|
333
|
+
## 0.9.37 — 2026-09-13. Кадр крупнее, лесенка слушается места
|
|
334
|
+
|
|
335
|
+
Кадр слева занимал 220 точек в ширину — рядом с колонкой в семь вопросов
|
|
336
|
+
он выглядел значком. Теперь ему отдано 320, то есть 569 в высоту, и
|
|
337
|
+
отступы сверху и снизу.
|
|
338
|
+
|
|
339
|
+
Лесенка слушается выбора места: «по центру» ставит блок серединой в
|
|
340
|
+
середину кадра, «внизу» — нижней кромкой там же, где обычную строку.
|
|
341
|
+
Раньше она стояла по своему числу, и человек выбирал место, а картинка не
|
|
342
|
+
менялась. За кромку кадра блок при этом не выпускается.
|
|
343
|
+
|
|
344
|
+
Раздел «Картинка» переименован в «Фильтры».
|
|
345
|
+
|
|
346
|
+
## 0.9.36 — 2026-09-13. Лесенка субтитров и разделы в форме
|
|
347
|
+
|
|
348
|
+
**Раскладок стало две.** «Строкой» — фраза целиком, как было. «Лесенкой» —
|
|
349
|
+
слова разного кегля ступенями: главное слово втрое крупнее и цветное,
|
|
350
|
+
остальные мелкие. Формула снята с разбора живых роликов покадрово, а не
|
|
351
|
+
придумана. Места считаются на всю фразу сразу, а слова проявляются по одному
|
|
352
|
+
в такт речи — потому порядок появления и выходит разным.
|
|
353
|
+
|
|
354
|
+
**Вопросы разложены по разделам.** «Субтитры», «Картинка», «Монтаж» — полоса
|
|
355
|
+
вкладок, на экране один раздел. Семь вопросов в ленту уже не помещались.
|
|
356
|
+
«Готово» по-прежнему ждёт ответов по всей форме, а не по открытой вкладке.
|
|
357
|
+
|
|
358
|
+
Договор вопросов формы поднят на naparnik-choices/4: у вопроса появился
|
|
359
|
+
раздел (`group`).
|
|
360
|
+
|
|
361
|
+
## 0.9.35 — 2026-09-13. Форма больше не мигает на каждый тык
|
|
362
|
+
|
|
363
|
+
Человек выбирал строку — и вся форма вспыхивала заново. Две причины, обе
|
|
364
|
+
убраны. Появление карточек играло на КАЖДОЙ отрисовке, а форма рисуется
|
|
365
|
+
заново после каждого ответа: теперь движение показывается один раз, при
|
|
366
|
+
первом показе. И кадр слева мерцал, пока пекутся образцы, даже когда они
|
|
367
|
+
приходили из кэша за десятую долю секунды: теперь мерцание включается
|
|
368
|
+
только если печётся дольше четверти секунды.
|
|
369
|
+
|
|
370
|
+
**Список больше не пересобирается.** Раскладка та же — меняются только
|
|
371
|
+
картинки и кадр слева, разметка живёт. Заодно ушёл баг: «Показать ещё»
|
|
372
|
+
появлялась под вопросом, где всё давно показано.
|
|
373
|
+
|
|
374
|
+
## 0.9.34 — 2026-09-13. Цвет крутится не вслепую
|
|
375
|
+
|
|
376
|
+
Форма, в которой спросили ТОЛЬКО цвет картинки, показывала девять ползунков и
|
|
377
|
+
пустое место слева: образец у такого вопроса один на весь вопрос, движок его
|
|
378
|
+
печёт, а форма читала только образцы карточек — и выбрасывала. Теперь кадр
|
|
379
|
+
слева показывает, что вышло из накрученных чисел.
|
|
380
|
+
|
|
381
|
+
## 0.9.33 — 2026-09-13. Цвет картинки: 244 фильтра и девять ползунков
|
|
382
|
+
|
|
383
|
+
**Фильтры.** В паке лежит набор из 244 цветовых таблиц: человек листает их
|
|
384
|
+
сеткой — на СВОЁМ кадре, а не на чужой модели, — и выбирает тыком. Качать
|
|
385
|
+
ничего не нужно, всё уже на диске: таблица весит семь килобайт.
|
|
386
|
+
|
|
387
|
+
**Ползунки, как в монтажных программах.** Температура, оттенок, насыщенность,
|
|
388
|
+
экспозиция, контраст, света, тени, белое, чёрное и цветовые секторы. Кадр слева
|
|
389
|
+
показывает результат: подкрутил — увидел. Фильтр и ползунки складываются, как
|
|
390
|
+
человек и ждёт: сначала фильтр, потом его правки.
|
|
391
|
+
|
|
392
|
+
**Шрифты.** Все 46 шрифтов набора, которые умеют писать по-русски, теперь в
|
|
393
|
+
форме — порциями по восемь, с кнопкой «Показать ещё».
|
|
394
|
+
|
|
395
|
+
**⚠ Образцы показывали кадр БЕЗ цвета.** Карточки фильтров выходили побайтово
|
|
396
|
+
одинаковыми, а движок отчитывался «испёк»: человек выбирал бы цвет вслепую.
|
|
397
|
+
Теперь цвет ложится на образец тем же порядком, что в монтаже, — фильтр на
|
|
398
|
+
картинку, буквы поверх.
|
|
399
|
+
|
|
400
|
+
Выбранное запоминается как и раньше: фильтр и числа ложатся в пак стиля
|
|
401
|
+
человека, и следующий монтаж берёт их сам.
|
|
402
|
+
|
|
403
|
+
## 0.9.32 — 2026-09-13. Замок версий считает дату по UTC, а не по местному календарю
|
|
404
|
+
|
|
405
|
+
Вчерашняя сборка отвергла сама себя: младшая начинка была записана как
|
|
406
|
+
«2026.09.13-1» по московскому календарю, а выкладка в тот же час собрала
|
|
407
|
+
«2026.09.12-230» — по UTC было ещё двенадцатое. Прогон покупателя на стенде
|
|
408
|
+
честно встал на установке движка со словами «раздача ещё не обновилась». Номер
|
|
409
|
+
теперь берётся из уже собранного артефакта, а не сочиняется по календарю.
|
|
410
|
+
|
|
411
|
+
## 0.9.31 — 2026-09-13. Монтаж знает, что умеет, спрашивает только нужное и помнит выбор
|
|
412
|
+
|
|
413
|
+
**Каталог.** Инструмент `capabilities` называет модели, что умеет движок: шаги
|
|
414
|
+
монтажа, вопросы формы с вариантами, рецепты, чей стиль сейчас. Что тяжёлое ещё
|
|
415
|
+
не стоит — модель распознавания речи, вырезание фона — каталог не прячет за
|
|
416
|
+
«нельзя»: оно докачается перед первым монтажом, по согласию.
|
|
417
|
+
|
|
418
|
+
**Только нужные вопросы.** `choose_variant` получил `questions`: модель
|
|
419
|
+
показывает те вопросы, о которых просил человек, а не все подряд.
|
|
420
|
+
|
|
421
|
+
**Вопросы без картинки.** Форма умеет строки без кадра — «Резать паузы?» первый.
|
|
422
|
+
Все вопросы без картинки — кадра нет, колонка на всю ширину.
|
|
423
|
+
|
|
424
|
+
**Память.** «Готово» записывает выбор в стиль человека и в настройки хода
|
|
425
|
+
(`variant_chosen` → движок `choose-apply`); следующий монтаж берёт это сам, а
|
|
426
|
+
форма в следующий раз показывает уже выбранное помеченным. Обучаемый монтажёр,
|
|
427
|
+
только простой.
|
|
428
|
+
|
|
429
|
+
**«Есть обновление».** Ответ о подписке несёт последние версии расширения и
|
|
430
|
+
движка; вышла новая — модель один раз за разговор скажет, что обновить и как
|
|
431
|
+
(`update_shell` / `update_engine`).
|
|
432
|
+
|
|
433
|
+
⚠ Договор вопросов поднят на `naparnik-choices/2`, замок версий поднят с обеих
|
|
434
|
+
сторон: этой оболочке нужна начинка не старше 2026.09.12-230, а начинка не
|
|
435
|
+
отдаётся оболочкам старше 0.9.31.
|
|
436
|
+
|
|
437
|
+
## 0.9.30 — 2026-09-12. Образцы пекутся поверх уже выбранного
|
|
438
|
+
|
|
439
|
+
**⚠ Форма врала о результате.** Владелец: «когда я выбираю цвет, субтитры опять
|
|
440
|
+
идут наверх, хотя я их внизу выбрал». Каждый образец пёкся от исходного стиля, и
|
|
441
|
+
вопрос про цвет показывал строку на прежнем месте. Теперь после каждого ответа
|
|
442
|
+
форма просит движок испечь остальные вопросы поверх выбранного; пока печётся,
|
|
443
|
+
кадр мерцает, а щёлкать можно дальше. Прогон покупателя проверяет это на
|
|
444
|
+
настоящем движке.
|
|
445
|
+
|
|
446
|
+
Заголовок формы — имя ролика, над ним метка «Монтаж»; подписи под вопросами
|
|
447
|
+
убраны — очевидные фразы не пишут.
|
|
448
|
+
|
|
449
|
+
## 0.9.29 — 2026-09-12. Все вопросы сразу: место, цвет и что движок пришлёт дальше
|
|
450
|
+
|
|
451
|
+
Форма показывала первый вопрос, а остальные называла шагами «позже». Теперь она
|
|
452
|
+
спрашивает обо всём разом: над заголовком имя ролика, ниже разделы по вопросам,
|
|
453
|
+
в каждом свои строки. «Готово» появляется, когда отвечены ВСЕ: иначе модель
|
|
454
|
+
узнала бы про место строки и не узнала про цвет, а человек был бы уверен, что
|
|
455
|
+
выбрал оба.
|
|
456
|
+
|
|
457
|
+
Выбор уходит списком — по строке на вопрос, с именами вариантов латиницей, как
|
|
458
|
+
их знает движок. Полоска шагов убрана: разделы сами и есть шаги.
|
|
459
|
+
|
|
460
|
+
## 0.9.28 — 2026-09-12. Отступ между кадром и выбором 81 на широком экране
|
|
461
|
+
|
|
462
|
+
Мера владельца. Включается с 760 точек: колонка 408 и кадр 220 с таким отступом
|
|
463
|
+
дают пару в 709, и во врезку шириной 640 она не влезает. Ниже порога отступ
|
|
464
|
+
прежний, 20 — иначе кадр и варианты читались бы не одной вещью, а двумя через
|
|
465
|
+
провал.
|
|
466
|
+
|
|
467
|
+
## 0.9.27 — 2026-09-12. Между кадром и выбором всегда один отступ
|
|
468
|
+
|
|
469
|
+
Колонка выбора стояла посреди своего столбца, и на широком экране между кадром
|
|
470
|
+
и вариантами зияла пустая полоса. Теперь ширина пары считается из меры колонки
|
|
471
|
+
(408 при доле 65%), пара стоит по центру, а отступ между кадром и выбором один и
|
|
472
|
+
тот же на любой ширине.
|
|
473
|
+
|
|
474
|
+
## 0.9.26 — 2026-09-12. Скелет не пропадает: у столбцов задана ширина
|
|
475
|
+
|
|
476
|
+
Форма во время ожидания показывала пустоту. Причина: кадр и колонку выбора
|
|
477
|
+
поставили посреди своих столбцов полями «auto», а элемент сетки с таким полем
|
|
478
|
+
перестаёт растягиваться и берёт ширину по содержимому. Пока образцы пекутся,
|
|
479
|
+
содержимого нет — одни серые плашки, — и ширина выходила ноль.
|
|
480
|
+
|
|
481
|
+
## 0.9.25 — 2026-09-12. Пока образцы пекутся — серые кости вместо слов
|
|
482
|
+
|
|
483
|
+
Раньше в это время висели заглушки: чёрный прямоугольник вместо кадра, вопрос
|
|
484
|
+
«Какие субтитры?» и подсказка, которые через секунду менялись на настоящие.
|
|
485
|
+
Теперь на их местах серые скруглённые плашки с бегущим по ним светом, а кадр
|
|
486
|
+
серый, а не чёрный. Читается как работа, а не как поломка, и ничего не прыгает:
|
|
487
|
+
кости ростом с будущие строки. Кадр в скелете темнее остальных плашек: ровный
|
|
488
|
+
серый читается одним пятном, а с разницей в тоне видно, где будет главное.
|
|
489
|
+
|
|
490
|
+
Колонка выбора — 408 точек, и на широком экране кадр с колонкой больше не
|
|
491
|
+
липнут к левому краю: пустые поля остаются с обеих сторон.
|
|
492
|
+
|
|
493
|
+
## 0.9.24 — 2026-09-12. Колонка выбора 460, и форма не пропадает в свёрнутом блоке
|
|
494
|
+
|
|
495
|
+
Строки вариантов растягивались во всю ширину, и подпись уезжала от названия.
|
|
496
|
+
Теперь колонка выбора — 460 точек. Во весь экран кадр и форма прижаты к левому
|
|
497
|
+
краю, а не плывут посреди пустого окна.
|
|
498
|
+
|
|
499
|
+
**⚠ Форма могла прийти пустой, и это видел бы каждый.** Если блок в ленте
|
|
500
|
+
свёрнут или прокручен мимо в тот момент, когда пришли варианты, строки
|
|
501
|
+
оставались невидимыми навсегда: появление задано анимацией, а она в скрытом
|
|
502
|
+
окне не стартует. Развернул блок — а там вопрос без единого варианта, и ни
|
|
503
|
+
одной ошибки нигде. То же грозило знаку «готово» у полосы работы. Нашёл стенд
|
|
504
|
+
виджетов.
|
|
505
|
+
|
|
506
|
+
## 0.9.23 — 2026-09-12. «Во весь экран» переехала на кадр
|
|
507
|
+
|
|
508
|
+
Кнопка стояла рядом с вопросом и отнимала у него треть строки. Теперь это
|
|
509
|
+
значок в углу кадра — как в плеере, и вопрос занимает всю ширину колонки.
|
|
510
|
+
|
|
511
|
+
## 0.9.22 — 2026-09-12. Форма выбора: результат слева, выбор справа
|
|
512
|
+
|
|
513
|
+
Слева треть блока занимает кадр 9:16 — ваш кадр с тем, что выбрано, со
|
|
514
|
+
скруглением как у экрана iPhone. Справа вопрос, описание и простые строки
|
|
515
|
+
вариантов: название и подпись, метка выбора кружком. Картинки из строк ушли —
|
|
516
|
+
восемь вертикальных кадров в столбик в блок не помещались, а образец и так
|
|
517
|
+
виден слева крупно. Кадр раньше показывался только во весь экран.
|
|
518
|
+
|
|
519
|
+
На узком окне кадр ложится сверху и остаётся небольшим, чтобы не выталкивать
|
|
520
|
+
варианты за нижний край.
|
|
521
|
+
|
|
522
|
+
## 0.9.21 — 2026-09-12. Форма и полоса одеты по образцу apple.com
|
|
523
|
+
|
|
524
|
+
Подложка стала плитой с мягким градиентом книзу: в светлой теме из белого в
|
|
525
|
+
светло-серый, в тёмной из серого в чёрный. Текст темнее и ровнее, заголовок и
|
|
526
|
+
описание под вопросом набраны SF Pro Display — на Маке это системный шрифт.
|
|
527
|
+
Раньше фон был прозрачным и сливался с лентой.
|
|
528
|
+
|
|
529
|
+
## 0.9.20 — 2026-09-10. Видно, что происходит; монтаж на чистой машине снова запускается
|
|
530
|
+
|
|
531
|
+
**Полоса хода работы.** Установка и монтаж больше не идут в тишине: в ленте
|
|
532
|
+
видно этапы (сделан, идёт, ждёт), что делается сейчас, сколько осталось и
|
|
533
|
+
сколько прошло. В конце — путь к готовому файлу или отказ словами. Полоса сама
|
|
534
|
+
спрашивает движок раз в две с половиной секунды и замолкает, когда работа
|
|
535
|
+
кончилась или окно закрыли.
|
|
536
|
+
|
|
537
|
+
**⚠ Монтаж не запускался у покупателя ВООБЩЕ.** Задача заводится командой
|
|
538
|
+
движка, которая с 2026-09-09 стоит под подпиской, а ключ до неё не доезжал:
|
|
539
|
+
человек с живой оплатой получал «монтаж идёт по подписке, а ключа на этой
|
|
540
|
+
машине нет». Руками это не видно, пока в доме лежит движок от прошлых опытов, —
|
|
541
|
+
нашёл новый прогон покупателя на пустом доме.
|
|
542
|
+
|
|
543
|
+
**Прогон покупателя** (`make smoke-buyer`, 3,5 секунды, без сети) проходит
|
|
544
|
+
весь путь за человека: пустая машина, отказы без движка, образцы на кадре,
|
|
545
|
+
монтаж до файла на диске, заслон подписки. Он же ловит беды, которые раньше
|
|
546
|
+
находились только руками: форма не поняла ответ хоста, старая форма из кэша,
|
|
547
|
+
трассировка вместо слов, инструмент выпал из списка.
|
|
548
|
+
|
|
549
|
+
## 0.9.19 — 2026-09-10. Отказ виден в форме, а движок ставится ДО показа
|
|
550
|
+
|
|
551
|
+
**Пустая рамка со значком беды больше не появится.** Движка на машине нет —
|
|
552
|
+
инструмент честно отвечал «позови install_engine», но форма про отказ не знала
|
|
553
|
+
и не рисовала ничего. Человек видел сломанный продукт там, где система
|
|
554
|
+
отработала верно и объяснила, что делать. Теперь причина написана прямо в форме.
|
|
555
|
+
|
|
556
|
+
**Порядок стал правилом, а не пожеланием.** Модель звала витрину, не проверив,
|
|
557
|
+
есть ли движок, — и человек получал отказ вместо карточек. Теперь и описание
|
|
558
|
+
инструмента, и инструкция говорят прямо: нет движка — сперва install_engine с
|
|
559
|
+
согласия человека, и только потом карточки.
|
|
560
|
+
|
|
561
|
+
## 0.9.18 — 2026-09-10. Свод двух дорог одного дня
|
|
562
|
+
|
|
563
|
+
**Для вас ничего нового.** В этой версии встретились две работы, шедшие рядом:
|
|
564
|
+
установка по требованию с видимым ходом (0.9.17) и образцы на вашем кадре в
|
|
565
|
+
форме выбора (0.9.15, 0.9.16). Номер поднят потому, что состав кода после
|
|
566
|
+
свода другой, а файл расширения в раздаче под старым номером неприкосновенен.
|
|
567
|
+
|
|
568
|
+
## 0.9.16 — 2026-09-10. Образцы теперь на ВАШЕМ кадре: форму наполняет движок
|
|
569
|
+
|
|
570
|
+
**Карточки показывают кадр вашего ролика, а не наши рисунки.** Движок берёт
|
|
571
|
+
кадр, накладывает вариант тем же кодом, что рисует монтаж, и отдаёт форме
|
|
572
|
+
картинку. Пять образцов за 0,6 секунды, повторно из кэша за 0,09.
|
|
573
|
+
|
|
574
|
+
**Вопросы и варианты называет движок, а не оболочка.** Заглушка с тремя
|
|
575
|
+
нарисованными раскладками снята: она уже расходилась с монтажом — обещала
|
|
576
|
+
«лесенку» и «караоке», которых он не умеет. Теперь в форме то, что движок
|
|
577
|
+
правда нарисует: положение строки и цвет. Новый вариант — хоть наш, хоть
|
|
578
|
+
заведённый покупателем — появляется в форме без правки расширения.
|
|
579
|
+
|
|
580
|
+
Договор с номером (`naparnik-choices/1`): разошлись версии — отказ словами
|
|
581
|
+
«обнови то, что старее», а не пустая форма.
|
|
582
|
+
|
|
583
|
+
⚠ Что поймало ревью перед выкладкой: форма не получила бы данные ВООБЩЕ —
|
|
584
|
+
ворота разбора ждали поле снятой заглушки, и человек видел бы вечное
|
|
585
|
+
«Загружаю образцы…» без единой ошибки. Тесты этого не видели, потому что
|
|
586
|
+
подделка хоста слала данные не так, как шлёт живой хост.
|
|
587
|
+
|
|
588
|
+
## 0.9.15 — 2026-09-10. Монтажная панель: понятный финал и полный экран
|
|
589
|
+
|
|
590
|
+
**После «Готово» больше не гадаешь, случилось ли что-то.** Появляется зелёный
|
|
591
|
+
круг с галочкой, крупно — что выбрано, и подсказка, что делать дальше. Раньше
|
|
592
|
+
кнопка просто серела, и человек оставался перед формой без ответа.
|
|
593
|
+
|
|
594
|
+
**Форма умеет разворачиваться на весь экран.** Кнопка «Во весь экран» приходит
|
|
595
|
+
только если хост это умеет, а вид меняет ЕГО ответ, а не наш щелчок: отказ
|
|
596
|
+
форма переживает молча. В полном экране слева кадр с образцом, справа шаги
|
|
597
|
+
и карточки; в ленте всё как было.
|
|
598
|
+
|
|
599
|
+
Кнопка пока называется «Готово», а не «Монтировать»: выбор в монтаж ещё не
|
|
600
|
+
идёт, и обещать обратное нельзя.
|
|
601
|
+
|
|
602
|
+
## 0.9.17 — 2026-09-10. Ставим только то, что нужно, и видно, что происходит
|
|
603
|
+
|
|
604
|
+
**Первая установка стала короче.** Раньше она тянула распознавание речи —
|
|
605
|
+
полтора гигабайта — даже тому, кто просил просто убрать паузы. Теперь сразу
|
|
606
|
+
ставится только то, без чего не идёт ничто: ffmpeg, питон и окружение монтажа.
|
|
607
|
+
Распознавание речи, вырез героя и чистка голоса ставятся, когда вы попросите то,
|
|
608
|
+
для чего они нужны, и только после вашего «да» — с названным весом и временем.
|
|
609
|
+
|
|
610
|
+
**Видно, что идёт и сколько осталось.** Установка и монтаж рассказывают ход по
|
|
611
|
+
шагам: что делаем сейчас, что дальше, сколько примерно осталось. Время
|
|
612
|
+
называется там, где его есть из чего посчитать, — и не называется, когда
|
|
613
|
+
считать нечем.
|
|
614
|
+
|
|
615
|
+
## 0.9.14 — 2026-09-10. Картинки идут форме, а не в контекст модели
|
|
616
|
+
|
|
617
|
+
Ответ инструмента уезжал одним куском и модели, и форме, а в нём — картинки
|
|
618
|
+
образцов. Модель их читает каждый ход и всё равно не видит: base64 в тексте
|
|
619
|
+
она посмотреть не может. Теперь по спеке разведено: `content` — названия
|
|
620
|
+
словами (254 знака), `structuredContent` — варианты с картинками для формы.
|
|
621
|
+
|
|
622
|
+
Замер на нарисованных образцах: модели уходило 3703 знака, стало 254. С
|
|
623
|
+
настоящими кадрами ролика разрыв стократный: кадр 320 точек в base64 весит
|
|
624
|
+
восемь килобайт, три — двадцать четыре.
|
|
625
|
+
|
|
626
|
+
## 0.9.13 — 2026-09-10. Поддержка видит, какая у вас сборка
|
|
627
|
+
|
|
628
|
+
**Для вас ничего не меняется.** Расширение теперь сообщает нашему серверу номер
|
|
629
|
+
сборки движка монтажа — тот же, что вы видите в «данных для поддержки».
|
|
630
|
+
|
|
631
|
+
**Зачем.** Когда вы пишете «не работает», мы до сих пор не знали, какая у вас
|
|
632
|
+
сборка движка: номер расширения сервер видел, номер движка — нет. Теперь видим
|
|
633
|
+
и отвечаем по делу, а не «пришлите ещё раз».
|
|
634
|
+
|
|
635
|
+
## 0.9.12 — 2026-09-10. Форма выбора одета по-фирменному
|
|
636
|
+
|
|
637
|
+
Была сырая заготовка: системный шрифт, серые плитки, содержимое прилипало к
|
|
638
|
+
краям. Теперь наши цвета и манера с лендинга — жёлтый ведёт действие, голубой
|
|
639
|
+
помечает, кадр внутри карточки со своим скруглением, выбранное берётся жёлтым
|
|
640
|
+
кольцом с галочкой. Кнопка «Готово» — как на сайте, с уезжающей стрелкой.
|
|
641
|
+
Вёрстка от телефона: до 560 карточка горизонтальная, выше — сеткой.
|
|
642
|
+
|
|
643
|
+
По дороге нашлись две молчаливые поломки:
|
|
644
|
+
|
|
645
|
+
- `color-scheme: light dark` делало окно НЕПРОЗРАЧНЫМ: браузер заливал iframe
|
|
646
|
+
своим холстом по настройке системы, а не по теме Клода, и при светлом Клоде
|
|
647
|
+
на тёмной macOS заголовок пропадал целиком. В консоли при этом пусто;
|
|
648
|
+
- три карточки вставали 2+1 сиротой около 640: мера не влезала втроём. Порог и
|
|
649
|
+
ширина теперь связаны арифметикой, и это записано рядом.
|
|
650
|
+
|
|
651
|
+
Ещё образец «Караоке» был обрезан по краям — строка идёт целиком, без
|
|
652
|
+
переноса, и на прежнем кегле не влезала в кадр.
|
|
653
|
+
|
|
654
|
+
## 0.9.11 — 2026-09-10. Модель наконец знает выбор: разобрано по официальным примерам
|
|
655
|
+
|
|
656
|
+
Выбор трижды не доходил до модели, и причина в том, что мы били не в тот
|
|
657
|
+
канал. Разобрано по репозиторию ext-apps и спеке:
|
|
658
|
+
|
|
659
|
+
- `tools/call` из формы записывает выбор НА НАШЕЙ стороне, но его результат
|
|
660
|
+
уходит виджету и в разговор не попадает — модель о нём не узнаёт вовсе;
|
|
661
|
+
- `ui/update-model-context` — единственный канал до модели: «context will be
|
|
662
|
+
used in future turns». Его мы и не слали, отсюда честное «выбор ко мне не
|
|
663
|
+
пришёл» на прямой вопрос человека;
|
|
664
|
+
- `ui/message` кладёт текст в поле ввода; Claude Desktop его не отправляет.
|
|
665
|
+
|
|
666
|
+
Теперь по кнопке уходят все три, каждый за своё, и форма говорит человеку
|
|
667
|
+
правду: выбор запомнен, текст в поле ввода, нажмите Enter — Клод ответит.
|
|
668
|
+
Мгновенного ответа протокол в этом хосте не даёт, и обещать его нельзя.
|
|
669
|
+
|
|
670
|
+
## 0.9.10 — 2026-09-10. Монтаж снова идёт у тех, кто платит
|
|
671
|
+
|
|
672
|
+
**Если монтаж вдруг отказывал словами «ключа на этой машине нет» — это чинится
|
|
673
|
+
этой версией.** Движок монтажа с недавних пор проверяет подписку сам, а
|
|
674
|
+
расширение не передавало ему ваш ключ: получалось, что заплативший человек
|
|
675
|
+
слышал «нет ключа» на собственном компьютере, где ключ вписан.
|
|
676
|
+
|
|
677
|
+
**Ключ по-прежнему не гуляет где попало.** Он передаётся ровно тем двум
|
|
678
|
+
работам, которым нужен, — монтажу и установке, — и не попадает ни в один
|
|
679
|
+
соседний процесс.
|
|
680
|
+
|
|
681
|
+
## 0.9.9 — 2026-09-10. Выбор доходит сам: форма зовёт инструмент, а не пишет в поле ввода
|
|
682
|
+
|
|
683
|
+
Реплику от имени человека Claude Desktop кладёт в поле ввода и НЕ отправляет:
|
|
684
|
+
человек выбрал, форма сказала «передал», а разговор стоит, пока он сам не
|
|
685
|
+
нажмёт Enter. Теперь кнопка «Готово» зовёт инструмент `variant_chosen` —
|
|
686
|
+
хост выполняет его сам, и модель отвечает на результат. Реплика осталась
|
|
687
|
+
запасным путём: если вызов не принят, текст всё равно окажется в поле ввода,
|
|
688
|
+
и форма прямо скажет «нажмите Enter», а не оставит человека гадать.
|
|
689
|
+
|
|
690
|
+
## 0.9.8 — 2026-09-10. Выбор уходит в разговор: содержимое реплики — массивом
|
|
691
|
+
|
|
692
|
+
Форма ожила: карточки рисуются, рукопожатие проходит, кнопка работает. Хост
|
|
693
|
+
отказывал уже на самой реплике — «expected array, received object» по пути
|
|
694
|
+
params.content. Спека 2026-01-26 рисует здесь объект, живой Claude Desktop
|
|
695
|
+
требует массив; это второе расхождение подряд после appInfo в рукопожатии.
|
|
696
|
+
Правило простое: верим хосту, спеку перепроверяем его ответами.
|
|
697
|
+
|
|
698
|
+
## 0.9.7 — 2026-09-10. Адрес формы считает машина: ручной номер забыли в первый же раз
|
|
699
|
+
|
|
700
|
+
Правило «поменял форму — подними номер в адресе руками» не пережило одной
|
|
701
|
+
версии: `appInfo` вернули, номер не подняли, хост отдал сохранённую форму — и
|
|
702
|
+
человек снова увидел отказ, которого в коде уже нет. Теперь в адресе восемь
|
|
703
|
+
знаков от самого HTML: меняется разметка или скрипт — меняется адрес, и забыть
|
|
704
|
+
нечего. Вид адреса прежний, короткий: `ui://naparnik/choose-<отпечаток>`.
|
|
705
|
+
|
|
706
|
+
## 0.9.6 — 2026-09-10. Рукопожатие формы: хост требует appInfo, спека называет clientInfo
|
|
707
|
+
|
|
708
|
+
**Форма не работала из-за нашей же «починки по спеке».** В 0.8.3 поле
|
|
709
|
+
`appInfo` переименовали в `clientInfo`, как написано в спеке 2026-01-26, — и
|
|
710
|
+
живой Claude Desktop стал отказывать в рукопожатии: «expected object, received
|
|
711
|
+
undefined» по пути `params.appInfo`. Карточки при этом рисовались, а выбор
|
|
712
|
+
никуда не уходил: рукопожатия не было вовсе.
|
|
713
|
+
|
|
714
|
+
Спека здесь в движении: ext-apps ещё на старом SEP-1724, `clientInfo` — из
|
|
715
|
+
нового SEP-2133. Поэтому шлём ОБА поля с одинаковым содержимым: лишнее хост
|
|
716
|
+
игнорирует, недостающее — отвергает. Сторож проверяет оба.
|
|
717
|
+
|
|
718
|
+
Ошибку показала подпись под карточками, добавленная версией раньше: до неё
|
|
719
|
+
отказ хоста выглядел точно так же, как молчание, — пустотой.
|
|
720
|
+
|
|
721
|
+
## 0.9.5 — 2026-09-10. Адрес формы снова короткий: на длинном хост её не рисовал
|
|
722
|
+
|
|
723
|
+
Версию оболочки вписали в адрес виджета, чтобы обойти кэш хоста, — и Claude
|
|
724
|
+
Desktop перестал рисовать форму вовсе: в ленте пустой блок, ошибки нигде.
|
|
725
|
+
Связывает инструмент с формой только короткий адрес вида `ui://<имя>/<путь>`.
|
|
726
|
+
|
|
727
|
+
Адрес снова короткий, `ui://naparnik/choose2`, а кэш обходится номером формы
|
|
728
|
+
в конце: поменял разметку или скрипт — поднял число руками. Сторож в тестах
|
|
729
|
+
не даёт вернуть точки и лишние сегменты в адрес.
|
|
730
|
+
|
|
731
|
+
## 0.9.4 — 2026-09-10. Карточки вернулись: форма снова слышит хоста
|
|
732
|
+
|
|
733
|
+
**Форма показывалась пустым блоком.** Данные приходили правильные, HTML
|
|
734
|
+
отдавался — а в ленте была пустота, без единой ошибки. Две причины, обе наши:
|
|
735
|
+
|
|
736
|
+
1. Виджет принимал сообщения строго от `window.parent`. Хост по спеке ставит
|
|
737
|
+
между собой и нами песочницу — первый iframe заводит второй, наш, — и
|
|
738
|
+
сообщения от неё мы молча выбрасывали. Теперь принимаем от любого предка;
|
|
739
|
+
соседний iframe по-прежнему отсечён: он ровня, а не предок.
|
|
740
|
+
2. Высота сообщалась хосту только при отрисовке карточек. Нет данных — нулевая
|
|
741
|
+
высота, и человек не видит даже заголовка. Теперь высота уходит сразу, а
|
|
742
|
+
пока образцы не пришли, в форме написано «Загружаю образцы…».
|
|
743
|
+
|
|
744
|
+
## 0.9.3 — 2026-09-10. Пустое поле настроек больше не выглядит как кривой ключ
|
|
745
|
+
|
|
746
|
+
**Незаполненные поля в окне расширения приезжали к нам ШАБЛОНОМ, а не пустотой.**
|
|
747
|
+
Claude Desktop подставлял в переменную саму строку `${user_config.api_key}` —
|
|
748
|
+
и человеку, который ключа не вписывал вовсе, отвечали «неверный формат ключа,
|
|
749
|
+
скопируйте целиком»: совет, который выполнить нельзя. Тем же способом ломался
|
|
750
|
+
дом: движок искали в папке с именем `${user_config.engine_home}`, а лежал он в
|
|
751
|
+
`~/.naparnik` — и на любую просьбу приходило «движок не установлен».
|
|
752
|
+
Теперь такое значение считается незаполненным полем, как и было задумано.
|
|
753
|
+
|
|
754
|
+
**«Покажи варианты субтитров» вело не туда.** Модель звала `style_check` —
|
|
755
|
+
разбор уже выбранного стиля, который без движка отвечает отказом. Теперь оба
|
|
756
|
+
инструмента говорят, чем они друг от друга отличаются, и то же правило стоит в
|
|
757
|
+
инструкции: просят ПОКАЗАТЬ, из чего выбирать, — это форма.
|
|
758
|
+
|
|
759
|
+
## 0.9.2 — 2026-09-10. Форма обновляется вместе с расширением
|
|
760
|
+
|
|
761
|
+
**Обновление расширения не меняло форму, и это выглядело как поломка.**
|
|
762
|
+
Названия инструментов приезжали новые, а карточки оставались старыми: без
|
|
763
|
+
кнопки «Готово», с прежним рукопожатием, из-за которого выбор не доходил до
|
|
764
|
+
модели. Ошибки при этом не было нигде — просто старая форма.
|
|
765
|
+
|
|
766
|
+
Причина: спека MCP Apps разрешает хосту кэшировать содержимое `ui://`-ресурса
|
|
767
|
+
и ничего не говорит про сброс кэша. Адрес формы был постоянным, и Claude
|
|
768
|
+
Desktop честно отдавал сохранённое. Теперь версия оболочки стоит в самом
|
|
769
|
+
адресе — новая версия, новый адрес, попадать в кэш нечему. Сторож в тестах
|
|
770
|
+
не даёт вернуть постоянный адрес.
|
|
771
|
+
|
|
772
|
+
## 0.9.1 — 2026-09-10. Помощники и человеческие названия в одном расширении
|
|
773
|
+
|
|
774
|
+
Сборка двух дорог, которые шли рядом: помощники монтажа с их знаниями (0.9.0) и
|
|
775
|
+
человеческие названия инструментов в настройках (0.8.3, 0.8.4). По отдельности
|
|
776
|
+
ни та, ни другая до вас не доезжала — доезжает эта.
|
|
777
|
+
|
|
778
|
+
**Для вас ничего нового сверх того, что уже описано ниже.** Номер поднят потому,
|
|
779
|
+
что состав кода после сборки другой, а файл расширения в раздаче под старым
|
|
780
|
+
номером неприкосновенен.
|
|
781
|
+
|
|
782
|
+
## 0.9.0 — 2026-09-09. Помощники монтажа появляются сами
|
|
783
|
+
|
|
784
|
+
**Их больше не надо ставить руками.** Сценарист, паузы, субтитры, звук, вставки,
|
|
785
|
+
обложки, приёмка — скажите «поставь помощников», и они появятся в вашем Клоде
|
|
786
|
+
или Codex. Дальше нейросеть зовёт их сама, когда они нужны.
|
|
787
|
+
|
|
788
|
+
**Скажите «запомни» — запомнит.** «Паузы держи подлиннее», «хук короче», «музыку
|
|
789
|
+
потише» — так и скажите. Помощник запишет это себе, и повторять больше не
|
|
790
|
+
придётся. Новые версии ваши правила не трогают: они ваши.
|
|
791
|
+
|
|
792
|
+
**Правили файл сами — ничего не пропадёт.** Напарник соберёт файл заново, а вашу
|
|
793
|
+
правку отложит рядом и скажет, где она лежит.
|
|
794
|
+
|
|
795
|
+
**Чужое не трогаем.** Если в папке лежит помощник не наш, Напарник его не тронет
|
|
796
|
+
и скажет об этом.
|
|
797
|
+
|
|
798
|
+
**Разборы и приёмы приходят по подписке.** Помощник берёт их у нас, когда они
|
|
799
|
+
нужны, — на диск они не ложатся.
|
|
800
|
+
|
|
801
|
+
**Кончилась подписка — файлы Напарника уходят с диска.** Ваши правила остаются:
|
|
802
|
+
они ваши. Продлили — всё встаёт на место одной просьбой.
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
## 0.8.4 — 2026-09-09. Компьютер не бухгалтер: «считает машина» убрано отовсюду
|
|
806
|
+
|
|
807
|
+
Расширение говорило человеку словами, которых люди не говорят: «всё считает
|
|
808
|
+
машина пользователя», «считать нечем», «на этой машине». Компьютер ничего не
|
|
809
|
+
«считает» — работа идёт у человека на компьютере, и так это и написано теперь:
|
|
810
|
+
в инструкции модели, в описаниях всех инструментов и в текстах отказов.
|
|
811
|
+
|
|
812
|
+
Владелец браковал эту формулу трижды, поэтому поставлен сторож: тест ходит по
|
|
813
|
+
названиям, описаниям и инструкции и краснеет на «считает», «вычисляет»,
|
|
814
|
+
«режет», «резать» — со списком исключений, чтобы «прежний» и «режим» были целы.
|
|
815
|
+
|
|
816
|
+
## 0.8.3 — 2026-09-09. Инструменты называются по-человечески, выбор в форме доходит до модели
|
|
817
|
+
|
|
818
|
+
**В настройках расширения теперь понятные названия.** Было «Choose variant» и
|
|
819
|
+
«Montage job» — латиницей, машинным переводом из имени в коде; стало «Выбрать
|
|
820
|
+
вид субтитров» и «Что с монтажом». Заодно каждый инструмент говорит хосту, что
|
|
821
|
+
он делает: те, что только смотрят (проверка, осмотр видео, кадр, состояние
|
|
822
|
+
задачи), объявлены безопасными — Claude Desktop даёт разрешить их одной
|
|
823
|
+
кнопкой вместо семи. Переписывающим объявлен один `style_grade`: он кладёт
|
|
824
|
+
фильтр в пак стиля поверх одноимённого.
|
|
825
|
+
|
|
826
|
+
**Выбор в форме не доходил до модели, и теперь понятно почему.** В рукопожатии
|
|
827
|
+
`ui/initialize` мы слали `appInfo` вместо `clientInfo` и без `capabilities` —
|
|
828
|
+
карточки рисовались (их хост шлёт независимо от рукопожатия), а реплика
|
|
829
|
+
человека в разговор не попадала, без единой ошибки на экране. Поля исправлены
|
|
830
|
+
по спеке, а виджет теперь показывает, что ответил хост, — молчание больше не
|
|
831
|
+
выглядит как успех. Ответ хоста при этом отличается от его запроса: нумерация
|
|
832
|
+
у той стороны своя и тоже с единицы, и без проверки её запрос сказал бы
|
|
833
|
+
человеку «передал», когда ничего не передано.
|
|
834
|
+
|
|
835
|
+
**Выбор отправляет кнопка «Готово», а не клик по карточке.** Человек вправе
|
|
836
|
+
передумать до того, как ответ уйдёт в разговор; и когда вопросов станет
|
|
837
|
+
несколько (субтитры, паузы, цвет), он ответит на все и нажмёт один раз.
|
|
838
|
+
|
|
839
|
+
Версия протокола в рукопожатии поднята с `2024-11-05` до `2025-06-18`: поле
|
|
840
|
+
`annotations` появилось позже той ревизии, и слать его, называясь старой,
|
|
841
|
+
значило врать.
|
|
842
|
+
|
|
843
|
+
## 0.8.2 — 2026-09-09. Ход монтажа виден в чек-листе задач
|
|
844
|
+
|
|
845
|
+
Там, где у Клода есть инструменты задач (Cowork), он заводит чек-лист этапов
|
|
846
|
+
монтажа по первому ответу `montage_job` и отмечает сделанные после каждого
|
|
847
|
+
опроса — человек видит, что идёт, не спрашивая. Готовый файл кладётся в
|
|
848
|
+
выходную папку сессии, если она есть. Это абзац в инструкции модели; в
|
|
849
|
+
обычном Claude Desktop таких инструментов нет, и абзац ничего не меняет.
|
|
850
|
+
|
|
851
|
+
## 0.8.1 — 2026-09-09. Расширение обновляется само
|
|
852
|
+
|
|
853
|
+
**Это последний раз, когда файл расширения берётся у бота.** Дальше Напарник сам
|
|
854
|
+
скажет, что вышло новое, и поставит после вашего «да». Ходить за файлом,
|
|
855
|
+
перетаскивать его и удалять старое больше не нужно.
|
|
856
|
+
|
|
857
|
+
**Как это выглядит.** Открыли Клода, заговорили о монтаже — Напарник одной
|
|
858
|
+
фразой говорит: вышла такая-то версия, вот что в ней нового. Сказали «давай» — он
|
|
859
|
+
её ставит. Работать она начнёт после перезапуска Клода или Codex, и об этом он
|
|
860
|
+
тоже скажет.
|
|
861
|
+
|
|
862
|
+
**Ключ остаётся в файле от бота.** Обновляется само расширение, а ключ подписки
|
|
863
|
+
лежит там же, где лежал, и никуда не переезжает.
|
|
864
|
+
|
|
865
|
+
**Не завелось — останется прежнее.** Новая версия сначала проверяется запуском и
|
|
866
|
+
только потом становится рабочей. Не запустилась — Напарник оставляет ту, что
|
|
867
|
+
работала, и говорит об этом словами; вернуться на шаг назад можно и самому.
|
|
868
|
+
|
|
869
|
+
## 0.7.1 — 2026-09-09. Комментарии называют живые имена
|
|
870
|
+
|
|
871
|
+
**Для покупателя ничего не меняется** — ни один инструмент, ни одна ветка кода
|
|
872
|
+
не тронута. Номер поднят потому, что исходники оболочки изменились, а файл
|
|
873
|
+
расширения в раздаче под старым номером неприкосновенен.
|
|
874
|
+
|
|
875
|
+
**Что изменилось внутри.** Тридцать комментариев ссылались на функции, константы
|
|
876
|
+
и файлы по кириллическим именам, которых в коде нет с переезда на латиницу:
|
|
877
|
+
`бедаСПитоном`, `собратьВсе`, `ЖУРНАЛОВ_ХРАНИМ`, `движок.ts`, `АРХИТЕКТУРА.md`.
|
|
878
|
+
Каждая ссылка сверена с кодом и переписана тем именем, которое есть:
|
|
879
|
+
`pythonTrouble`, `buildAll`, `KEEP_LOGS`, `engine.ts`, `docs/architecture.md`.
|
|
880
|
+
Смысл комментариев не менялся, русский текст не переводился. Возврат ловит
|
|
881
|
+
сторож `tools/repo/comment-references.test.ts` — он смотрит и на `server/src`.
|
|
882
|
+
|
|
883
|
+
## 0.7.0 — 2026-09-09. Всё внутри переименовано на латиницу
|
|
884
|
+
|
|
885
|
+
**Старое расширение само не обновится — напишите боту.** Расширение и движок
|
|
886
|
+
монтажа договариваются между собой маленьким файлом на раздаче, и в этом файле
|
|
887
|
+
переименованы все поля. Версия 0.6.x таких имён не знает: она откажется ставить
|
|
888
|
+
новую начинку и скажет об этом словами, а не промолчит. Лечится одной кнопкой —
|
|
889
|
+
напишите боту t.me/ai_montazh_bot, он пришлёт свежее расширение. Ставится оно
|
|
890
|
+
поверх, ничего удалять не надо.
|
|
891
|
+
|
|
892
|
+
**Первый монтаж после обновления посчитается дольше обычного.** У движка память
|
|
893
|
+
на уже посчитанное, и хранится она по именам шагов и файлов — а они теперь
|
|
894
|
+
другие. Значит первый ролик пройдёт весь путь заново, вместе с распознаванием
|
|
895
|
+
речи: это минуты, а не секунды. Дальше всё вернётся к обычной скорости, и
|
|
896
|
+
повторные сборки того же ролика снова пойдут почти мгновенно.
|
|
897
|
+
|
|
898
|
+
**Пак стиля, заведённый раньше, придётся завести заново.** Расширение скажет об
|
|
899
|
+
этом прямо, когда увидит старый файл. Прежний никуда не денется и лежит там же —
|
|
900
|
+
цифры из него можно перенести руками. Папки, которые движок делал рядом с вашим
|
|
901
|
+
видео, тоже останутся: новые он заведёт сам, старые можно удалить когда угодно.
|
|
902
|
+
|
|
903
|
+
**Что изменилось для тех, кто набирает команды руками.** Ключи установщика
|
|
904
|
+
теперь `--install`, `--remove` и `--rollback` вместо прежних русских. Бот
|
|
905
|
+
присылает их готовой строкой, помнить наизусть ничего не нужно.
|
|
906
|
+
|
|
907
|
+
## 0.6.5 — 2026-09-09. Обновление начинки больше не откатывается само
|
|
908
|
+
|
|
909
|
+
**Новая начинка теперь доезжает до человека.** Расширение качало её,
|
|
910
|
+
раскладывало, запускало на пробу — и всегда решало, что это не та версия:
|
|
911
|
+
дымовой прогон читал из ответа движка ключ `версия`, а `console.py версия`
|
|
912
|
+
печатает `version`. Сравнивалось `undefined` с номером, не сходилось никогда, и
|
|
913
|
+
КАЖДОЕ обновление откатывалось: свежая сборка ложилась на диск как
|
|
914
|
+
`битая-<версия>`, человек навсегда оставался на старой начинке. Ни одна правка
|
|
915
|
+
движка не могла до него доехать.
|
|
916
|
+
|
|
917
|
+
**Молчало это потому, что тест проверял сам себя.** Подставной дымовой прогон в
|
|
918
|
+
`update.test.ts` писал тот же неверный ключ, что и разбор, — TypeScript сверялся
|
|
919
|
+
с собственной заготовкой. Теперь ключ на проводе называет сам движок: тест
|
|
920
|
+
кладёт в папку версии настоящий `client/engine`, запускает настоящий
|
|
921
|
+
`console.py версия` настоящим питоном и тем же `probe`, который поедет к
|
|
922
|
+
покупателю. Разойдись имена ещё раз — покраснеет здесь, а не у человека.
|
|
923
|
+
|
|
924
|
+
**Улика не запустившейся сборки перестала пропадать.** Ревью нашло дыру, которую
|
|
925
|
+
починка выше и открыла: сборка сохранялась под именем `битая-<версия>`, а уборка
|
|
926
|
+
старых версий щадила только `broken-`. То есть единственное объяснение, почему
|
|
927
|
+
начинка не встала, сносилось первой же удачной уборкой. Пока дымовой прогон не
|
|
928
|
+
пропускал ничего, до уборки дело не доходило вовсе; пошли обновления — ожила и
|
|
929
|
+
она. Теперь имя латиницей и одной константой на запись и на фильтр, а папки
|
|
930
|
+
`битая-*` с уже стоящих оболочек уборка бережёт отдельной строкой: у тех, кто
|
|
931
|
+
обновлялся раньше, они лежат на диске прямо сейчас.
|
|
932
|
+
|
|
933
|
+
**Пять кросс-языковых сторожей перестали молчать.** `engine.test.ts` искал
|
|
934
|
+
исходники движка в `ai-editor-lab/engine` — папке, которой нет с переезда дерева
|
|
935
|
+
2026-09-08, — и `describe.skipIf` гасил их разом, показывая «5 skipped» в конце
|
|
936
|
+
прогона. Среди них единственная проверка, что список шагов установки в оболочке
|
|
937
|
+
совпадает с `install.py`: шов, который уже расходился и уже загонял клиента в
|
|
938
|
+
тупик. Пропуск снят совсем, а не поправлен: тесты в опубликованный пакет не
|
|
939
|
+
уезжают, значит движок рядом с ними есть всегда. Заодно починены два регекспа,
|
|
940
|
+
искавшие питоновские имена `_ВНУТРИ_ПИТОНА` и `ШАГИ`, — в движке они давно
|
|
941
|
+
`_INSIDE_PYTHON` и `STEPS`. Пропусков в `engine.test.ts` теперь ноль, и на
|
|
942
|
+
пропавшие исходники набор падает словами.
|
|
943
|
+
|
|
944
|
+
## 0.6.4 — 2026-09-09. Мёртвый ключ перестал выглядеть нашей аварией
|
|
945
|
+
|
|
946
|
+
**Замена ключа больше не читается как «у них сломалось».** Каждый новый ключ
|
|
947
|
+
отключает прежний, поэтому в этот отказ упирается всякий, кто перевыпустил ключ
|
|
948
|
+
и забыл поправить настройку, — случай обычный. Текст сервера был хороший
|
|
949
|
+
(«ключ заменён новым, напишите боту»), портила рамка: заслон подписки 401 не
|
|
950
|
+
ловил, его подхватывал протокол и печатал «Внутренняя ошибка выполнения: …».
|
|
951
|
+
Человек шёл ждать вместо того, чтобы взять свежий ключ. Теперь отказом словами
|
|
952
|
+
отвечает короткий список: ненастроенный ключ, 401 и наш же 429 — ровно те коды,
|
|
953
|
+
которые ручка статуса подписки и отдаёт. Всё прочее остаётся ГРОМКИМ, и это
|
|
954
|
+
разобрано двумя ревью: на этом пути 403 и 402 приходят от чужого (прокси), текст
|
|
955
|
+
им `http.ts` сочиняет из кода состояния, и вежливое «у ключа нет прав, ключ выдаёт
|
|
956
|
+
бот» уговорило бы платящего перевыпустить ключ и погасить свою же работающую
|
|
957
|
+
машину. С 404 счёт тот же: он здесь уже был и ломал монтаж всем, включая
|
|
958
|
+
платящих, — вежливое «подписка не активна» спрятало бы это от нас.
|
|
959
|
+
Наверх по-прежнему летит и то, что словами не является (`TypeError` и подобное).
|
|
960
|
+
Заодно закрылся 429 нашего же
|
|
961
|
+
заслона частоты — он приезжал `NaparnikClientError` и получал ту же рамку на
|
|
962
|
+
пути, который клиент проходит перед каждым монтажом; теперь человек читает,
|
|
963
|
+
сколько ждать и что повторить. Работу при этом заслон НЕ пускает: сервер отвечает
|
|
964
|
+
429, а не 500, именно потому, что пятисотый расширение считает нашей аварией и
|
|
965
|
+
монтаж запускает, — то есть пропуск по 429 обходился бы тем самым перебором,
|
|
966
|
+
ради которого заслон и поставлен.
|
|
967
|
+
|
|
968
|
+
**Ключ больше не ищут в панели, которой нет.** Тексты про ключ уводили человека
|
|
969
|
+
в настройки компании — остаток монолита; у этого продукта ключ выдаёт
|
|
970
|
+
телеграм-бот после оплаты. Копий было четыре: `config.ts` (ключа нет, ключ битый)
|
|
971
|
+
и `http.ts` (запасные тексты 401 и 403), — верной ни одной, а сторож стоял на
|
|
972
|
+
пятом файле, инструкциях модели, где текст как раз был верный. Шестая копия
|
|
973
|
+
нашлась ревью в `README.md`, а он уезжает на страницу пакета в npm. Теперь адрес
|
|
974
|
+
бота живёт в одном файле `src/key-source.ts`, остальные его зовут, а
|
|
975
|
+
`tools/repo/key-source.test.ts` запрещает слова той панели во всём, что уезжает
|
|
976
|
+
покупателю, и второй экземпляр адреса. Инструкции модели при этом бота
|
|
977
|
+
НАЗЫВАЮТ: раньше там стояло «открыть бота» без адреса, и модель не могла
|
|
978
|
+
договорить имя чата за нас.
|
|
979
|
+
|
|
980
|
+
## 0.6.3 — 2026-09-09. Форма аргументов написана один раз, на zod
|
|
981
|
+
|
|
982
|
+
**Схема аргументов каждого инструмента стала одной записью.** Раньше их было
|
|
983
|
+
две: JSON Schema рядом с инструментом (её читает модель) и разбор той же схемы
|
|
984
|
+
руками в `arg-check.ts`. Обе были верны по отдельности и разойтись могли только
|
|
985
|
+
молча — схема обещает модели одно, проверка требует другого, а узнаёт об этом
|
|
986
|
+
человек: отказом на то, что ему разрешили, или опиской, уехавшей внутрь платной
|
|
987
|
+
операции. Теперь схема пишется на zod, а объявление для модели ВЫВОДИТСЯ из неё
|
|
988
|
+
(`src/tool-args.ts`, `defineTool`). Расхождение стало невозможным по построению;
|
|
989
|
+
`tool-declaration.test.ts` утверждает это для каждого инструмента поставки, а
|
|
990
|
+
`tool-args.test.ts` — что новое поле схемы само появляется в объявлении и само
|
|
991
|
+
начинает проверяться. Класс-чтец из `engine-tools.ts` и файл `arg-check.ts`
|
|
992
|
+
убраны.
|
|
993
|
+
|
|
994
|
+
**Форма выбора из 0.6.2 прошла через ту же дверь.** `choose_variant` был объявлен
|
|
995
|
+
руками — аргументов у него нет, и так было короче. Теперь он объявлен тем же
|
|
996
|
+
`defineTool` с пустой схемой: иначе он остался бы единственной полкой поставки
|
|
997
|
+
мимо заслона аргументов, а заслон появился ровно после того, как «мимо» однажды
|
|
998
|
+
оказалось платной операцией. Виджет проходит `defineTool` полем `ui`.
|
|
999
|
+
|
|
1000
|
+
**Одно поведение при этом изменилось, и в сторону строгости.** Внутренний чтец
|
|
1001
|
+
превращал `at: "12"` в число молча, а внешняя сверка такой вызов отвергала.
|
|
1002
|
+
Клиент ходит через внешнюю — значит человек и раньше видел отказ, и теперь его
|
|
1003
|
+
видят оба пути. Терпимость к `null` и пустой строке в необязательном аргументе
|
|
1004
|
+
сохранена: модель регулярно присылает их вместо «не указано».
|
|
1005
|
+
|
|
1006
|
+
**Библиотека одна, но четвёртой версии.** Вывод JSON Schema из схемы умеет сама
|
|
1007
|
+
zod (`z.toJSONSchema`), и только в четвёртой версии; пакет `zod@3.25` отдаёт её
|
|
1008
|
+
подпутём `zod/v4`, ставить ничего не пришлось. На него переведены ВСЕ места
|
|
1009
|
+
пакета — две копии библиотеки в бандле стоили бы 726 КБ вместо 398 КБ. Бандл
|
|
1010
|
+
вырос с 374 КБ до 648 КБ при потолке 2 МБ (`bundle-purity.test.ts`): это цена
|
|
1011
|
+
того, что схему выводит библиотека, а не наша функция по её приватным
|
|
1012
|
+
внутренностям. Заодно убрана мёртвая `ToolSchema` из `src/protocol/tool.ts` —
|
|
1013
|
+
схема «для динамической загрузки плагинов», которых у нас нет.
|
|
1014
|
+
|
|
1015
|
+
**Заодно закрыты три дыры, которые нашли ревьюеры.** Вызов, в котором вместо
|
|
1016
|
+
объекта аргументов приехала строка или число, раньше превращался в пустой объект
|
|
1017
|
+
и проходил у инструментов без обязательных полей — теперь это отказ словами. Пак
|
|
1018
|
+
с возможностью по имени `video` снимал обязательность нашего `video` (`.extend` в
|
|
1019
|
+
zod перекрывает, а не дополняет), и `montage` пускал вызов без пути к файлу, а
|
|
1020
|
+
тело падало наружу `TypeError`; занятое имя теперь пропускается. Виджет формы
|
|
1021
|
+
выбора рисует только вшитые `data:`-картинки — когда в карточки поедут настоящие
|
|
1022
|
+
кадры, за внешний адрес он не полезет по построению.
|
|
1023
|
+
|
|
1024
|
+
**Мелкие расхождения кода с самим собой закрыты.** Версия портативного питона
|
|
1025
|
+
читалась из `python-sources.json` по несуществующему ключу — человеку в согласии
|
|
1026
|
+
на скачивание предлагали «портативный Python (24 МБ)» с дырой вместо номера.
|
|
1027
|
+
Справка установщика обещала `--версия`, а понимал он `--version`: теперь оба
|
|
1028
|
+
берутся из одного списка (`src/installer-args.ts`), и разойтись им нечем. Из
|
|
1029
|
+
текста запроса ключа убраны лента рилсов, распаковка бренда и генерация — этих
|
|
1030
|
+
инструментов нет с 2026-09-02.
|
|
1031
|
+
|
|
1032
|
+
**Ложное обещание в описании расширения теперь сторожится.** В окне «установить
|
|
1033
|
+
расширение» стояли рилсы, распаковка бренда и генерация; человек ставил
|
|
1034
|
+
расширение за то, чего в нём нет, и первым вопросом было «где рилсы». Сам текст
|
|
1035
|
+
владелец переписал в 0.6.2, а здесь появился сторож
|
|
1036
|
+
`tools/repo/mcpb-description.test.ts`: он привязан к живому списку инструментов,
|
|
1037
|
+
а не к списку слов, и замолчит сам, если полка данных однажды вернётся.
|
|
1038
|
+
|
|
1039
|
+
## 0.6.2 — 2026-09-09. Пробная форма выбора в ленте: карточки вместо вопроса словами
|
|
1040
|
+
|
|
1041
|
+
Инструмент `choose_variant` показывает три карточки с образцами раскладок
|
|
1042
|
+
субтитров (по центру, лесенка, караоке), и человек выбирает тыком прямо в
|
|
1043
|
+
ленте Claude Desktop. Это MCP Apps: протокол оболочки научился ресурсам
|
|
1044
|
+
(`resources/list`, `resources/read`, `resources` в возможностях — только когда
|
|
1045
|
+
ресурсы есть), а инструмент несёт `_meta.ui.resourceUri`. Виджет — HTML строкой
|
|
1046
|
+
внутри бандла, без зависимостей; картинки вшиты `data:`-адресом.
|
|
1047
|
+
|
|
1048
|
+
⚠ Пробный шаг: примеры нарисованы, а не сняты с ролика человека, и выбор в
|
|
1049
|
+
монтаж ещё не передаётся — описание инструмента говорит модели об этом
|
|
1050
|
+
прямо. Цель — проверить руками, что Claude Desktop рисует форму нашего
|
|
1051
|
+
расширения и клик доходит до модели, до того как строить в движке выпечку
|
|
1052
|
+
образцов на кадре клиента.
|
|
1053
|
+
|
|
1054
|
+
## 0.6.1 — 2026-09-09. Адрес сервера по умолчанию — naparnik.ai; указатель начинки — с того же хоста
|
|
1055
|
+
|
|
1056
|
+
Умолчание `https://company.naparnik.ai` было остатком монолита: хост не отвечает,
|
|
1057
|
+
проверка подписки падала сетевой ошибкой, а оболочка в этом случае пускает
|
|
1058
|
+
монтаж «с предупреждением» — то есть подписка у покупателя не проверялась. Теперь
|
|
1059
|
+
умолчание `https://naparnik.ai` (сторож сверяет с `PRODUCT_HOST` сервера), адрес
|
|
1060
|
+
указателя начинки выводится из адреса сервера (`manifestUrlFor`), `baseUrl`
|
|
1061
|
+
обязателен у сборщиков инструментов — решение об адресе принимает только
|
|
1062
|
+
`cli.ts`. На Windows `reg.exe` зовётся полным путём. Версия поднята с 0.6.0,
|
|
1063
|
+
который в раздачу не выкладывался: правило «правишь исходники — поднимай
|
|
1064
|
+
версию» сторожит `tools/repo/shell-version.test.ts`.
|
|
1065
|
+
|
|
1066
|
+
## 0.6.0 — 2026-09-08. Оболочка называет серверу машину
|
|
1067
|
+
|
|
1068
|
+
**Появился заголовок `x-machine-fingerprint`.** Вопрос о подписке уходит с
|
|
1069
|
+
отпечатком той машины, на которой работает оболочка. Сервер ждал его с самого
|
|
1070
|
+
начала и по нему привязывает ключ к первому компьютеру, а оболочка не слала —
|
|
1071
|
+
привязка не работала ни у кого и молча: заголовка нет, значит сервер пускает.
|
|
1072
|
+
Ключ монтажа — строка, и её можно переслать другу; теперь пересылка видна.
|
|
1073
|
+
|
|
1074
|
+
Машину опознать удаётся не всегда — на урезанном компьютере команду не
|
|
1075
|
+
запустить и в домашнюю папку не записать. Тогда запрос уходит без заголовка,
|
|
1076
|
+
как раньше: наша беда не должна выглядеть как «вы не оплатили».
|
|
1077
|
+
|
|
1078
|
+
**Рецепт отпечатка переехал с сервера.** `src/machine/` — счёт (`machine.ts`,
|
|
1079
|
+
`signals.ts`, `node-probe.ts`) и вид (`fingerprint.ts`). Считать отпечаток может
|
|
1080
|
+
только та сторона, у которой есть машина; серверу остались вид и хеш.
|
|
1081
|
+
`fingerprint.ts` лежит копией по обе стороны и обязан совпадать побайтово — за
|
|
1082
|
+
этим смотрит `tools/repo/mcp-contract.test.ts`, он же сверяет имя заголовка.
|
|
1083
|
+
|
|
1084
|
+
**Почему 0.6.0, а не 0.5.2.** Ровно столько требует начинка:
|
|
1085
|
+
`client/engine/version.json`, поле `минимальная_оболочка`. Расхождение стояло с
|
|
1086
|
+
2026-09-07 — обновление, собранное из этих исходников, оболочка `0.5.1` ставить
|
|
1087
|
+
отказалась бы.
|
|
1088
|
+
|
|
1089
|
+
⚠ **Покупателям это приедет только с новым `.mcpb`.** Оболочка сама себя не
|
|
1090
|
+
обновляет: она ставится один раз руками. Пока в раздаче лежит файл, собранный
|
|
1091
|
+
2026-09-07, у людей остаётся `0.5.1` — без заголовка и с несовпадающим замком.
|
|
1092
|
+
Файл собирается руками (целей `make` и задачи CI на сборку `.mcpb` нет).
|
|
1093
|
+
|
|
1094
|
+
**Попутно починена заглушка без ключа.** Она отвечала на `post`, а инструменты
|
|
1095
|
+
зовут `postMontage`: без ключа человек получал сырой TypeError вместо «впишите
|
|
1096
|
+
ключ». Сборка клиента вынесена в `src/api-client.ts`, имя метода держит тип
|
|
1097
|
+
`Pick`, проводка отпечатка и текст заглушки проверяются `api-client.test.ts`.
|
|
1098
|
+
Нашёл ревьюер архитектуры 2026-09-08. Ревьюер безопасности: на Windows `reg`
|
|
1099
|
+
зовётся полным путём `%SystemRoot%\System32\reg.exe` — короткое имя без
|
|
1100
|
+
оболочки ищется сначала в текущем каталоге, который задаём не мы.
|
|
1101
|
+
|
|
1102
|
+
## Не выпущено — переезд в репозиторий «Монтаж через Claude или ChatGPT»
|
|
1103
|
+
|
|
1104
|
+
Пакет уехал из монолита AiNaparnik (`new-version/shared/mcp`) в свой
|
|
1105
|
+
репозиторий (`mcp/`). Версия не поднята намеренно: у клиентов не изменилось
|
|
1106
|
+
ничего — ни одного публичного имени, ни одного адреса, ни одного поля в сети.
|
|
1107
|
+
|
|
1108
|
+
**Отрезаны обе приватные зависимости.** `@naparnik/super-agent-core/mcp` и
|
|
1109
|
+
`@naparnik/api-contracts` в npm не публиковались и вшивались в бандл хаком
|
|
1110
|
+
`noExternal` — иначе установка у клиента падала бы на 404 при первом же `npx`.
|
|
1111
|
+
Теперь:
|
|
1112
|
+
|
|
1113
|
+
- `src/protocol/` — протокол MCP: разбор JSON-RPC, серверный транспорт поверх
|
|
1114
|
+
stdin/stdout, контракт инструмента. 1771 строка из ядра. Клиентская сторона
|
|
1115
|
+
MCP (клиент, менеджер пула, OAuth, транспорты http/sse — 2339 строк) НЕ
|
|
1116
|
+
переехала: наш процесс сам является сервером и ни к кому не подключается;
|
|
1117
|
+
- `src/contracts/` — копия контрактов границы. Почему копия, а не общий модуль
|
|
1118
|
+
с сервером, разобрано в шапке `src/contracts/index.ts`; за расхождением
|
|
1119
|
+
следит `tests/repo/mcp-contract.test.ts` в корне репозитория;
|
|
1120
|
+
- единственная чужая зависимость пакета — `zod`, и она ВШИВАЕТСЯ в бандл, а не
|
|
1121
|
+
остаётся внешней. Расширение для Claude Desktop собирается из одних
|
|
1122
|
+
`dist/*.js`: `node_modules` внутри `.mcpb` нет и подтянуть их неоткуда, так
|
|
1123
|
+
что внешний импорт упал бы у клиента с «Cannot find module 'zod'» — при
|
|
1124
|
+
зелёных сборке, тестах и `npx` у нас. Держат его в бандле две вещи сразу:
|
|
1125
|
+
`zod` лежит в `devDependencies` и `noExternal: ['zod']` в `tsup.config.ts`;
|
|
1126
|
+
снятие любой одной ничего не ломает, снятие обеих ломает всех. Сторожит
|
|
1127
|
+
результат `src/bundle-purity.test.ts`.
|
|
1128
|
+
|
|
1129
|
+
**Имена в коде переписаны на латиницу.** Правило №0 репозитория. Русскими
|
|
1130
|
+
остались комментарии, тексты для людей и ключи чужих форматов — манифест
|
|
1131
|
+
обновления (`версия`, `url`, `sha256`, `байт`, `минимальная_оболочка`), паспорт
|
|
1132
|
+
пака (`имя`, `вход`, `этапы`, `модели`, `возможности`…), таблица питона
|
|
1133
|
+
(`база`, `платформы`, `хвост`, `мб`), пак фирменного стиля и аргументы движка.
|
|
1134
|
+
Их читают уже установленные расширения и питон движка; в коде они записаны
|
|
1135
|
+
строками: `manifest['версия']`, а не полем. Файлы тоже переименованы:
|
|
1136
|
+
`src/движок.ts` → `src/engine.ts`, `src/обновление.ts` → `src/update.ts` и так
|
|
1137
|
+
далее.
|
|
1138
|
+
|
|
1139
|
+
**Сборка и выкладка приехали 2026-09-09.** `.mcpb` и архив движка собираются из
|
|
1140
|
+
репозитория (`make delivery` → `tools/delivery/`), сторож поставки читает готовые
|
|
1141
|
+
архивы, а на серверы их кладёт выкат (`server/docker/publish-delivery.sh`,
|
|
1142
|
+
задача CI `build:delivery`). Что из этого следует:
|
|
1143
|
+
|
|
1144
|
+
- список маркеров `src/bundle-purity.test.ts` больше не лежит копией в тесте: он
|
|
1145
|
+
читается из свода поставки `client/engine/delivery.json` — одного на всех трёх
|
|
1146
|
+
сторожей;
|
|
1147
|
+
- проверка по запрещённым отпечаткам вернулась, но живёт в
|
|
1148
|
+
`tools/delivery/guard.ts`: она смотрит на СОБРАННЫЙ архив, а не на `dist`;
|
|
1149
|
+
- умолчание адреса сервера в `src/config.ts` теперь `https://naparnik.ai` вместо
|
|
1150
|
+
остатка монолита `https://company.naparnik.ai` (тот хост не отвечает вовсе), и
|
|
1151
|
+
указатель начинки спрашивается на том же хосте, что и API.
|
|
1152
|
+
|
|
1153
|
+
**Чего по-прежнему нет.** `src/version.ts` правится руками, а не собирается;
|
|
1154
|
+
свежесть сторожит `src/version.test.ts`. Проверки «приватные пакеты вшиты» в
|
|
1155
|
+
`src/bundle-purity.test.ts` нет и не будет: вшивать из монолита нечего. `npm
|
|
1156
|
+
publish` из конвейера тоже нет — публикация пакета ручная, и это решение.
|
|
1157
|
+
|
|
1158
|
+
## 0.5.0 — видео в канале: одна модель, Seedance через OpenRouter
|
|
1159
|
+
|
|
1160
|
+
Требование владельца дословно: «через mcp оставь только seedance и чтоб он
|
|
1161
|
+
работал только через openrouter». Сузился ТОЛЬКО внешний канал — Видео-студия в
|
|
1162
|
+
вебе продолжает снимать всеми моделями, ядро генерации осталось мультимодельным.
|
|
1163
|
+
|
|
1164
|
+
**Что изменилось в объявлении `generate_video`.** Из описания ушли
|
|
1165
|
+
`gemini-omni-flash-preview` и `kling-o1`; осталась одна модель —
|
|
1166
|
+
`seedance-2.0-openrouter`. Вместе с ними пропали два параметра:
|
|
1167
|
+
|
|
1168
|
+
- `input_video` — правки готового клипа во внешнем канале больше нет. Это делал
|
|
1169
|
+
Gemini; переносить её некуда, и подменять правку генерацией похожего с нуля
|
|
1170
|
+
запрещено прямым текстом отказа: это другая работа, о ней надо сказать
|
|
1171
|
+
человеку, а не сделать молча;
|
|
1172
|
+
- `keep_original_sound` — он имел смысл только при входном клипе.
|
|
1173
|
+
|
|
1174
|
+
**Что НЕ потерялось.** Переход между первым и последним кадром (за него держали
|
|
1175
|
+
Kling O1) Seedance 2.0 делает сама: приложите те же две картинки в `image_refs`.
|
|
1176
|
+
Три и больше картинок — пересборка сцены из деталей. Потолок картинок 9.
|
|
1177
|
+
|
|
1178
|
+
**Старым сборкам ничего не сломает молча.** Сервер отвечает на снятую модель
|
|
1179
|
+
персональным объяснением, что стало с ОПЕРАЦИЕЙ, а не «недоступна, возьмите
|
|
1180
|
+
другую»: иначе на том конце решат, что ошиблись в имени, и начнут перебирать
|
|
1181
|
+
варианты. `seedance-2.0` (тот же ByteDance, но через fal и по другой цене)
|
|
1182
|
+
объясняется отдельно — он остался Видео-студии, а в канале передавать надо
|
|
1183
|
+
`seedance-2.0-openrouter`.
|
|
1184
|
+
|
|
1185
|
+
**Деньги.** Ставка у OpenRouter своя (за токены кадра, а не за секунду),
|
|
1186
|
+
поэтому у канала отдельная тарифная строка. Списывается ФАКТ, который называет
|
|
1187
|
+
провайдер, а табличная ставка работает верхней оценкой до генерации: сверх
|
|
1188
|
+
показанной суммы не спишется, даже если провайдер выставил больше.
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
## 0.4.0 — поставка: бандл, установщик, обновления, сторож
|
|
1192
|
+
|
|
1193
|
+
### Разбор находок ревью (после первой сборки 0.4.0)
|
|
1194
|
+
|
|
1195
|
+
**Первая установка на чистой машине.** Стоял тупик из двух витков: движок ставил
|
|
1196
|
+
установщик, которому нужен установленный движок, а портативный питон — шаг,
|
|
1197
|
+
которому нужен питон. На Windows, где питона из коробки нет ни у кого, это
|
|
1198
|
+
означало, что продукт не запускается вовсе, при том что манифест расширения
|
|
1199
|
+
обещает «движок расширение доставит само». Оболочка теперь умеет первую
|
|
1200
|
+
доставку сама (`src/доставка.ts`, `src/первая-установка.ts`): свой разбор
|
|
1201
|
+
`tar.gz` на `node:zlib` + `node:crypto`, сверка sha256, отказ на выход за
|
|
1202
|
+
пределы папки. Таблица источников питона стала общей на два языка —
|
|
1203
|
+
`engine/источники-python.json`.
|
|
1204
|
+
|
|
1205
|
+
**Кириллица в адресах раздачи.** `urllib` в питоне не кодирует путь в
|
|
1206
|
+
percent-encoding сам и падает `UnicodeEncodeError` ДО сети, а это `ValueError` —
|
|
1207
|
+
мимо всех наших `except`. Манифест при этом приезжал (его качает Node, который
|
|
1208
|
+
путь кодирует), а архив не скачивался никогда. Адреса и имена файлов раздачи
|
|
1209
|
+
теперь только латиница (`/download/engine/engine-<версия>.tar.gz`,
|
|
1210
|
+
`manifest.json`), плюс заслон у самой сети в питоне.
|
|
1211
|
+
|
|
1212
|
+
**Манифест обновления проверяется по значениям, а не только по типам.** Пустая
|
|
1213
|
+
`sha256` и нулевой `байт` проезжали как годные и молча выключали обе гарантии
|
|
1214
|
+
целостности. Имя версии подставлялось в путь распаковки без проверки — а питон
|
|
1215
|
+
перед распаковкой сносит целевую папку. Адрес архива не был ограничен ни
|
|
1216
|
+
схемой, ни хостом. Всё это закрыто в `годенМанифест`.
|
|
1217
|
+
|
|
1218
|
+
**Уборка и улика больше не роняют то, ради чего заведены.** `прибратьСтарые`
|
|
1219
|
+
после удавшегося обновления и сохранение не запустившейся сборки стояли голыми:
|
|
1220
|
+
первый же занятый файл превращал успех в «Внутренняя ошибка выполнения», и
|
|
1221
|
+
человек логично откатывал исправную версию.
|
|
1222
|
+
|
|
1223
|
+
**Фоновая работа переживает уход программы.** stderr фоновой задачи уходит в
|
|
1224
|
+
файл, а не в трубу к нам: с трубой первая же запись распознавания после закрытия
|
|
1225
|
+
Claude Desktop убивала монтаж `BrokenPipeError`.
|
|
1226
|
+
|
|
1227
|
+
**Лицензии.** Сборщик вкладывает `zod` (MIT) прямо в `dist/`, то есть мы его
|
|
1228
|
+
распространяем. Рядом с `LICENSE.md` теперь едет `THIRD-PARTY.md`, а полнота
|
|
1229
|
+
списка сверяется с собранным артефактом тестом.
|
|
1230
|
+
|
|
1231
|
+
**Прочее:** сверка аргументов одна на обе полки (описка `image_paths: "кот.png"`
|
|
1232
|
+
больше не уходит внутрь платной операции); чужие `PYTHONHOME`/`PYTHONPATH` и
|
|
1233
|
+
ключ Напарника не передаются питону; установщик Codex понимает BOM и вторую
|
|
1234
|
+
форму записи `[mcp_servers]`, чистит старые копии конфига и отказывается писать
|
|
1235
|
+
путь из кэша `npx`; сервер представляется своим именем; служебные двойники
|
|
1236
|
+
macOS `._имя` не едут в архив, а сторож смотрит на архив своим разбором — тем
|
|
1237
|
+
же, каким его прочтёт клиент.
|
|
1238
|
+
|
|
1239
|
+
### Расширение для Claude Desktop (.mcpb)
|
|
1240
|
+
|
|
1241
|
+
Ставится перетаскиванием файла, без консоли и конфигов. Внутри только оболочка:
|
|
1242
|
+
манифест, значок и собранный сервер — 120 КБ, шесть файлов, ноль зависимостей.
|
|
1243
|
+
Ключ вводится в поле настроек расширения и уходит в хранилище системы.
|
|
1244
|
+
|
|
1245
|
+
Поле ключа **необязательное**: с `required: true` человек без подписки не смог
|
|
1246
|
+
бы завершить установку, то есть мы отрезали бы бесплатный монтаж. Запуск —
|
|
1247
|
+
`node …/server/cli.js`, а не `npx`: на Windows `npx.cmd` не запускается из Node
|
|
1248
|
+
после CVE-2024-27980.
|
|
1249
|
+
|
|
1250
|
+
Сборка: `make mcpb-build`.
|
|
1251
|
+
|
|
1252
|
+
### Установщик для Codex
|
|
1253
|
+
|
|
1254
|
+
`naparnik-mcp --установить codex` (после `npm i -g @naparnik/mcp`) правит
|
|
1255
|
+
`~/.codex/config.toml` сам.
|
|
1256
|
+
Файл общий для приложения ChatGPT, консоли и расширения в редакторе, поэтому
|
|
1257
|
+
установщик не разбирает TOML целиком: заменяется ровно наш блок, остальное
|
|
1258
|
+
остаётся побайтово тем же. Чужой блок с нашим именем не трогается. Перед
|
|
1259
|
+
записью — копия, запись атомарна, повторный прогон даёт тот же файл побайтово.
|
|
1260
|
+
|
|
1261
|
+
Появился разбор аргументов: `--установить`, `--удалить`, `--версия`, `--откат`.
|
|
1262
|
+
Без аргументов это по-прежнему сервер, который **не пишет в stdout ни байта** до
|
|
1263
|
+
первого JSON-RPC.
|
|
1264
|
+
|
|
1265
|
+
### Обновление начинки
|
|
1266
|
+
|
|
1267
|
+
Оболочка ставится один раз, движок монтажа обновляется сам: версионные папки
|
|
1268
|
+
`~/.naparnik/движок/<версия>`, указатель — текстовый файл (не симлинк: на
|
|
1269
|
+
Windows он требует прав). На старте только запрос манифеста с потолком 2 секунды
|
|
1270
|
+
и не чаще раза в 6 часов, параллельно с чтением паспорта пака. Скачивание —
|
|
1271
|
+
`update_engine` с согласия человека, через уже написанную докачку питона.
|
|
1272
|
+
Переключение — только после дымового прогона новой сборки; не запустилась —
|
|
1273
|
+
остаётся прежняя, а сборка сохраняется уликой. Откат — `engine_rollback` или
|
|
1274
|
+
`--откат`. Живой процесс остаётся на своей версии до перезапуска.
|
|
1275
|
+
|
|
1276
|
+
Новые инструменты: `update_engine`, `engine_rollback` (всего 31).
|
|
1277
|
+
|
|
1278
|
+
### Лицензионный сторож сборки
|
|
1279
|
+
|
|
1280
|
+
`scripts/сторож-поставки.ts` проверяет **внутренность собранного архива** —
|
|
1281
|
+
`.mcpb`, npm-тарбола и архива начинки — и падает с ненулевым кодом. Белый список
|
|
1282
|
+
расширений, отпечатки sha256 (ловят переименованный шрифт и `brand/style.json`
|
|
1283
|
+
под разрешённым `.json`) и маркеры внутри текста. Списки — в
|
|
1284
|
+
`ai-editor-lab/engine/поставка.json`, тот же файл читает питоновский тест
|
|
1285
|
+
поставки; отпечатки — в `ai-editor-lab/запрещённые-отпечатки.json`.
|
|
1286
|
+
|
|
1287
|
+
### Исправлено
|
|
1288
|
+
|
|
1289
|
+
* версия жила в двух местах и разошлась: `package.json` 0.3.0 против
|
|
1290
|
+
`User-Agent: naparnik-mcp/0.1`. Теперь `src/версия.ts` собирается из
|
|
1291
|
+
`package.json`, свежесть сторожит тест;
|
|
1292
|
+
* пустой `NAPARNIK_HOME` (так Claude Desktop подставляет незаполненное поле)
|
|
1293
|
+
уводил питон и оболочку в разные дома;
|
|
1294
|
+
* отсутствующая папка пака роняла любую команду в `spawn python3 ENOENT` —
|
|
1295
|
+
диагноз «нет питона» про машину, где питон есть;
|
|
1296
|
+
* `update_engine` при заданном вручную `NAPARNIK_ENGINE` отчитался бы об успехе,
|
|
1297
|
+
не изменив ничего: обновление работает только с версионной раскладкой. Теперь
|
|
1298
|
+
отказывает словами.
|
|
1299
|
+
|
|
1300
|
+
### Про зеркало тяжёлых зависимостей
|
|
1301
|
+
|
|
1302
|
+
Движок умеет качать с нашего зеркала, а первоисточник оставлен запасным. Два
|
|
1303
|
+
правила зашиты в код: зеркало не используется, если оно менее проверяемо, чем
|
|
1304
|
+
первоисточник; **GPL-сборки ffmpeg с зеркала не раздаются**, пока рядом не
|
|
1305
|
+
выложены исходники — ссылка на апстрим распространением не является, наш сервер
|
|
1306
|
+
является. Адреса — заглушки, публикует владелец.
|
|
1307
|
+
|
|
1308
|
+
## 0.3.0 — монтаж переехал сюда
|
|
1309
|
+
|
|
1310
|
+
### ⚠ Ломающее
|
|
1311
|
+
|
|
1312
|
+
- **`check_local_setup` удалён.** Он был ВТОРОЙ копией проверки окружения:
|
|
1313
|
+
запускал `--version` и на этом основании отвечал «всё хорошо». Настоящая
|
|
1314
|
+
проверка — `check_setup`: умеет ли ffmpeg нужные фильтры (`overlay`,
|
|
1315
|
+
`silencedetect`, `atempo`, `concat`, `libx264`), поднимаются ли библиотеки
|
|
1316
|
+
пака, какой движок распознавания выберется именно на этой машине, скачаны ли
|
|
1317
|
+
веса модели. Две копии уже расходились: на Mac с процессором Apple ставился
|
|
1318
|
+
`mlx-whisper`, а меньшая копия искала `faster_whisper` и говорила «✗» на
|
|
1319
|
+
полностью исправной машине.
|
|
1320
|
+
|
|
1321
|
+
Замена: `check_local_setup` → `check_setup`.
|
|
1322
|
+
|
|
1323
|
+
- Из публичного API пакета убраны `checkLocalSetup`, `formatSetupReport`,
|
|
1324
|
+
`REQUIREMENTS`. Список нужного знают движок (`engine/окружение.py`) и паспорт
|
|
1325
|
+
пака, а не TypeScript.
|
|
1326
|
+
|
|
1327
|
+
### Добавлено
|
|
1328
|
+
|
|
1329
|
+
- **Одиннадцать инструментов монтажа** на той же связи: `check_setup`,
|
|
1330
|
+
`install_engine`, `montage`, `cut_pauses`, `montage_job`, `montage_jobs`,
|
|
1331
|
+
`inspect_video`, `preview`, `style_new`, `style_use`, `style_check`.
|
|
1332
|
+
Считает машина пользователя, к нам не уходит ничего, **ключ им не нужен**.
|
|
1333
|
+
- Третье состояние инструкции для модели: ключа нет, но монтаж доступен
|
|
1334
|
+
полностью. Раньше модель говорила «интеграция не настроена, инструменты не
|
|
1335
|
+
работают» — теперь это сказано только про первую полку.
|
|
1336
|
+
- Переменные `NAPARNIK_HOME`, `NAPARNIK_ENGINE`, `NAPARNIK_PACK`.
|
|
1337
|
+
|
|
1338
|
+
### Исправлено
|
|
1339
|
+
|
|
1340
|
+
- Пустая `NAPARNIK_HOME` больше не означает «текущая папка процесса». Поле
|
|
1341
|
+
настроек расширения, оставленное незаполненным, приезжает пустой строкой, и
|
|
1342
|
+
прочитанная как путь она развела бы оболочку и движок по разным домам:
|
|
1343
|
+
задача заведена в одном, а ищется в другом. Та же правка сделана в
|
|
1344
|
+
`engine/дом.py`.
|