openkbs 0.0.45 → 0.0.47

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/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "openkbs",
3
- "version": "0.0.45",
3
+ "version": "0.0.47",
4
4
  "description": "OpenKBS - Command Line Interface",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
7
7
  "build": "pkg .",
8
- "deploy": "npm run build && npm run deploy:linux && npm run deploy:macos && npm run deploy:win && npm run deploy:templates",
8
+ "deploy": "npm run build && npm run deploy:linux && npm run deploy:macos && npm run deploy:win && npm run deploy:templates && npm run deploy:version",
9
9
  "deploy:linux": "aws s3 cp build/openkbs-linux-x64 s3://openkbs-downloads/cli/linux/openkbs && aws s3 cp build/openkbs-linux-arm64 s3://openkbs-downloads/cli/linux/openkbs-arm64",
10
10
  "deploy:macos": "aws s3 cp build/openkbs-macos-arm64 s3://openkbs-downloads/cli/macos/openkbs && aws s3 cp build/openkbs-macos-x64 s3://openkbs-downloads/cli/macos/openkbs-x64",
11
11
  "deploy:win": "aws s3 cp build/openkbs-win-x64.exe s3://openkbs-downloads/cli/windows/openkbs.exe && aws s3 cp build/openkbs-win-arm64.exe s3://openkbs-downloads/cli/windows/openkbs-arm64.exe",
12
12
  "deploy:templates": "node scripts/deploy-templates.js",
13
+ "deploy:version": "node scripts/update-version.js && aws s3 cp version.json s3://openkbs-downloads/cli/version.json",
13
14
  "postinstall": "node src/install.js",
14
15
  "postupdate": "node src/install.js"
15
16
  },
@@ -0,0 +1,17 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ const packageJsonPath = path.join(__dirname, '..', 'package.json');
5
+ const versionJsonPath = path.join(__dirname, '..', 'version.json');
6
+
7
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
8
+
9
+ const versionData = {
10
+ version: packageJson.version,
11
+ releaseDate: new Date().toISOString().split('T')[0],
12
+ releaseNotes: `OpenKBS CLI version ${packageJson.version}`
13
+ };
14
+
15
+ fs.writeFileSync(versionJsonPath, JSON.stringify(versionData, null, 2));
16
+
17
+ console.log(`Updated version.json with version ${packageJson.version}`);
package/src/actions.js CHANGED
@@ -538,7 +538,7 @@ async function downloadModifyAction() {
538
538
  });
539
539
  }
540
540
 
