@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.
- package/dist/index.js +78 -6
- 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
|
|
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
|
|
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
|
-
|
|
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
|
+
}
|