openvibe 0.63.1 → 0.63.2

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/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.63.2] - 2025-03-14
9
+
10
+ ### Changed
11
+
12
+ - **Version Check**: Removed 24-hour cache, now checks npm registry on every startup
13
+ - **Real-time Update Detection**: Always fetches latest version from npm registry for accurate update notifications
14
+
15
+ ---
16
+
8
17
  ## [0.63.1] - 2025-03-14
9
18
 
10
19
  ### Added
@@ -114,9 +123,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
114
123
 
115
124
  ---
116
125
 
126
+ [0.63.2]: https://github.com/boxiaolanya2008/openvibe/compare/v0.63.1...v0.63.2
127
+ [0.63.1]: https://github.com/boxiaolanya2008/openvibe/compare/v0.63.0...v0.63.1
117
128
  [0.63.0]: https://github.com/boxiaolanya2008/openvibe/compare/v0.62.0...v0.63.0
118
129
  [0.61.0]: https://github.com/boxiaolanya2008/openvibe/compare/v0.60.0...v0.61.0
119
130
  [0.60.0]: https://github.com/boxiaolanya2008/openvibe/compare/v0.59.0...v0.60.0
120
131
  [0.59.0]: https://github.com/boxiaolanya2008/openvibe/releases/tag/v0.59.0
