diff --git a/cli-package/cli-wrapper.js b/cli-package/cli-wrapper.js index 769cc911..b7296921 100644 --- a/cli-package/cli-wrapper.js +++ b/cli-package/cli-wrapper.js @@ -12,6 +12,21 @@ import { fileURLToPath } from 'url' import { dirname, join } from 'path' import fs from 'fs' +// Fix for TextEncoder in Node.js v24 +// In Node.js v24, TextEncoder is a global object and not part of the util module +// This patch ensures that the util module has TextEncoder available for TensorFlow.js +if (process.versions.node.startsWith('24')) { + try { + const util = await import('util') + if (!util.TextEncoder && typeof TextEncoder !== 'undefined') { + util.TextEncoder = TextEncoder + util.TextDecoder = TextDecoder + } + } catch (error) { + console.warn('Warning: Failed to patch TextEncoder for Node.js v24:', error.message) + } +} + // Get the directory of the current module const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) diff --git a/cli-package/package-lock.json b/cli-package/package-lock.json index b68e8925..1c4200c4 100644 --- a/cli-package/package-lock.json +++ b/cli-package/package-lock.json @@ -1,16 +1,16 @@ { "name": "@soulcraft/brainy-cli", - "version": "0.9.21", + "version": "0.9.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@soulcraft/brainy-cli", - "version": "0.9.21", + "version": "0.9.22", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@soulcraft/brainy": "0.9.21", + "@soulcraft/brainy": "0.9.22", "commander": "^14.0.0", "omelette": "^0.4.17" }, @@ -2086,9 +2086,9 @@ } }, "node_modules/@soulcraft/brainy": { - "version": "0.9.21", - "resolved": "https://registry.npmjs.org/@soulcraft/brainy/-/brainy-0.9.21.tgz", - "integrity": "sha512-UimglEpucGsiRXZlsSx4jZis0cIGKAxPU7lk/m6LvygRm01r9NPTCpsrT3mp38JMbEkzm4JpmP8vHaC5hWzXZQ==", + "version": "0.9.22", + "resolved": "https://registry.npmjs.org/@soulcraft/brainy/-/brainy-0.9.22.tgz", + "integrity": "sha512-hzEky/l4IncMIp2dMspykYD903ynft2pn6Lw9eJjZ22WhOH0pvmdX8G6sYk+7IBwY5CSSw5dm3T4EPJc53gegA==", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/cli-package/package.json b/cli-package/package.json index 6fb7e63d..6b993318 100644 --- a/cli-package/package.json +++ b/cli-package/package.json @@ -1,6 +1,6 @@ { "name": "@soulcraft/brainy-cli", - "version": "0.9.21", + "version": "0.9.23", "description": "Command-line interface for the Brainy vector graph database", "type": "module", "bin": { @@ -39,7 +39,7 @@ "url": "https://github.com/soulcraft-research/brainy.git" }, "dependencies": { - "@soulcraft/brainy": "0.9.21", + "@soulcraft/brainy": "0.9.22", "commander": "^14.0.0", "omelette": "^0.4.17" }, @@ -57,4 +57,4 @@ "engines": { "node": ">=24.0.0" } -} \ No newline at end of file +} diff --git a/package.json b/package.json index f766c6bc..f10b633e 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "deploy:cloud:cloudflare": "cd cloud-wrapper && npm run build && npm run deploy:cloudflare", "deploy:cloud": "echo 'Please use one of the following commands to deploy to a specific cloud provider:' && echo ' npm run deploy:cloud:aws' && echo ' npm run deploy:cloud:gcp' && echo ' npm run deploy:cloud:cloudflare'", "postinstall": "echo 'Note: If you encounter dependency conflicts with TensorFlow.js packages, please use: npm install --legacy-peer-deps'", - "dry-run": "npm pack --dry-run" + "dry-run": "npm pack --dry-run", + "test-cli": "node scripts/test-cli-locally.js" }, "keywords": [ "vector-database", diff --git a/scripts/test-cli-locally.js b/scripts/test-cli-locally.js new file mode 100755 index 00000000..f7fedae4 --- /dev/null +++ b/scripts/test-cli-locally.js @@ -0,0 +1,91 @@ +#!/usr/bin/env node + +/** + * Test CLI Package Locally + * + * This script allows testing the CLI package locally before publishing to npm. + * It builds both packages, creates local tarballs, and installs the CLI package + * globally for testing. + */ + +import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Get the directory of the current module +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const rootDir = path.join(__dirname, '..'); +const cliPackageDir = path.join(rootDir, 'cli-package'); + +// Ensure the CLI package directory exists +if (!fs.existsSync(cliPackageDir)) { + console.error(`Error: CLI package directory not found at ${cliPackageDir}`); + process.exit(1); +} + +try { + // Step 1: Ensure versions are in sync + console.log('Ensuring versions are in sync...'); + execSync('node scripts/generate-version.js', { stdio: 'inherit', cwd: rootDir }); + + // Step 2: Build the main package + console.log('Building main package...'); + execSync('npm run build', { stdio: 'inherit', cwd: rootDir }); + + // Step 3: Create a local tarball of the main package + console.log('Creating local tarball of main package...'); + const mainPackOutput = execSync('npm pack', { cwd: rootDir }).toString().trim(); + const mainPackageTarball = path.join(rootDir, mainPackOutput); + console.log(`Main package tarball created: ${mainPackageTarball}`); + + // Step 4: Build the CLI package + console.log('Building CLI package...'); + execSync('npm run build', { stdio: 'inherit', cwd: cliPackageDir }); + + // Step 5: Verify the CLI was built successfully + const cliPath = path.join(cliPackageDir, 'dist', 'cli.js'); + if (!fs.existsSync(cliPath)) { + console.error(`Error: CLI build failed. File not found at ${cliPath}`); + process.exit(1); + } + + // Step 6: Temporarily update the CLI package.json to use the local main package + console.log('Updating CLI package.json to use local main package...'); + const cliPackageJsonPath = path.join(cliPackageDir, 'package.json'); + const cliPackageJson = JSON.parse(fs.readFileSync(cliPackageJsonPath, 'utf8')); + + // Save the original dependency for restoration later + const originalDependency = cliPackageJson.dependencies['@soulcraft/brainy']; + + // Update to use the local tarball + cliPackageJson.dependencies['@soulcraft/brainy'] = `file:${mainPackageTarball}`; + + // Write the updated package.json + fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2)); + + // Step 7: Create a local tarball of the CLI package + console.log('Creating local tarball of CLI package...'); + const cliPackOutput = execSync('npm pack', { cwd: cliPackageDir }).toString().trim(); + const cliPackageTarball = path.join(cliPackageDir, cliPackOutput); + console.log(`CLI package tarball created: ${cliPackageTarball}`); + + // Step 8: Restore the original dependency in CLI package.json + console.log('Restoring original dependency in CLI package.json...'); + cliPackageJson.dependencies['@soulcraft/brainy'] = originalDependency; + fs.writeFileSync(cliPackageJsonPath, JSON.stringify(cliPackageJson, null, 2)); + + // Step 9: Install the CLI package globally for testing + console.log('Installing CLI package globally for testing...'); + execSync(`npm install -g ${cliPackageTarball}`, { stdio: 'inherit' }); + + console.log('\nCLI package installed globally for testing!'); + console.log('You can now run the CLI using the "brainy" command.'); + console.log('\nTo uninstall after testing:'); + console.log('npm uninstall -g @soulcraft/brainy-cli'); + +} catch (error) { + console.error('Error:', error.message); + process.exit(1); +} diff --git a/src/utils/version.ts b/src/utils/version.ts index 3000c023..83c71123 100644 --- a/src/utils/version.ts +++ b/src/utils/version.ts @@ -3,4 +3,4 @@ * Do not modify this file directly. */ -export const VERSION = '0.9.21'; +export const VERSION = '0.9.22';