vibecheck-agent 1.0.3 → 1.0.5

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 CHANGED
@@ -3,6 +3,7 @@ import { Command } from "commander";
3
3
  import path from "node:path";
4
4
  import { VibeAgent } from "./agent.js";
5
5
  import { DEFAULT_SERVER, RECONNECT_DELAY_MS } from "./config.js";
6
+ import { checkForUpdates } from "./updater.js";
6
7
  const program = new Command()
7
8
  .name("vibecheck-agent")
8
9
  .description("VibeCheck Agent - Remote control Claude Code from anywhere")
@@ -21,6 +22,18 @@ console.log(`New session: ${opts.newSession}`);
21
22
  console.log("");
22
23
  const agent = new VibeAgent(opts.key, workDir, opts.server, opts.newSession);
23
24
  async function main() {
25
+ // Auto-update on startup
26
+ const updated = await checkForUpdates();
27
+ if (updated) {
28
+ // Re-exec with the updated binary
29
+ const { spawn } = await import("node:child_process");
30
+ const child = spawn(process.argv[0], process.argv.slice(1), {
31
+ stdio: "inherit",
32
+ env: process.env,
33
+ });
34
+ child.on("exit", (code) => process.exit(code ?? 0));
35
+ return;
36
+ }
24
37
  while (true) {
25
38
  try {
26
39
  await agent.connect();
@@ -34,6 +47,18 @@ async function main() {
34
47
  }
35
48
  console.error(`[agent] Connection failed: ${error instanceof Error ? error.message : error}`);
36
49
  }
50
+ // Check for updates on each reconnect
51
+ const reconnectUpdated = await checkForUpdates();
52
+ if (reconnectUpdated) {
53
+ console.log("[agent] Re-launching with updated version...");
54
+ const { spawn } = await import("node:child_process");
55
+ const child = spawn(process.argv[0], process.argv.slice(1), {
56
+ stdio: "inherit",
57
+ env: process.env,
58
+ });
59
+ child.on("exit", (code) => process.exit(code ?? 0));
60
+ return;
61
+ }
37
62
  console.log(`[agent] Reconnecting in ${RECONNECT_DELAY_MS / 1000}s...`);
38
63
  await new Promise((r) => setTimeout(r, RECONNECT_DELAY_MS));
39
64
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function checkForUpdates(): Promise<boolean>;
@@ -0,0 +1,61 @@
1
+ import { execSync } from "node:child_process";
2
+ import { createRequire } from "node:module";
3
+ import { fileURLToPath } from "node:url";
4
+ import path from "node:path";
5
+ const require = createRequire(import.meta.url);
6
+ function getInstalledVersion() {
7
+ const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
8
+ const pkg = require(pkgPath);
9
+ return pkg.version;
10
+ }
11
+ function getLatestVersion() {
12
+ try {
13
+ const result = execSync("npm view vibecheck-agent version", {
14
+ encoding: "utf-8",
15
+ timeout: 10_000,
16
+ stdio: ["pipe", "pipe", "pipe"],
17
+ });
18
+ return result.trim();
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ function isNewer(latest, current) {
25
+ const [lMaj, lMin, lPat] = latest.split(".").map(Number);
26
+ const [cMaj, cMin, cPat] = current.split(".").map(Number);
27
+ if (lMaj !== cMaj)
28
+ return lMaj > cMaj;
29
+ if (lMin !== cMin)
30
+ return lMin > cMin;
31
+ return lPat > cPat;
32
+ }
33
+ export async function checkForUpdates() {
34
+ const current = getInstalledVersion();
35
+ console.log(`[updater] Current version: ${current}`);
36
+ const latest = getLatestVersion();
37
+ if (!latest) {
38
+ console.log("[updater] Could not check for updates, skipping");
39
+ return false;
40
+ }
41
+ if (!isNewer(latest, current)) {
42
+ console.log(`[updater] Already up to date (${current})`);
43
+ return false;
44
+ }
45
+ console.log(`[updater] New version available: ${current} → ${latest}`);
46
+ console.log("[updater] Updating...");
47
+ try {
48
+ execSync("npm install -g vibecheck-agent@latest", {
49
+ encoding: "utf-8",
50
+ timeout: 60_000,
51
+ stdio: "inherit",
52
+ });
53
+ console.log(`[updater] Updated to ${latest}. Restarting...`);
54
+ return true;
55
+ }
56
+ catch (error) {
57
+ console.error("[updater] Update failed:", error instanceof Error ? error.message : error);
58
+ return false;
59
+ }
60
+ }
61
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibecheck-agent",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "VibeCheck Agent - Remote control Claude Code from anywhere",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@ import { Command } from "commander";
4
4
  import path from "node:path";
5
5
  import { VibeAgent } from "./agent.js";
6
6
  import { DEFAULT_SERVER, RECONNECT_DELAY_MS } from "./config.js";
7
+ import { checkForUpdates } from "./updater.js";
7
8
 
8
9
  const program = new Command()
9
10
  .name("vibecheck-agent")
@@ -33,6 +34,19 @@ console.log("");
33
34
  const agent = new VibeAgent(opts.key, workDir, opts.server, opts.newSession);
34
35
 
35
36
  async function main(): Promise<void> {
37
+ // Auto-update on startup
38
+ const updated = await checkForUpdates();
39
+ if (updated) {
40
+ // Re-exec with the updated binary
41
+ const { spawn } = await import("node:child_process");
42
+ const child = spawn(process.argv[0], process.argv.slice(1), {
43
+ stdio: "inherit",
44
+ env: process.env,
45
+ });
46
+ child.on("exit", (code) => process.exit(code ?? 0));
47
+ return;
48
+ }
49
+
36
50
  while (true) {
37
51
  try {
38
52
  await agent.connect();
@@ -49,6 +63,18 @@ async function main(): Promise<void> {
49
63
  `[agent] Connection failed: ${error instanceof Error ? error.message : error}`,
50
64
  );
51
65
  }
66
+ // Check for updates on each reconnect
67
+ const reconnectUpdated = await checkForUpdates();
68
+ if (reconnectUpdated) {
69
+ console.log("[agent] Re-launching with updated version...");
70
+ const { spawn } = await import("node:child_process");
71
+ const child = spawn(process.argv[0], process.argv.slice(1), {
72
+ stdio: "inherit",
73
+ env: process.env,
74
+ });
75
+ child.on("exit", (code) => process.exit(code ?? 0));
76
+ return;
77
+ }
52
78
  console.log(
53
79
  `[agent] Reconnecting in ${RECONNECT_DELAY_MS / 1000}s...`,
54
80
  );
package/src/updater.ts ADDED
@@ -0,0 +1,72 @@
1
+ import { execSync } from "node:child_process";
2
+ import { createRequire } from "node:module";
3
+ import { fileURLToPath } from "node:url";
4
+ import path from "node:path";
5
+
6
+ const require = createRequire(import.meta.url);
7
+
8
+ function getInstalledVersion(): string {
9
+ const pkgPath = path.resolve(
10
+ path.dirname(fileURLToPath(import.meta.url)),
11
+ "..",
12
+ "package.json",
13
+ );
14
+ const pkg = require(pkgPath);
15
+ return pkg.version;
16
+ }
17
+
18
+ function getLatestVersion(): string | null {
19
+ try {
20
+ const result = execSync("npm view vibecheck-agent version", {
21
+ encoding: "utf-8",
22
+ timeout: 10_000,
23
+ stdio: ["pipe", "pipe", "pipe"],
24
+ });
25
+ return result.trim();
26
+ } catch {
27
+ return null;
28
+ }
29
+ }
30
+
31
+ function isNewer(latest: string, current: string): boolean {
32
+ const [lMaj, lMin, lPat] = latest.split(".").map(Number);
33
+ const [cMaj, cMin, cPat] = current.split(".").map(Number);
34
+ if (lMaj !== cMaj) return lMaj > cMaj;
35
+ if (lMin !== cMin) return lMin > cMin;
36
+ return lPat > cPat;
37
+ }
38
+
39
+ export async function checkForUpdates(): Promise<boolean> {
40
+ const current = getInstalledVersion();
41
+ console.log(`[updater] Current version: ${current}`);
42
+
43
+ const latest = getLatestVersion();
44
+ if (!latest) {
45
+ console.log("[updater] Could not check for updates, skipping");
46
+ return false;
47
+ }
48
+
49
+ if (!isNewer(latest, current)) {
50
+ console.log(`[updater] Already up to date (${current})`);
51
+ return false;
52
+ }
53
+
54
+ console.log(`[updater] New version available: ${current} → ${latest}`);
55
+ console.log("[updater] Updating...");
56
+
57
+ try {
58
+ execSync("npm install -g vibecheck-agent@latest", {
59
+ encoding: "utf-8",
60
+ timeout: 60_000,
61
+ stdio: "inherit",
62
+ });
63
+ console.log(`[updater] Updated to ${latest}. Restarting...`);
64
+ return true;
65
+ } catch (error) {
66
+ console.error(
67
+ "[updater] Update failed:",
68
+ error instanceof Error ? error.message : error,
69
+ );
70
+ return false;
71
+ }
72
+ }