121
- 60.0
122
- [0.59.0]: https://github.com/boxiaolanya2008/openvibe/releases/tag/v0.59.0
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAiFA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDrD","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\nconst CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\t// Read version from package.json\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\tconst cache = readCache();\n\tconst now = Date.now();\n\n\tlet latestVersion: string | null;\n\n\t// Use cached version if checked recently\n\tif (cache && now - cache.lastCheck < CHECK_INTERVAL) {\n\t\tlatestVersion = cache.latestVersion;\n\t} else {\n\t\t// Fetch from npm registry\n\t\tlatestVersion = await fetchLatestVersion();\n\t\tif (latestVersion) {\n\t\t\twriteCache({ lastCheck: now, latestVersion });\n\t\t}\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"│\") + \" \" + chalk.yellow(\"│\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
1
+ {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AA+EA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CrD","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\n\t// Always fetch from npm registry (no cache)\n\tconst latestVersion = await fetchLatestVersion();\n\n\tif (latestVersion) {\n\t\t// Still write to cache for other purposes (e.g., display last known version offline)\n\t\twriteCache({ lastCheck: Date.now(), latestVersion });\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"│\") + \" \" + chalk.yellow(\"│\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
@@ -4,9 +4,7 @@ import { homedir } from "os";
4
4
  import { join } from "path";
5
5
  const CACHE_DIR = join(homedir(), ".openvibe");
6
6
  const CACHE_FILE = join(CACHE_DIR, "version-check.json");
7
- const CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
8
7
  function getCurrentVersion() {
9
- // Read version from package.json
10
8
  try {
11
9
  const pkg = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf-8"));
12
10
  return pkg.version;
@@ -72,19 +70,11 @@ function writeCache(cache) {
72
70
  }
73
71
  export async function checkForUpdates() {
74
72
  const currentVersion = getCurrentVersion();
75
- const cache = readCache();
76
- const now = Date.now();
77
- let latestVersion;
78
- // Use cached version if checked recently
79
- if (cache && now - cache.lastCheck < CHECK_INTERVAL) {
80
- latestVersion = cache.latestVersion;
81
- }
82
- else {
83
- // Fetch from npm registry
84
- latestVersion = await fetchLatestVersion();
85
- if (latestVersion) {
86
- writeCache({ lastCheck: now, latestVersion });
87
- }
73
+ // Always fetch from npm registry (no cache)
74
+ const latestVersion = await fetchLatestVersion();
75
+ if (latestVersion) {
76
+ // Still write to cache for other purposes (e.g., display last known version offline)
77
+ writeCache({ lastCheck: Date.now(), latestVersion });
88
78
  }
89
79
  if (latestVersion && isNewer(currentVersion, latestVersion)) {
90
80
  console.log();
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\nconst CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\t// Read version from package.json\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\tconst cache = readCache();\n\tconst now = Date.now();\n\n\tlet latestVersion: string | null;\n\n\t// Use cached version if checked recently\n\tif (cache && now - cache.lastCheck < CHECK_INTERVAL) {\n\t\tlatestVersion = cache.latestVersion;\n\t} else {\n\t\t// Fetch from npm registry\n\t\tlatestVersion = await fetchLatestVersion();\n\t\tif (latestVersion) {\n\t\t\twriteCache({ lastCheck: now, latestVersion });\n\t\t}\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"│\") + \" \" + chalk.yellow(\"│\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nconst CACHE_DIR = join(homedir(), \".openvibe\");\nconst CACHE_FILE = join(CACHE_DIR, \"version-check.json\");\n\ninterface VersionCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\nfunction getCurrentVersion(): string {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"));\n\t\treturn pkg.version;\n\t} catch {\n\t\treturn \"0.0.0\";\n\t}\n}\n\nfunction parseVersion(version: string): number[] {\n\treturn version.split(\".\").map((v) => parseInt(v, 10));\n}\n\nfunction isNewer(current: string, latest: string): boolean {\n\tconst currentParts = parseVersion(current);\n\tconst latestParts = parseVersion(latest);\n\n\tfor (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n\t\tconst currentPart = currentParts[i] || 0;\n\t\tconst latestPart = latestParts[i] || 0;\n\t\tif (latestPart > currentPart) return true;\n\t\tif (latestPart < currentPart) return false;\n\t}\n\treturn false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\n\t\tconst response = await fetch(\"https://registry.npmjs.org/openvibe\", {\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!response.ok) return null;\n\n\t\tconst data = (await response.json()) as { \"dist-tags\"?: { latest?: string } };\n\t\treturn data[\"dist-tags\"]?.latest || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readCache(): VersionCache | null {\n\ttry {\n\t\tif (!existsSync(CACHE_FILE)) return null;\n\t\tconst content = readFileSync(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction writeCache(cache: VersionCache): void {\n\ttry {\n\t\tif (!existsSync(CACHE_DIR)) {\n\t\t\tmkdirSync(CACHE_DIR, { recursive: true });\n\t\t}\n\t\twriteFileSync(CACHE_FILE, JSON.stringify(cache));\n\t} catch {\n\t\t// Ignore cache write errors\n\t}\n}\n\nexport async function checkForUpdates(): Promise<void> {\n\tconst currentVersion = getCurrentVersion();\n\n\t// Always fetch from npm registry (no cache)\n\tconst latestVersion = await fetchLatestVersion();\n\n\tif (latestVersion) {\n\t\t// Still write to cache for other purposes (e.g., display last known version offline)\n\t\twriteCache({ lastCheck: Date.now(), latestVersion });\n\t}\n\n\tif (latestVersion && isNewer(currentVersion, latestVersion)) {\n\t\tconsole.log();\n\t\tconsole.log(chalk.yellow(\"┌─────────────────────────────────────────────────────────┐\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.bold(\"Update Available\") +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Current: ${chalk.gray(currentVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t` Latest: ${chalk.green(latestVersion)}` +\n\t\t\t\t\" \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"│\") + \" \" + chalk.yellow(\"│\"));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\"│\") +\n\t\t\t\t\" Run \" +\n\t\t\t\tchalk.cyan(\"npm i -g openvibe\") +\n\t\t\t\t\" to update \" +\n\t\t\t\tchalk.yellow(\"│\"),\n\t\t);\n\t\tconsole.log(chalk.yellow(\"└─────────────────────────────────────────────────────────┘\"));\n\t\tconsole.log();\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openvibe",
3
- "version": "0.63.1",
3
+ "version": "0.63.2",
4
4
  "description": "OpenVibe - AI Coding Assistant CLI",
5
5
  "type": "module",
6
6
  "piConfig": {