@nicmeriano/spool 0.0.4 → 0.0.5

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
@@ -189,25 +189,6 @@ async function findAvailablePort(preferred) {
189
189
  });
190
190
  }
191
191
 
192
- // src/utils/browser.ts
193
- import { exec } from "child_process";
194
- function openBrowser(url) {
195
- const platform = process.platform;
196
- let command2;
197
- if (platform === "darwin") {
198
- command2 = `open "${url}"`;
199
- } else if (platform === "win32") {
200
- command2 = `start "${url}"`;
201
- } else {
202
- command2 = `xdg-open "${url}"`;
203
- }
204
- exec(command2, (error) => {
205
- if (error) {
206
- console.error(`Could not open browser: ${error.message}`);
207
- }
208
- });
209
- }
210
-
211
192
  // src/constants.ts
212
193
  var DEFAULT_SERVER_PORT = 3142;
213
194
 
@@ -224,7 +205,7 @@ async function runOpen(cwd, options = {}) {
224
205
  }
225
206
  console.log(`Starting Spool server on port ${port}...`);
226
207
  const { startServer } = await import("@nicmeriano/spool-server");
227
- startServer({ port, cwd });
208
+ startServer({ port, cwd, noOpen: options.noOpen });
228
209
  if (config.devCommand) {
229
210
  console.log(`Starting dev server: ${config.devCommand}`);
230
211
  const [cmd, ...args2] = config.devCommand.split(" ");
@@ -245,17 +226,13 @@ async function runOpen(cwd, options = {}) {
245
226
  process.exit(0);
246
227
  });
247
228
  }
