@neuvybe/jarvis 0.1.1 → 0.2.1

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.
Files changed (2) hide show
  1. package/dist/index.js +78 -6
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -57,6 +57,73 @@ var Logger = class {
57
57
  };
58
58
  var logger = new Logger();
59
59
 
60
+ // src/upgrade.ts
61
+ import { execSync } from "node:child_process";
62
+ var PACKAGE_NAME = "@neuvybe/jarvis";
63
+ var REGISTRY_TIMEOUT_MS = 3e3;
64
+ var SAFE_VERSION = /^[0-9A-Za-z.\-+]+$/;
65
+ function isNewer(latest, current) {
66
+ const parse = (v) => (v.split("-")[0] ?? "").split(".").map((n) => Number.parseInt(n, 10) || 0);
67
+ const a = parse(latest);
68
+ const b = parse(current);
69
+ for (let i = 0; i < Math.max(a.length, b.length); i++) {
70
+ const x = a[i] ?? 0;
71
+ const y = b[i] ?? 0;
72
+ if (x !== y) return x > y;
73
+ }
74
+ return false;
75
+ }
76
+ async function fetchLatestVersion() {
77
+ try {
78
+ const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
79
+ headers: { accept: "application/json" },
80
+ signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS)
81
+ });
82
+ if (!res.ok) return null;
83
+ const data = await res.json();
84
+ return typeof data.version === "string" ? data.version : null;
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
89
+ async function runStatus(currentVersion) {
90
+ logger.info(`jarvis ${currentVersion}`);
91
+ const latest = await fetchLatestVersion();
92
+ if (latest === null) {
93
+ logger.info("could not check for updates (offline?)");
94
+ } else if (isNewer(latest, currentVersion)) {
95
+ logger.info(`update available: ${currentVersion} -> ${latest} (run: jarvis upgrade)`);
96
+ } else {
97
+ logger.info("up to date");
98
+ }
99
+ return 0;
100
+ }
101
+ async function runUpgrade(currentVersion) {
102
+ logger.info("checking for updates...");
103
+ const latest = await fetchLatestVersion();
104
+ if (latest === null) {
105
+ logger.warn("could not reach the npm registry; try again later");
106
+ return 1;
107
+ }
108
+ if (!isNewer(latest, currentVersion)) {
109
+ logger.info(`already on the latest version (${currentVersion})`);
110
+ return 0;
111
+ }
112
+ if (!SAFE_VERSION.test(latest)) {
113
+ logger.error(`refusing to install unexpected version string: ${latest}`);
114
+ return 1;
115
+ }
116
+ logger.info(`upgrading ${currentVersion} -> ${latest}...`);
117
+ try {
118
+ execSync(`npm install -g ${PACKAGE_NAME}@${latest}`, { stdio: "inherit" });
119
+ } catch {
120
+ logger.error(`upgrade failed; run manually: npm install -g ${PACKAGE_NAME}@latest`);
121
+ return 1;
122
+ }
123
+ logger.info(`upgraded to ${latest}. run "jarvis --version" to confirm.`);
124
+ return 0;
125
+ }
126
+
60
127
  // src/index.ts
61
128
  var COMMANDS = [
62
129
  "init",
@@ -80,10 +147,10 @@ Commands:
80
147
  start Start the local core service
81
148
  stop Stop the local core service
82
149
  restart Restart the local core service
83
- status Show service/core/config status
150
+ status Show version and check for updates
84
151
  doctor Run diagnostics
85
152
  devices List audio devices
86
- upgrade Upgrade the installed CLI/core
153
+ upgrade Upgrade the installed CLI to the latest published version
87
154
  config Inspect/edit configuration
88
155
 
89
156
  Options:
@@ -110,13 +177,11 @@ var STUB_MESSAGES = {
110
177
  start: "starting...",
111
178
  stop: "stopping...",
112
179
  restart: "restarting...",
113
- status: "status: not implemented yet",
114
180
  doctor: "running diagnostics...",
115
181
  devices: "listing devices...",
116
- upgrade: "checking for upgrades...",
117
182
  config: "config: not implemented yet"
118
183
  };
119
- function run(argv) {
184
+ async function run(argv) {
120
185
  let command;
121
186
  let project;
122
187
  let textOnly = false;
@@ -177,7 +242,14 @@ ${USAGE}`);
177
242
  ${USAGE}`);
178
243
  return 1;
179
244
  }
245
+ if (command === "status") return runStatus(readVersion());
246
+ if (command === "upgrade") return runUpgrade(readVersion());
180
247
  logger.info(STUB_MESSAGES[command]);
181
248
  return 0;
182
249
  }
183
- process.exitCode = run(process.argv.slice(2));
250
+ try {
251
+ process.exitCode = await run(process.argv.slice(2));
252
+ } catch (error) {
253
+ logger.error("jarvis failed", { error });
254
+ process.exitCode = 1;
255
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neuvybe/jarvis",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Jarvis - a voice-first personal agent (CLI).",