kingkont 0.7.47 → 0.7.49
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/package.json +1 -1
- package/renderer/board.js +22 -5
- package/skill/SKILL.md +93 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kingkont",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.49",
|
|
4
4
|
"description": "KingKont \u00b7 Chatium \u2014 \u043d\u043e\u0434-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u0446\u0435\u043d \u0441 AI-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438/\u0432\u0438\u0434\u0435\u043e/\u0433\u043e\u043b\u043e\u0441/SFX/\u043c\u0443\u0437\u044b\u043a\u0430/\u0442\u0435\u043a\u0441\u0442)",
|
|
5
5
|
"main": "main.js",
|
|
6
6
|
"bin": {
|
package/renderer/board.js
CHANGED
|
@@ -1136,14 +1136,19 @@ async function selectBoard(board) {
|
|
|
1136
1136
|
|
|
1137
1137
|
// =============================================================================
|
|
1138
1138
|
// External file watcher (FSAH polling).
|
|
1139
|
-
// FSAH не имеет нативного file-watch API — поллим scene.json's lastModified
|
|
1140
|
-
//
|
|
1141
|
-
//
|
|
1139
|
+
// FSAH не имеет нативного file-watch API — поллим scene.json's lastModified.
|
|
1140
|
+
// Если mtime новее чем lastDiskMtime (который мы обновляем при каждом своём
|
|
1141
|
+
// write) — кто-то правил scene.json извне.
|
|
1142
1142
|
// • dirty=false → тихо перечитать и перерендерить
|
|
1143
1143
|
// • dirty=true → confirm() «перечитать с диска? текущие правки утеряются»
|
|
1144
|
+
//
|
|
1145
|
+
// Интервал адаптивный: когда окно в фокусе — 300мс (юзер видит изменения
|
|
1146
|
+
// от skill/CLI почти моментально, прогрессивно: добавил ноду — увидел).
|
|
1147
|
+
// Когда вкладка скрыта — 3 сек (экономим CPU, юзер всё равно не смотрит).
|
|
1144
1148
|
// =============================================================================
|
|
1145
1149
|
|
|
1146
|
-
const
|
|
1150
|
+
const EXTERNAL_POLL_MS_ACTIVE = 300;
|
|
1151
|
+
const EXTERNAL_POLL_MS_HIDDEN = 3000;
|
|
1147
1152
|
let _externalWatchTimer = null;
|
|
1148
1153
|
let _externalReloadInFlight = false;
|
|
1149
1154
|
|
|
@@ -1158,11 +1163,23 @@ function stopExternalWatcher() {
|
|
|
1158
1163
|
if (_externalWatchTimer) { clearInterval(_externalWatchTimer); _externalWatchTimer = null; }
|
|
1159
1164
|
}
|
|
1160
1165
|
|
|
1166
|
+
function _currentPollInterval() {
|
|
1167
|
+
return document.hidden ? EXTERNAL_POLL_MS_HIDDEN : EXTERNAL_POLL_MS_ACTIVE;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1161
1170
|
function startExternalWatcher() {
|
|
1162
1171
|
stopExternalWatcher();
|
|
1163
|
-
_externalWatchTimer = setInterval(checkExternalChanges,
|
|
1172
|
+
_externalWatchTimer = setInterval(checkExternalChanges, _currentPollInterval());
|
|
1164
1173
|
}
|
|
1165
1174
|
|
|
1175
|
+
// При смене visibility пересоздаём timer с новым интервалом.
|
|
1176
|
+
document.addEventListener('visibilitychange', () => {
|
|
1177
|
+
if (_externalWatchTimer) {
|
|
1178
|
+
stopExternalWatcher();
|
|
1179
|
+
_externalWatchTimer = setInterval(checkExternalChanges, _currentPollInterval());
|
|
1180
|
+
}
|
|
1181
|
+
});
|
|
1182
|
+
|
|
1166
1183
|
async function checkExternalChanges() {
|
|
1167
1184
|
if (_externalReloadInFlight) return;
|
|
1168
1185
|
if (!state.currentBoard?.handle) { stopExternalWatcher(); return; }
|
package/skill/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kingkont
|
|
3
|
-
description: Use this skill when the user works with a KingKont project — a film/series scene editor where each scene is a folder with scene.json. Triggers — фразы вроде «открой/запусти kingkont», «открой редактор сцен», «добавь сцену/персонажа/локацию», «добавь ноду на холст», «сгенерируй картинку/видео/голос/SFX/музыку/текст», или работа с папкой содержащей _characters/ _locations/ <scene>/scene.json. Skill знает формат данных и использует CLI `kingkont <cmd>` (open/list/board/add-node/gen/connect/rm-node/upload/voices/balance) для управления нодами и запуска генераций — ключи берутся автоматически из настроек приложения. ВАЖНО: (1) каждая нода живёт в конкретной доске — если юзер не указал доску, СПРОСИ; не создавай новые сцены без явного запроса. (2) Перед генерацией image/video проверь scene.json → settings.aspectRatio; если поле отсутствует — СПРОСИ юзера под какой формат генерить (9:16/16:9/1:1/...), сохрани
|
|
3
|
+
description: Use this skill when the user works with a KingKont project — a film/series scene editor where each scene is a folder with scene.json. Triggers — фразы вроде «открой/запусти kingkont», «открой редактор сцен», «добавь сцену/персонажа/локацию», «добавь ноду на холст», «сгенерируй картинку/видео/голос/SFX/музыку/текст», или работа с папкой содержащей _characters/ _locations/ <scene>/scene.json. Skill знает формат данных и использует CLI `kingkont <cmd>` (open/list/board/add-node/gen/connect/rm-node/upload/voices/balance) для управления нодами и запуска генераций — ключи берутся автоматически из настроек приложения. ВАЖНО: (1) каждая нода живёт в конкретной доске — если юзер не указал доску, СПРОСИ; не создавай новые сцены без явного запроса. (2) Перед генерацией image/video проверь scene.json → settings.aspectRatio; если поле отсутствует — СПРОСИ юзера под какой формат генерить (9:16/16:9/1:1/...), сохрани выбор в scene.json как дефолт. (3) Для text-нод НЕ используй `kingkont gen --kind=text` — пиши текст сам в ответе, потом сохраняй через `kingkont add-node --kind=text --text="..."` (heredoc для многострочного). Для визуальной работы поднимает UI через `npx -y kingkont serve`.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# KingKont · Chatium — Skill
|
|
@@ -103,6 +103,86 @@ kingkont gen <project> 'Серия 1' --kind=image --prompt="..." --aspect-ratio
|
|
|
103
103
|
`settings.aspectRatio`, если он отличается от текущего и юзер явно сказал
|
|
104
104
|
«пусть в этой сцене будет такой формат» (или если поле было null).
|
|
105
105
|
|
|
106
|
+
## ⚠️ Text-ноды — генерируй САМ, не через `kingkont gen --kind=text`
|
|
107
|
+
|
|
108
|
+
Ты — Claude. Когда юзер просит «напиши диалог», «придумай реплику»,
|
|
109
|
+
«сделай сценарий», «текстовую ноду с описанием…» — **генерируй текст
|
|
110
|
+
прямо в ответе**, как обычный chat-output. **Не запускай**
|
|
111
|
+
`kingkont gen --kind=text` — это бессмысленный round-trip через
|
|
112
|
+
Chatium/OpenRouter (тратит кредиты юзера, медленнее, и качество
|
|
113
|
+
скорее всего хуже того что ты сгенерируешь сам).
|
|
114
|
+
|
|
115
|
+
После того как ты сгенерировал текст — **сохрани его в ноду** через
|
|
116
|
+
`kingkont add-node --kind=text` (с `--text="..."` или через heredoc для
|
|
117
|
+
многострочного контента):
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Однострочный текст:
|
|
121
|
+
kingkont add-node <project> <board> --kind=text --name=replica \
|
|
122
|
+
--text="— Ты опять опоздал."
|
|
123
|
+
|
|
124
|
+
# Многострочный — heredoc, чтобы не экранировать кавычки и переводы строк:
|
|
125
|
+
kingkont add-node <project> <board> --kind=text --name=script \
|
|
126
|
+
--text="$(cat <<'EOF'
|
|
127
|
+
СЦЕНА 1.
|
|
128
|
+
Полицейский участок. Поздний вечер.
|
|
129
|
+
|
|
130
|
+
— Где была между 8 и 11?
|
|
131
|
+
— У подруги. Можешь проверить.
|
|
132
|
+
— Уже проверили.
|
|
133
|
+
EOF
|
|
134
|
+
)"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
CLI создаст ноду и положит контент в `<board>/texts/<имя>_<id8>.md` с
|
|
138
|
+
правильным `n.file` указателем в `scene.json`.
|
|
139
|
+
|
|
140
|
+
### Когда `kingkont gen --kind=text` всё-таки нужен
|
|
141
|
+
|
|
142
|
+
Только если юзер **явно просит** использовать другую модель — например
|
|
143
|
+
«сгенерируй через Claude Sonnet 4 в KingKont» или «через Gemini».
|
|
144
|
+
В таких редких кейсах:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
kingkont gen <project> <board> --kind=text --name=name \
|
|
148
|
+
--prompt="..." --model=anthropic/claude-sonnet-4
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
В обычной просьбе «напиши X» — **пиши сам**.
|
|
152
|
+
|
|
153
|
+
## ⚠️ Изменения визуально — добавляй ноды по одной
|
|
154
|
+
|
|
155
|
+
Если открыто приложение KingKont, оно поллит `scene.json` каждые 300мс
|
|
156
|
+
и автоматически перерисовывает холст когда обнаруживает внешнюю правку.
|
|
157
|
+
Это значит **юзер видит каждую новую ноду как только ты её добавил**.
|
|
158
|
+
|
|
159
|
+
Поэтому когда нужно добавить несколько нод — **не батчи их в один скрипт**,
|
|
160
|
+
запускай `kingkont add-node` (или `gen`) по одной команде за раз. Между
|
|
161
|
+
командами юзер видит как ноды появляются прогрессивно.
|
|
162
|
+
|
|
163
|
+
✅ Хорошо (юзер видит появление каждой ноды):
|
|
164
|
+
```bash
|
|
165
|
+
kingkont add-node <project> <board> --kind=text --name=intro --text="..."
|
|
166
|
+
# (юзер видит ноду на холсте через ~300мс)
|
|
167
|
+
kingkont add-node <project> <board> --kind=text --name=dialog --text="..."
|
|
168
|
+
# (видит вторую)
|
|
169
|
+
kingkont add-node <project> <board> --kind=text --name=outro --text="..."
|
|
170
|
+
# (видит третью)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
❌ Плохо (юзер видит «бах» — все ноды одним кадром):
|
|
174
|
+
```bash
|
|
175
|
+
# Все три node'а пишутся в scene.json одним save'ом — на холсте они
|
|
176
|
+
# появятся одновременно.
|
|
177
|
+
kingkont add-node ... --kind=text --name=intro && \
|
|
178
|
+
kingkont add-node ... --kind=text --name=dialog && \
|
|
179
|
+
kingkont add-node ... --kind=text --name=outro
|
|
180
|
+
```
|
|
181
|
+
(Это технически работает, но менее «живое» ощущение.)
|
|
182
|
+
|
|
183
|
+
Для длинных операций (десяток+ нод) можно объединять — юзер не различит
|
|
184
|
+
батчи быстрее ~1 сек. Но от 3 до 5-7 нод — добавляй по одной.
|
|
185
|
+
|
|
106
186
|
## Как открыть UI редактора
|
|
107
187
|
|
|
108
188
|
```bash
|
|
@@ -342,9 +422,16 @@ kingkont gen <project> <board> --kind=video --prompt="..." \
|
|
|
342
422
|
kingkont gen <project> <board> --kind=video --prompt="..." \
|
|
343
423
|
--model=kling-3.0 --refs=@hero # i2v: ref → image_urls автоматически
|
|
344
424
|
|
|
345
|
-
#
|
|
346
|
-
|
|
347
|
-
|
|
425
|
+
# Текст: НЕ запускай `kingkont gen --kind=text` — пиши текст САМ в чате
|
|
426
|
+
# (ты Claude, генерация через приложение бессмысленный round-trip).
|
|
427
|
+
# Затем сохрани результат в ноду одной командой:
|
|
428
|
+
kingkont add-node <project> <board> --kind=text --name=script \
|
|
429
|
+
--text="$(cat <<'EOF'
|
|
430
|
+
Здесь полный текст, который ты сам сгенерировал в ответе юзеру.
|
|
431
|
+
Многострочный, с диалогами, ремарками — всё что нужно.
|
|
432
|
+
EOF
|
|
433
|
+
)"
|
|
434
|
+
# (см. отдельный раздел «Text-ноды — генерируй сам, не через CLI» ниже.)
|
|
348
435
|
|
|
349
436
|
# Голос (TTS):
|
|
350
437
|
kingkont gen <project> <board> --kind=audio --prompt="Привет, мир" \
|
|
@@ -467,10 +554,8 @@ kingkont gen <project> _characters/Анна --kind=image --name=sheet \
|
|
|
467
554
|
mkdir -p <project>/Финал
|
|
468
555
|
echo '{"nodes":[],"connections":[]}' > <project>/Финал/scene.json
|
|
469
556
|
```
|
|
470
|
-
После этого можно
|
|
471
|
-
|
|
472
|
-
kingkont gen <project> Финал --kind=text --name=script --prompt="..."
|
|
473
|
-
```
|
|
557
|
+
После этого можно генерить ноды (текст — пишешь сам, см. раздел ниже;
|
|
558
|
+
картинки/видео/аудио — через `kingkont gen`).
|
|
474
559
|
|
|
475
560
|
### Узкие сценарии
|
|
476
561
|
|