248
- if (!options.noOpen) {
249
- const shellUrl = `http://localhost:${port}`;
229
+ if (options.noOpen) {
250
230
  console.log(`
251
- Opening Spool at ${shellUrl}
231
+ Spool server running at http://localhost:${port}
252
232
  `);
253
- setTimeout(() => {
254
- openBrowser(shellUrl);
255
- }, 1e3);
256
233
  } else {
257
234
  console.log(`
258
- Spool server running at http://localhost:${port}
235
+ Waiting for dev server to start...
259
236
  `);
260
237
  }
261
238
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/init.ts","../src/commands/open.ts","../src/utils/load-config.ts","../src/utils/port.ts","../src/utils/browser.ts","../src/constants.ts","../src/cli.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as readline from 'node:readline';\n\n/**\n * Detect the project framework\n */\nfunction detectFramework(cwd: string): { name: string; devCommand: string; usesVite: boolean } | null {\n const pkgPath = path.join(cwd, 'package.json');\n if (!fs.existsSync(pkgPath)) return null;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (deps['next']) {\n return { name: 'Next.js', devCommand: 'npm run dev', usesVite: false };\n }\n if (deps['vite']) {\n return { name: 'Vite', devCommand: 'npm run dev', usesVite: true };\n }\n if (deps['react-scripts']) {\n return { name: 'Create React App', devCommand: 'npm start', usesVite: false };\n }\n\n return null;\n}\n\n/**\n * Find the Vite config file in the project\n */\nfunction findViteConfig(cwd: string): string | null {\n const candidates = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const name of candidates) {\n const full = path.join(cwd, name);\n if (fs.existsSync(full)) return full;\n }\n return null;\n}\n\n/**\n * Add the spool Vite plugin to an existing vite config file.\n * Returns true if successful, false if the config couldn't be modified automatically.\n */\nfunction addVitePlugin(configPath: string): boolean {\n const content = fs.readFileSync(configPath, 'utf-8');\n\n // Skip if already configured\n if (content.includes('@nicmeriano/spool/vite') || content.includes('spool()')) {\n return true;\n }\n\n // Find the last import statement to insert our import after it\n const importRegex = /^import\\s.+$/gm;\n let lastImportMatch: RegExpExecArray | null = null;\n let match: RegExpExecArray | null;\n while ((match = importRegex.exec(content)) !== null) {\n lastImportMatch = match;\n }\n\n if (!lastImportMatch) {\n return false;\n }\n\n const importInsertPos = lastImportMatch.index + lastImportMatch[0].length;\n const spoolImport = `\\nimport { spool } from '@nicmeriano/spool/vite'`;\n\n // Find the plugins array and add spool() to it\n const pluginsRegex = /plugins\\s*:\\s*\\[/;\n const pluginsMatch = pluginsRegex.exec(content);\n\n if (!pluginsMatch) {\n return false;\n }\n\n // Build the new content: add import, then add spool() to plugins\n let newContent = content.slice(0, importInsertPos) + spoolImport + content.slice(importInsertPos);\n\n // Re-find plugins position (shifted by the import we added)\n const offset = spoolImport.length;\n const pluginsInsertPos = pluginsMatch.index + pluginsMatch[0].length + offset;\n newContent = newContent.slice(0, pluginsInsertPos) + 'spool(), ' + newContent.slice(pluginsInsertPos);\n\n fs.writeFileSync(configPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Prompt the user for input\n */\nfunction prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const displayDefault = defaultValue ? ` (${defaultValue})` : '';\n\n return new Promise((resolve) => {\n rl.question(`${question}${displayDefault}: `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\n/**\n * Run the spool init command\n */\nexport async function runInit(cwd: string): Promise<void> {\n console.log('Initializing Spool...\\n');\n\n // Check if config already exists\n const configPath = path.join(cwd, 'spool.config.ts');\n if (fs.existsSync(configPath)) {\n console.log('spool.config.ts already exists.');\n\n // Still check if the Vite plugin needs to be added\n const framework = detectFramework(cwd);\n if (framework?.usesVite) {\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n const viteContent = fs.readFileSync(viteConfigPath, 'utf-8');\n if (!viteContent.includes('@nicmeriano/spool/vite') && !viteContent.includes('spool()')) {\n const configName = path.basename(viteConfigPath);\n const success = addVitePlugin(viteConfigPath);\n if (success) {\n console.log(`Added spool plugin to ${configName}`);\n } else {\n console.log(`\\nCould not automatically modify ${configName}.`);\n console.log('Please add the spool plugin manually:\\n');\n console.log(' import { spool } from \\'@nicmeriano/spool/vite\\'\\n');\n console.log(' // In your plugins array:');\n console.log(' plugins: [spool(), ...otherPlugins]\\n');\n }\n }\n }\n }\n\n console.log('');\n return;\n }\n\n // Detect framework\n const framework = detectFramework(cwd);\n if (framework) {\n console.log(`Detected framework: ${framework.name}\\n`);\n }\n\n // Prompt for dev command\n const defaultDevCmd = framework?.devCommand || 'npm run dev';\n const devCommand = await prompt('Dev command', defaultDevCmd);\n\n // Write spool.config.ts\n const configContent = `import { defineConfig } from '@nicmeriano/spool';\n\nexport default defineConfig({\n devCommand: '${devCommand}',\n});\n`;\n\n fs.writeFileSync(configPath, configContent, 'utf-8');\n console.log(`\\nCreated spool.config.ts`);\n\n // Create .spool directory\n const spoolDir = path.join(cwd, '.spool');\n if (!fs.existsSync(spoolDir)) {\n fs.mkdirSync(spoolDir, { recursive: true });\n console.log('Created .spool/ directory');\n }\n\n // Add .spool/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.spool')) {\n fs.appendFileSync(gitignorePath, '\\n.spool/\\n');\n console.log('Added .spool/ to .gitignore');\n }\n }\n\n // Auto-configure Vite plugin if this is a Vite project\n if (framework?.usesVite) {\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n const configName = path.basename(viteConfigPath);\n const success = addVitePlugin(viteConfigPath);\n if (success) {\n console.log(`Added spool plugin to ${configName}`);\n } else {\n console.log(`\\nCould not automatically modify ${configName}.`);\n console.log('Please add the spool plugin manually:\\n');\n console.log(' import { spool } from \\'@nicmeriano/spool/vite\\'\\n');\n console.log(' // In your plugins array:');\n console.log(' plugins: [spool(), ...otherPlugins]\\n');\n }\n }\n } else {\n console.log('\\nNote: Add this script tag to your HTML:');\n console.log(' <script src=\"http://localhost:3142/inject.js\"></script>');\n }\n\n console.log('\\nDone! Run \"spool open\" to start.\\n');\n}\n","import { spawn } from 'node:child_process';\nimport { loadConfig } from '../utils/load-config.js';\nimport { findAvailablePort } from '../utils/port.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { DEFAULT_SERVER_PORT } from '../constants.js';\n\nexport interface OpenOptions {\n port?: number;\n noOpen?: boolean;\n}\n\n/**\n * Run the spool open command\n */\nexport async function runOpen(cwd: string, options: OpenOptions = {}): Promise<void> {\n // Load config\n const config = await loadConfig(cwd);\n\n // Check for ANTHROPIC_API_KEY\n if (!process.env.ANTHROPIC_API_KEY) {\n console.warn('Warning: ANTHROPIC_API_KEY is not set. Claude features will not work.\\n');\n }\n\n // Find available port\n const preferredPort = options.port ?? config.port ?? DEFAULT_SERVER_PORT;\n const port = await findAvailablePort(preferredPort);\n if (port !== preferredPort) {\n console.log(`Port ${preferredPort} is in use, using ${port} instead.`);\n }\n\n // Start the server\n console.log(`Starting Spool server on port ${port}...`);\n const { startServer } = await import('@nicmeriano/spool-server');\n\n // Start server (runs in background)\n startServer({ port, cwd });\n\n // Spawn dev command if configured\n if (config.devCommand) {\n console.log(`Starting dev server: ${config.devCommand}`);\n const [cmd, ...args] = config.devCommand.split(' ');\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('error', (error) => {\n console.error(`Dev server error: ${error.message}`);\n });\n\n // Clean up on exit\n process.on('SIGINT', () => {\n child.kill();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n child.kill();\n process.exit(0);\n });\n }\n\n // Open browser\n if (!options.noOpen) {\n const shellUrl = `http://localhost:${port}`;\n console.log(`\\nOpening Spool at ${shellUrl}\\n`);\n\n // Wait a moment for server to start\n setTimeout(() => {\n openBrowser(shellUrl);\n }, 1000);\n } else {\n console.log(`\\nSpool server running at http://localhost:${port}\\n`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Load spool.config.ts from the project root\n */\nexport async function loadConfig(cwd: string): Promise<import('../config.js').SpoolConfig> {\n const configPath = path.resolve(cwd, 'spool.config.ts');\n\n if (!fs.existsSync(configPath)) {\n throw new Error(\n `No spool.config.ts found in ${cwd}.\\nRun \"spool init\" to create one.`\n );\n }\n\n // Use jiti for TypeScript config loading\n const { createJiti } = await import('jiti');\n const jiti = createJiti(import.meta.url, { interopDefault: true });\n const config = await jiti.import(configPath) as { default?: import('../config.js').SpoolConfig } & import('../config.js').SpoolConfig;\n\n return config.default ?? config;\n}\n","import * as net from 'node:net';\n\n/**\n * Find an available port, starting from the preferred port\n */\nexport async function findAvailablePort(preferred: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.listen(preferred, () => {\n server.close(() => resolve(preferred));\n });\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n // Try next port\n findAvailablePort(preferred + 1).then(resolve).catch(reject);\n } else {\n reject(err);\n }\n });\n });\n}\n","import { exec } from 'node:child_process';\n\n/**\n * Open a URL in the default browser\n */\nexport function openBrowser(url: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === 'darwin') {\n command = `open \"${url}\"`;\n } else if (platform === 'win32') {\n command = `start \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.error(`Could not open browser: ${error.message}`);\n }\n });\n}\n","export const DEFAULT_SERVER_PORT = 3142;\nexport const DEFAULT_APP_PORT = 5173;\n","import { runInit } from './commands/init.js';\nimport { runOpen } from './commands/open.js';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction printUsage(): void {\n console.log(`\nUsage: spool <command> [options]\n\nCommands:\n init Initialize spool in your project\n open Start spool server and open the UI\n\nOptions (open):\n --port <n> Server port (default: 3142)\n --no-open Don't open browser automatically\n\nExamples:\n spool init\n spool open\n spool open --port 4000\n spool open --no-open\n`);\n}\n\nasync function main(): Promise<void> {\n const cwd = process.cwd();\n\n switch (command) {\n case 'init':\n await runInit(cwd);\n break;\n\n case 'open': {\n const portIndex = args.indexOf('--port');\n const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : undefined;\n const noOpen = args.includes('--no-open');\n await runOpen(cwd, { port, noOpen });\n break;\n }\n\n case '--help':\n case '-h':\n case undefined:\n printUsage();\n break;\n\n default:\n console.error(`Unknown command: ${command}`);\n printUsage();\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(error.message || error);\n process.exit(1);\n});\n"],"mappings":"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","names":["resolve","framework","fs","path","resolve","command","args"]}
1
+ {"version":3,"sources":["../src/commands/init.ts","../src/commands/open.ts","../src/utils/load-config.ts","../src/utils/port.ts","../src/constants.ts","../src/cli.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as readline from 'node:readline';\n\n/**\n * Detect the project framework\n */\nfunction detectFramework(cwd: string): { name: string; devCommand: string; usesVite: boolean } | null {\n const pkgPath = path.join(cwd, 'package.json');\n if (!fs.existsSync(pkgPath)) return null;\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (deps['next']) {\n return { name: 'Next.js', devCommand: 'npm run dev', usesVite: false };\n }\n if (deps['vite']) {\n return { name: 'Vite', devCommand: 'npm run dev', usesVite: true };\n }\n if (deps['react-scripts']) {\n return { name: 'Create React App', devCommand: 'npm start', usesVite: false };\n }\n\n return null;\n}\n\n/**\n * Find the Vite config file in the project\n */\nfunction findViteConfig(cwd: string): string | null {\n const candidates = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];\n for (const name of candidates) {\n const full = path.join(cwd, name);\n if (fs.existsSync(full)) return full;\n }\n return null;\n}\n\n/**\n * Add the spool Vite plugin to an existing vite config file.\n * Returns true if successful, false if the config couldn't be modified automatically.\n */\nfunction addVitePlugin(configPath: string): boolean {\n const content = fs.readFileSync(configPath, 'utf-8');\n\n // Skip if already configured\n if (content.includes('@nicmeriano/spool/vite') || content.includes('spool()')) {\n return true;\n }\n\n // Find the last import statement to insert our import after it\n const importRegex = /^import\\s.+$/gm;\n let lastImportMatch: RegExpExecArray | null = null;\n let match: RegExpExecArray | null;\n while ((match = importRegex.exec(content)) !== null) {\n lastImportMatch = match;\n }\n\n if (!lastImportMatch) {\n return false;\n }\n\n const importInsertPos = lastImportMatch.index + lastImportMatch[0].length;\n const spoolImport = `\\nimport { spool } from '@nicmeriano/spool/vite'`;\n\n // Find the plugins array and add spool() to it\n const pluginsRegex = /plugins\\s*:\\s*\\[/;\n const pluginsMatch = pluginsRegex.exec(content);\n\n if (!pluginsMatch) {\n return false;\n }\n\n // Build the new content: add import, then add spool() to plugins\n let newContent = content.slice(0, importInsertPos) + spoolImport + content.slice(importInsertPos);\n\n // Re-find plugins position (shifted by the import we added)\n const offset = spoolImport.length;\n const pluginsInsertPos = pluginsMatch.index + pluginsMatch[0].length + offset;\n newContent = newContent.slice(0, pluginsInsertPos) + 'spool(), ' + newContent.slice(pluginsInsertPos);\n\n fs.writeFileSync(configPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Prompt the user for input\n */\nfunction prompt(question: string, defaultValue?: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const displayDefault = defaultValue ? ` (${defaultValue})` : '';\n\n return new Promise((resolve) => {\n rl.question(`${question}${displayDefault}: `, (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\n/**\n * Run the spool init command\n */\nexport async function runInit(cwd: string): Promise<void> {\n console.log('Initializing Spool...\\n');\n\n // Check if config already exists\n const configPath = path.join(cwd, 'spool.config.ts');\n if (fs.existsSync(configPath)) {\n console.log('spool.config.ts already exists.');\n\n // Still check if the Vite plugin needs to be added\n const framework = detectFramework(cwd);\n if (framework?.usesVite) {\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n const viteContent = fs.readFileSync(viteConfigPath, 'utf-8');\n if (!viteContent.includes('@nicmeriano/spool/vite') && !viteContent.includes('spool()')) {\n const configName = path.basename(viteConfigPath);\n const success = addVitePlugin(viteConfigPath);\n if (success) {\n console.log(`Added spool plugin to ${configName}`);\n } else {\n console.log(`\\nCould not automatically modify ${configName}.`);\n console.log('Please add the spool plugin manually:\\n');\n console.log(' import { spool } from \\'@nicmeriano/spool/vite\\'\\n');\n console.log(' // In your plugins array:');\n console.log(' plugins: [spool(), ...otherPlugins]\\n');\n }\n }\n }\n }\n\n console.log('');\n return;\n }\n\n // Detect framework\n const framework = detectFramework(cwd);\n if (framework) {\n console.log(`Detected framework: ${framework.name}\\n`);\n }\n\n // Prompt for dev command\n const defaultDevCmd = framework?.devCommand || 'npm run dev';\n const devCommand = await prompt('Dev command', defaultDevCmd);\n\n // Write spool.config.ts\n const configContent = `import { defineConfig } from '@nicmeriano/spool';\n\nexport default defineConfig({\n devCommand: '${devCommand}',\n});\n`;\n\n fs.writeFileSync(configPath, configContent, 'utf-8');\n console.log(`\\nCreated spool.config.ts`);\n\n // Create .spool directory\n const spoolDir = path.join(cwd, '.spool');\n if (!fs.existsSync(spoolDir)) {\n fs.mkdirSync(spoolDir, { recursive: true });\n console.log('Created .spool/ directory');\n }\n\n // Add .spool/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf-8');\n if (!content.includes('.spool')) {\n fs.appendFileSync(gitignorePath, '\\n.spool/\\n');\n console.log('Added .spool/ to .gitignore');\n }\n }\n\n // Auto-configure Vite plugin if this is a Vite project\n if (framework?.usesVite) {\n const viteConfigPath = findViteConfig(cwd);\n if (viteConfigPath) {\n const configName = path.basename(viteConfigPath);\n const success = addVitePlugin(viteConfigPath);\n if (success) {\n console.log(`Added spool plugin to ${configName}`);\n } else {\n console.log(`\\nCould not automatically modify ${configName}.`);\n console.log('Please add the spool plugin manually:\\n');\n console.log(' import { spool } from \\'@nicmeriano/spool/vite\\'\\n');\n console.log(' // In your plugins array:');\n console.log(' plugins: [spool(), ...otherPlugins]\\n');\n }\n }\n } else {\n console.log('\\nNote: Add this script tag to your HTML:');\n console.log(' <script src=\"http://localhost:3142/inject.js\"></script>');\n }\n\n console.log('\\nDone! Run \"spool open\" to start.\\n');\n}\n","import { spawn } from 'node:child_process';\nimport { loadConfig } from '../utils/load-config.js';\nimport { findAvailablePort } from '../utils/port.js';\nimport { DEFAULT_SERVER_PORT } from '../constants.js';\n\nexport interface OpenOptions {\n port?: number;\n noOpen?: boolean;\n}\n\n/**\n * Run the spool open command\n */\nexport async function runOpen(cwd: string, options: OpenOptions = {}): Promise<void> {\n // Load config\n const config = await loadConfig(cwd);\n\n // Check for ANTHROPIC_API_KEY\n if (!process.env.ANTHROPIC_API_KEY) {\n console.warn('Warning: ANTHROPIC_API_KEY is not set. Claude features will not work.\\n');\n }\n\n // Find available port\n const preferredPort = options.port ?? config.port ?? DEFAULT_SERVER_PORT;\n const port = await findAvailablePort(preferredPort);\n if (port !== preferredPort) {\n console.log(`Port ${preferredPort} is in use, using ${port} instead.`);\n }\n\n // Start the server\n console.log(`Starting Spool server on port ${port}...`);\n const { startServer } = await import('@nicmeriano/spool-server');\n\n // Start server (runs in background)\n // Browser opening is handled by the server when the Vite plugin reports the app URL\n startServer({ port, cwd, noOpen: options.noOpen });\n\n // Spawn dev command if configured\n if (config.devCommand) {\n console.log(`Starting dev server: ${config.devCommand}`);\n const [cmd, ...args] = config.devCommand.split(' ');\n const child = spawn(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('error', (error) => {\n console.error(`Dev server error: ${error.message}`);\n });\n\n // Clean up on exit\n process.on('SIGINT', () => {\n child.kill();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n child.kill();\n process.exit(0);\n });\n }\n\n // Browser will be opened by the server when the Vite plugin reports the app URL\n if (options.noOpen) {\n console.log(`\\nSpool server running at http://localhost:${port}\\n`);\n } else {\n console.log(`\\nWaiting for dev server to start...\\n`);\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Load spool.config.ts from the project root\n */\nexport async function loadConfig(cwd: string): Promise<import('../config.js').SpoolConfig> {\n const configPath = path.resolve(cwd, 'spool.config.ts');\n\n if (!fs.existsSync(configPath)) {\n throw new Error(\n `No spool.config.ts found in ${cwd}.\\nRun \"spool init\" to create one.`\n );\n }\n\n // Use jiti for TypeScript config loading\n const { createJiti } = await import('jiti');\n const jiti = createJiti(import.meta.url, { interopDefault: true });\n const config = await jiti.import(configPath) as { default?: import('../config.js').SpoolConfig } & import('../config.js').SpoolConfig;\n\n return config.default ?? config;\n}\n","import * as net from 'node:net';\n\n/**\n * Find an available port, starting from the preferred port\n */\nexport async function findAvailablePort(preferred: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.listen(preferred, () => {\n server.close(() => resolve(preferred));\n });\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n // Try next port\n findAvailablePort(preferred + 1).then(resolve).catch(reject);\n } else {\n reject(err);\n }\n });\n });\n}\n","export const DEFAULT_SERVER_PORT = 3142;\nexport const DEFAULT_APP_PORT = 5173;\n","import { runInit } from './commands/init.js';\nimport { runOpen } from './commands/open.js';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction printUsage(): void {\n console.log(`\nUsage: spool <command> [options]\n\nCommands:\n init Initialize spool in your project\n open Start spool server and open the UI\n\nOptions (open):\n --port <n> Server port (default: 3142)\n --no-open Don't open browser automatically\n\nExamples:\n spool init\n spool open\n spool open --port 4000\n spool open --no-open\n`);\n}\n\nasync function main(): Promise<void> {\n const cwd = process.cwd();\n\n switch (command) {\n case 'init':\n await runInit(cwd);\n break;\n\n case 'open': {\n const portIndex = args.indexOf('--port');\n const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : undefined;\n const noOpen = args.includes('--no-open');\n await runOpen(cwd, { port, noOpen });\n break;\n }\n\n case '--help':\n case '-h':\n case undefined:\n printUsage();\n break;\n\n default:\n console.error(`Unknown command: ${command}`);\n printUsage();\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(error.message || error);\n process.exit(1);\n});\n"],"mappings":"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","names":["resolve","framework","fs","path","resolve","args"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nicmeriano/spool",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Spool CLI - UI feedback tool for Claude Code",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "jiti": "^2.4.0",
41
- "@nicmeriano/spool-server": "0.0.3"
41
+ "@nicmeriano/spool-server": "0.0.4"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "vite": ">=5.0.0"