@series-inc/stowkit-cli 0.6.15 → 0.6.17

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/dist/cli.js CHANGED
@@ -128,6 +128,18 @@ function openBrowser(url) {
128
128
  exec(`${cmd} ${url}`);
129
129
  });
130
130
  }
131
+ async function isStowKitRunning(port) {
132
+ try {
133
+ const controller = new AbortController();
134
+ const timeout = setTimeout(() => controller.abort(), 1000);
135
+ const res = await fetch(`http://localhost:${port}/api/project`, { signal: controller.signal });
136
+ clearTimeout(timeout);
137
+ return res.ok;
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
131
143
  async function main() {
132
144
  if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
133
145
  printUsage();
@@ -269,6 +281,11 @@ async function main() {
269
281
  break;
270
282
  }
271
283
  case 'packer': {
284
+ if (await isStowKitRunning(port)) {
285
+ console.log(`\n Packer already running: http://localhost:${port}\n`);
286
+ openBrowser(`http://localhost:${port}`);
287
+ break;
288
+ }
272
289
  const packerDir = resolveAppDir('@series-inc/stowkit-packer-gui', 'stowkit-packer-gui');
273
290
  if (!packerDir) {
274
291
  console.error('Packer GUI not found. Install it: npm install @series-inc/stowkit-packer-gui');
@@ -281,6 +298,11 @@ async function main() {
281
298
  break;
282
299
  }
283
300
  case 'editor': {
301
+ if (await isStowKitRunning(port)) {
302
+ console.log(`\n Editor already running: http://localhost:${port}\n`);
303
+ openBrowser(`http://localhost:${port}`);
304
+ break;
305
+ }
284
306
  const editorDir = resolveAppDir('@series-inc/stowkit-editor', 'stowkit-editor');
285
307
  if (!editorDir) {
286
308
  console.error('Editor not found. Install it: npm install @series-inc/stowkit-editor');
package/dist/init.js CHANGED
@@ -96,6 +96,8 @@ export async function initProject(projectDir, opts) {
96
96
  '# StowKit',
97
97
  '*.stowcache',
98
98
  'public/cdn-assets/',
99
+ 'Open Packer.bat',
100
+ 'open-packer.sh',
99
101
  ].join('\n');
100
102
  try {
101
103
  const existing = await fs.readFile(gitignorePath, 'utf-8');
@@ -108,11 +110,14 @@ export async function initProject(projectDir, opts) {
108
110
  }
109
111
  // Copy AI skill/rule files
110
112
  await copySkillFiles(absDir);
113
+ // Create double-clickable launcher scripts
114
+ await createLauncherScripts(absDir);
111
115
  console.log(`Initialized StowKit project at ${absDir}`);
112
116
  console.log(` Source art dir: ${srcArtDir}/`);
113
117
  console.log(` Output dir: public/cdn-assets/`);
114
118
  console.log(` Config: .felicityproject`);
115
119
  console.log(` AI skills: .claude/skills/stowkit/SKILL.md, .cursor/rules/stowkit.mdc`);
120
+ console.log(` Launcher: Open Packer.bat (Windows) / open-packer.sh (macOS/Linux)`);
116
121
  // Install engine if selected
117
122
  if (withEngine) {
118
123
  await installEngine(absDir);
@@ -120,6 +125,7 @@ export async function initProject(projectDir, opts) {
120
125
  console.log('');
121
126
  console.log('Drop your assets (PNG, JPG, FBX, WAV, etc.) into assets/');
122
127
  console.log('Then run: stowkit build');
128
+ console.log('Or double-click "Open Packer.bat" to launch the packer GUI.');
123
129
  }
124
130
  async function installEngine(absDir) {
125
131
  console.log('');
@@ -159,6 +165,20 @@ async function copySkillFiles(absDir) {
159
165
  // Skill file not found in package — skip silently
160
166
  }
161
167
  }
168
+ async function createLauncherScripts(absDir) {
169
+ const batContent = [
170
+ '@echo off',
171
+ 'npx @series-inc/stowkit-cli packer .',
172
+ 'if %errorlevel% neq 0 pause',
173
+ ].join('\r\n');
174
+ const shContent = [
175
+ '#!/bin/sh',
176
+ 'cd "$(dirname "$0")"',
177
+ 'npx @series-inc/stowkit-cli packer .',
178
+ ].join('\n');
179
+ await fs.writeFile(path.join(absDir, 'Open Packer.bat'), batContent);
180
+ await fs.writeFile(path.join(absDir, 'open-packer.sh'), shContent, { mode: 0o755 });
181
+ }
162
182
  async function copyEngineSkillFiles(absDir) {
163
183
  const thisDir = path.dirname(fileURLToPath(import.meta.url));
164
184
  const candidates = [
package/dist/server.js CHANGED
@@ -41,6 +41,7 @@ let folders = [];
41
41
  let workerPool = null;
42
42
  let encodersReady = false;
43
43
  let lastScanTime = 0;
44
+ let packBuildVersion = 0;
44
45
  // Track in-flight processing
45
46
  const processing = new Set();
46
47
  // staticApps is passed per-server via closure, not module-level
@@ -876,6 +877,7 @@ async function handleRequest(req, res, staticApps) {
876
877
  assets,
877
878
  folders,
878
879
  encodersReady,
880
+ packBuildVersion,
879
881
  });
880
882
  return;
881
883
  }
@@ -932,6 +934,9 @@ async function handleRequest(req, res, staticApps) {
932
934
  results.push({ name: pack.name, size: packData.length, assetCount: packAssets.length });
933
935
  console.log(`[server] Built ${pack.name}.stow (${packAssets.length} assets, ${(packData.length / 1024).toFixed(0)} KB)`);
934
936
  }
937
+ if (results.length > 0) {
938
+ packBuildVersion++;
939
+ }
935
940
  if (allErrors.length > 0) {
936
941
  broadcast({ type: 'build-complete', packs: results, errors: allErrors });
937
942
  json(res, { ok: false, packs: results, errors: allErrors });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@series-inc/stowkit-cli",
3
- "version": "0.6.15",
3
+ "version": "0.6.17",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "stowkit": "./dist/cli.js"
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@series-inc/stowkit-packer-gui": "^0.1.17",
21
- "@series-inc/stowkit-editor": "^0.1.4",
21
+ "@series-inc/stowkit-editor": "^0.1.7",
22
22
  "draco3d": "^1.5.7",
23
23
  "fbx-parser": "^2.1.3",
24
24
  "@strangeape/ffmpeg-audio-wasm": "^0.1.0",