feat(npcs): add groups, storyline bindings, and Foundry import

Nested NPC groups with color, graph filter, and scene/storyline binding; Foundry worlds/modules import actors into groups; storyline merge asks on NPC name conflicts and reports NPC counts.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-07-20 13:19:22 +08:00
parent 37ba855faf
commit f4c0ac1438
41 changed files with 5210 additions and 418 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ async function buildNodeTargets() {
bundle: true,
minify: isProd,
sourcemap: !isProd,
external: ['electron', 'electron-updater', 'sharp', 'ffmpeg-static'],
external: ['electron', 'electron-updater', 'sharp', 'ffmpeg-static', 'classic-level'],
define,
drop: isProd ? ['console', 'debugger'] : [],
};
+4 -3
View File
@@ -12,7 +12,8 @@ const electronEnv = {
...process.env,
NODE_ENV: 'development',
DND_SKIP_LICENSE: process.env.DND_SKIP_LICENSE ?? '1',
VITE_DEV_SERVER_URL: 'http://localhost:5173/',
// Совпадает с vite.config.ts `server.host` (не localhost: на Windows он часто → ::1).
VITE_DEV_SERVER_URL: 'http://127.0.0.1:5173/',
};
function spawnShell(command, opts = {}) {
@@ -49,7 +50,7 @@ function killTree(child) {
}
}
function waitForVite(url = 'http://localhost:5173/editor.html', timeoutMs = 60000) {
function waitForVite(url = 'http://127.0.0.1:5173/editor.html', timeoutMs = 60000) {
const started = Date.now();
return new Promise((resolve, reject) => {
const tick = () => {
@@ -134,7 +135,7 @@ async function watchMainAndPreload() {
format: 'cjs',
bundle: true,
sourcemap: true,
external: ['electron'],
external: ['electron', 'electron-updater', 'sharp', 'ffmpeg-static', 'classic-level'],
define: { 'process.env.NODE_ENV': JSON.stringify('development') },
plugins: [restartPlugin],
});