kingkont 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -82,3 +82,4 @@ npm install
82
82
  npm start # обычный dev-запуск Electron
83
83
  npm run dist # собрать .dmg (mac) / .exe (win) / .AppImage (linux)
84
84
  ```
85
+ # kingkont
package/index.html CHANGED
@@ -928,7 +928,7 @@
928
928
  <div class="brand">
929
929
  <img src="assets/logo-square.svg" alt="" draggable="false">
930
930
  <div style="min-width:0; flex:1;">
931
- <div class="title">King Kont · Chatium</div>
931
+ <div class="title">KingKont</div>
932
932
  <div class="sub" id="brandSub">Видео-редактор</div>
933
933
  <div class="board" id="brandBoard" style="display:none;"></div>
934
934
  </div>
@@ -965,7 +965,7 @@
965
965
  <div class="welcome" id="welcome">
966
966
  <div class="welcome-inner">
967
967
  <img class="welcome-logo" src="assets/logo-square.svg" alt="" draggable="false">
968
- <h1 class="welcome-title">King Kont · Chatium</h1>
968
+ <h1 class="welcome-title">KingKont</h1>
969
969
  <div class="welcome-sub">Видео-редактор</div>
970
970
  <button id="welcomeOpen" class="welcome-open primary">Открыть проект</button>
971
971
  <div class="welcome-recent" id="welcomeRecent" style="display:none;">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  "server": "node server.js",
29
29
  "pack": "electron-builder --dir",
30
30
  "dist": "electron-builder",
31
- "postinstall": "if [ \"$(uname)\" = \"Darwin\" ] && [ -d node_modules/electron ]; then bash scripts/patch-electron-name.sh || true; fi"
31
+ "postinstall": "node scripts/patch-electron-name.js"
32
32
  },
33
33
  "dependencies": {
34
34
  "electron": "^32.2.0"
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ // Переименовывает dev-Electron бандл в «KingKont» — в menubar macOS,
3
+ // Activity Monitor, Dock-tooltip и пр. Запускается через postinstall.
4
+ // Идемпотентно. Молча выходит если что-то не так — это не критическая
5
+ // часть установки.
6
+ 'use strict';
7
+ const fs = require('node:fs');
8
+ const path = require('node:path');
9
+ const { execFileSync } = require('node:child_process');
10
+
11
+ if (process.platform !== 'darwin') process.exit(0);
12
+
13
+ let electronExe;
14
+ try { electronExe = require('electron'); }
15
+ catch (e) {
16
+ console.warn('[kingkont postinstall] electron not found, skip rename:', e.message);
17
+ process.exit(0);
18
+ }
19
+ // require('electron') возвращает путь к бинарю. На macOS это:
20
+ // node_modules/electron/dist/Electron.app/Contents/MacOS/Electron
21
+ // Если уже переименовано — KingKont.app/Contents/MacOS/KingKont
22
+ const macOsDir = path.dirname(electronExe); // .../MacOS
23
+ const contentsDir = path.dirname(macOsDir); // .../Contents
24
+ const appBundle = path.dirname(contentsDir); // .../Electron.app или KingKont.app
25
+ const dist = path.dirname(appBundle); // .../dist
26
+ const electronPkg = path.dirname(dist); // .../electron
27
+
28
+ const oldApp = path.join(dist, 'Electron.app');
29
+ const newApp = path.join(dist, 'KingKont.app');
30
+
31
+ // Уже переименовано?
32
+ if (fs.existsSync(newApp) && !fs.existsSync(oldApp)) {
33
+ // Убедимся что иконка из нашего пакета актуальна (на случай обновления).
34
+ ensureIcon(newApp);
35
+ process.exit(0);
36
+ }
37
+ if (!fs.existsSync(oldApp)) {
38
+ console.warn('[kingkont postinstall] Electron.app not found at', oldApp);
39
+ process.exit(0);
40
+ }
41
+
42
+ console.log('[kingkont postinstall] Electron → KingKont…');
43
+
44
+ // 1) main bundle + бинарь
45
+ fs.renameSync(oldApp, newApp);
46
+ fs.renameSync(path.join(newApp, 'Contents', 'MacOS', 'Electron'),
47
+ path.join(newApp, 'Contents', 'MacOS', 'KingKont'));
48
+
49
+ // 2) Helpers
50
+ const fwDir = path.join(newApp, 'Contents', 'Frameworks');
51
+ const helpers = [
52
+ ['Electron Helper.app', 'KingKont Helper.app'],
53
+ ['Electron Helper (GPU).app', 'KingKont Helper (GPU).app'],
54
+ ['Electron Helper (Plugin).app', 'KingKont Helper (Plugin).app'],
55
+ ['Electron Helper (Renderer).app','KingKont Helper (Renderer).app'],
56
+ ];
57
+ for (const [oldH, newH] of helpers) {
58
+ const o = path.join(fwDir, oldH);
59
+ const n = path.join(fwDir, newH);
60
+ if (!fs.existsSync(o)) continue;
61
+ fs.renameSync(o, n);
62
+ const oldBin = oldH.replace(/\.app$/, '');
63
+ const newBin = newH.replace(/\.app$/, '');
64
+ fs.renameSync(path.join(n, 'Contents', 'MacOS', oldBin),
65
+ path.join(n, 'Contents', 'MacOS', newBin));
66
+ patchPlist(path.join(n, 'Contents', 'Info.plist'), {
67
+ CFBundleExecutable: newBin,
68
+ CFBundleName: newBin,
69
+ CFBundleDisplayName: newBin,
70
+ });
71
+ }
72
+
73
+ // 3) Info.plist главного app
74
+ patchPlist(path.join(newApp, 'Contents', 'Info.plist'), {
75
+ CFBundleExecutable: 'KingKont',
76
+ CFBundleName: 'KingKont',
77
+ CFBundleDisplayName: 'KingKont',
78
+ });
79
+
80
+ // 4) electron/path.txt — npm-обёртка читает его при require('electron')
81
+ fs.writeFileSync(path.join(electronPkg, 'path.txt'),
82
+ 'KingKont.app/Contents/MacOS/KingKont');
83
+
84
+ // 5) Иконка
85
+ ensureIcon(newApp);
86
+
87
+ // 6) Ad-hoc resign — без неё macOS Sequoia может убить процесс при старте.
88
+ try {
89
+ execFileSync('codesign', ['--force', '--deep', '--sign', '-', newApp], { stdio: 'ignore' });
90
+ } catch {}
91
+
92
+ // 7) Refresh LaunchServices
93
+ try {
94
+ execFileSync('/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister',
95
+ ['-f', newApp], { stdio: 'ignore' });
96
+ } catch {}
97
+
98
+ console.log('[kingkont postinstall] ✓ KingKont готов');
99
+
100
+ // === helpers ===
101
+
102
+ function patchPlist(plistPath, fields) {
103
+ if (!fs.existsSync(plistPath)) return;
104
+ for (const [k, v] of Object.entries(fields)) {
105
+ // Сначала Set; если ключа нет — Add.
106
+ try {
107
+ execFileSync('/usr/libexec/PlistBuddy', ['-c', `Set :${k} ${v}`, plistPath], { stdio: 'ignore' });
108
+ } catch {
109
+ try {
110
+ execFileSync('/usr/libexec/PlistBuddy', ['-c', `Add :${k} string ${v}`, plistPath], { stdio: 'ignore' });
111
+ } catch {}
112
+ }
113
+ }
114
+ }
115
+
116
+ function ensureIcon(bundle) {
117
+ // Этот скрипт лежит в <pkg>/scripts/, иконка в <pkg>/assets/logo.icns.
118
+ const src = path.join(__dirname, '..', 'assets', 'logo.icns');
119
+ const dst = path.join(bundle, 'Contents', 'Resources', 'electron.icns');
120
+ if (!fs.existsSync(src)) return;
121
+ try {
122
+ fs.copyFileSync(src, dst);
123
+ } catch {}
124
+ }