541
- async function updateKnowledgeAction() {
541
+ async function updateKnowledgeAction(silent = false) {
542
542
  try {
543
543
  const knowledgeDir = path.join(process.cwd(), '.openkbs', 'knowledge');
544
544
  const metadataPath = path.join(knowledgeDir, 'metadata.json');
@@ -546,7 +546,9 @@ async function updateKnowledgeAction() {
546
546
 
547
547
  // Check if .openkbs/knowledge directory exists
548
548
  if (!fs.existsSync(knowledgeDir)) {
549
- console.red('Knowledge directory not found. Please ensure you are in an OpenKBS project directory.');
549
+ if (!silent) {
550
+ console.red('Knowledge directory not found. Please ensure you are in an OpenKBS project directory.');
551
+ }
550
552
  return;
551
553
  }
552
554
 
@@ -557,7 +559,9 @@ async function updateKnowledgeAction() {
557
559
  const localMetadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
558
560
  localVersion = localMetadata.version;
559
561
  } catch (error) {
560
- console.red('Error reading local metadata.json:', error.message);
562
+ if (!silent) {
563
+ console.red('Error reading local metadata.json:', error.message);
564
+ }
561
565
  return;
562
566
  }
563
567
  }
@@ -581,7 +585,9 @@ async function updateKnowledgeAction() {
581
585
  const remoteMetadata = JSON.parse(remoteMetadataContent);
582
586
  remoteVersion = remoteMetadata.version;
583
587
  } catch (error) {
584
- console.red('Error fetching remote metadata:', error.message);
588
+ if (!silent) {
589
+ console.red('Error fetching remote metadata:', error.message);
590
+ }
585
591
  return;
586
592
  }
587
593
 
@@ -602,10 +608,168 @@ async function updateKnowledgeAction() {
602
608
  console.green('Knowledge base updated successfully!');
603
609
 
604
610
  } catch (error) {
605
- console.red('Error updating knowledge base:', error.message);
611
+ if (!silent) {
612
+ console.red('Error updating knowledge base:', error.message);
613
+ }
606
614
  }
607
615
  }
608
616
 
617
+ async function updateCliAction() {
618
+ try {
619
+ const packageJson = require('../package.json');
620
+ const currentVersion = packageJson.version;
621
+
622
+ console.log(`Current OpenKBS CLI version: ${currentVersion}`);
623
+ console.log('Checking for updates...');
624
+
625
+ // Check remote version from S3
626
+ const https = require('https');
627
+ const bucket = 'openkbs-downloads';
628
+ const versionMetadataKey = 'cli/version.json';
629
+
630
+ let remoteVersionData = null;
631
+ let cliUpdateAvailable = false;
632
+
633
+ try {
634
+ const fileUrl = `https://${bucket}.s3.amazonaws.com/${versionMetadataKey}`;
635
+ const remoteVersionContent = await new Promise((resolve, reject) => {
636
+ https.get(fileUrl, (res) => {
637
+ if (res.statusCode === 404) {
638
+ reject(new Error('Version metadata not found on remote server'));
639
+ return;
640
+ }
641
+ let data = '';
642
+ res.on('data', (chunk) => data += chunk);
643
+ res.on('end', () => resolve(data));
644
+ }).on('error', reject);
645
+ });
646
+
647
+ remoteVersionData = JSON.parse(remoteVersionContent);
648
+ const remoteVersion = remoteVersionData.version;
649
+
650
+ // Compare versions using semantic versioning
651
+ if (compareVersions(currentVersion, remoteVersion) < 0) {
652
+ cliUpdateAvailable = true;
653
+ console.log(`New CLI version available: ${remoteVersion}`);
654
+ console.log('Downloading and installing CLI update...');
655
+
656
+ // Download and install the new binary
657
+ await downloadAndInstallCli();
658
+
659
+ console.green(`Successfully updated OpenKBS CLI to version ${remoteVersion}!`);
660
+ } else {
661
+ console.green('OpenKBS CLI is already up to date.');
662
+ }
663
+ } catch (error) {
664
+ console.red('Error fetching CLI version metadata:', error.message);
665
+ }
666
+
667
+ // Also update knowledge base silently if it exists
668
+ await updateKnowledgeAction(true);
669
+
670
+ if (cliUpdateAvailable) {
671
+ console.log('Please restart your terminal or run `source ~/.bashrc` to use the updated CLI version.');
672
+ }
673
+
674
+ } catch (error) {
675
+ console.red('Error updating CLI:', error.message);
676
+ }
677
+ }
678
+
679
+ function compareVersions(version1, version2) {
680
+ const parts1 = version1.split('.').map(Number);
681
+ const parts2 = version2.split('.').map(Number);
682
+
683
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
684
+ const part1 = parts1[i] || 0;
685
+ const part2 = parts2[i] || 0;
686
+
687
+ if (part1 > part2) return 1;
688
+ if (part1 < part2) return -1;
689
+ }
690
+
691
+ return 0;
692
+ }
693
+
694
+ async function downloadAndInstallCli() {
695
+ const platform = os.platform();
696
+ const arch = os.arch();
697
+ let url = '';
698
+
699
+ if (platform === 'linux' && arch === 'x64') {
700
+ url = 'https://downloads.openkbs.com/cli/linux/openkbs';
701
+ } else if (platform === 'darwin' && arch === 'arm64') {
702
+ url = 'https://downloads.openkbs.com/cli/macos/openkbs';
703
+ } else if (platform === 'darwin' && arch === 'x64') {
704
+ url = 'https://downloads.openkbs.com/cli/macos/openkbs-x64';
705
+ } else if (platform === 'win32' && arch === 'x64') {
706
+ url = 'https://downloads.openkbs.com/cli/windows/openkbs.exe';
707
+ } else if (platform === 'win32' && arch === 'arm64') {
708
+ url = 'https://downloads.openkbs.com/cli/windows/openkbs-arm64.exe';
709
+ } else if (platform === 'linux' && arch === 'arm64') {
710
+ url = 'https://downloads.openkbs.com/cli/linux/openkbs-arm64';
711
+ } else {
712
+ throw new Error(`Unsupported platform: ${platform} ${arch}`);
713
+ }
714
+
715
+ const tempPath = path.join(os.tmpdir(), 'openkbs-update');
716
+
717
+ return new Promise((resolve, reject) => {
718
+ const file = fs.createWriteStream(tempPath);
719
+
720
+ https.get(url, (response) => {
721
+ if (response.statusCode !== 200) {
722
+ reject(new Error(`Failed to download binary: HTTP ${response.statusCode}`));
723
+ return;
724
+ }
725
+
726
+ response.pipe(file);
727
+
728
+ file.on('finish', () => {
729
+ file.close(async () => {
730
+ try {
731
+ // Make executable
732
+ if (platform !== 'win32') {
733
+ fs.chmodSync(tempPath, '755');
734
+ }
735
+
736
+ // Find the current binary location
737
+ const currentBinaryPath = process.argv[0] === 'node' ? process.argv[1] : process.argv[0];
738
+ let targetPath;
739
+
740
+ // If we're running through npm, find the global bin path
741
+ if (currentBinaryPath.includes('node_modules')) {
742
+ targetPath = currentBinaryPath;
743
+ } else {
744
+ // Try to find in common global locations
745
+ const globalPaths = [
746
+ '/usr/local/bin/openkbs',
747
+ path.join(os.homedir(), '.npm-global', 'bin', 'openkbs'),
748
+ path.join(os.homedir(), '.yarn', 'bin', 'openkbs')
749
+ ];
750
+
751
+ targetPath = globalPaths.find(p => fs.existsSync(p)) || currentBinaryPath;
752
+ }
753
+
754
+ // Replace the binary
755
+ fs.copyFileSync(tempPath, targetPath);
756
+
757
+ // Clean up temp file
758
+ fs.unlinkSync(tempPath);
759
+
760
+ resolve();
761
+ } catch (error) {
762
+ reject(error);
763
+ }
764
+ });
765
+ });
766
+ }).on('error', (err) => {
767
+ fs.unlink(tempPath, () => {});
768
+ reject(err);
769
+ });
770
+ });
771
+ }
772
+
609
773
  async function downloadKnowledgeFromS3(targetDir) {
610
774
  const https = require('https');
611
775
  const bucket = 'openkbs-downloads';
@@ -717,5 +881,6 @@ module.exports = {
717
881
  installFrontendPackageAction,
718
882
  modifyAction,
719
883
  downloadModifyAction,
720
- updateKnowledgeAction
884
+ updateKnowledgeAction,
885
+ updateCliAction
721
886
  };
package/src/index.js CHANGED
@@ -13,7 +13,7 @@ const {
13
13
  deleteFileAction,
14
14
  describeAction, deployAction, createByTemplateAction, initByTemplateAction,
15
15
  logoutAction, installFrontendPackageAction, modifyAction, downloadModifyAction,
16
- updateKnowledgeAction
16
+ updateKnowledgeAction, updateCliAction
17
17
  } = require('./actions');
18
18
 
19
19
 
@@ -155,11 +155,12 @@ This file will be automatically included when you run the 'openkbs modify' comma
155
155
  `);
156
156
 
157
157
  program
158
- .command('update')
159
- .argument('<target>', 'The target to update (currently supports: knowledge)')
160
- .description('Update project components from remote repository')
158
+ .command('update [target]')
159
+ .description('Update OpenKBS CLI or project components from remote repository')
161
160
  .action((target) => {
162
- if (target === 'knowledge') {
161
+ if (!target) {
162
+ updateCliAction();
163
+ } else if (target === 'knowledge') {
163
164
  updateKnowledgeAction();
164
165
  } else {
165
166
  console.error(`Unknown update target: ${target}. Currently supported: knowledge`);
@@ -168,10 +169,12 @@ program
168
169
  })
169
170
  .addHelpText('after', `
170
171
  Examples:
171
- $ openkbs update knowledge
172
+ $ openkbs update
173
+ This will check for CLI updates and install them if available.
172
174
 
173
- This will check if your local .openkbs/knowledge directory is up to date with the remote repository
174
- and update it if necessary.
175
+ $ openkbs update knowledge
176
+ This will check if your local .openkbs/knowledge directory is up to date with the remote repository
177
+ and update it if necessary.
175
178
  `);
176
179
 
177
180
  program.parse(process.argv);
package/version.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "version": "0.0.46",
3
+ "releaseDate": "2025-08-01",
4
+ "releaseNotes": "OpenKBS CLI version 0.0.46"
5
+ }