@sicario-labs/kode 3.3.0 → 3.3.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/install.js +70 -20
  2. package/package.json +1 -1
package/install.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const { spawnSync } = require("child_process");
2
- const { existsSync, chmodSync, mkdirSync, writeFileSync } = require("fs");
2
+ const { existsSync, chmodSync, mkdirSync, createWriteStream } = require("fs");
3
3
  const { join } = require("path");
4
4
  const https = require("https");
5
5
 
@@ -27,7 +27,6 @@ if (!plat || !arch) {
27
27
  }
28
28
 
29
29
  const binaryName = `kode-${plat.os}-${arch}${plat.ext}`;
30
- const url = `https://github.com/${repo}/releases/download/v${version}/${binaryName}`;
31
30
  const installDir = join(__dirname, "bin");
32
31
  const binaryPath = join(installDir, `kode${plat.ext}`);
33
32
 
@@ -35,25 +34,76 @@ if (existsSync(binaryPath)) {
35
34
  process.exit(0);
36
35
  }
37
36
 
37
+ mkDir(installDir);
38
+
38
39
  console.log(`Downloading Kode v${version} (${binaryName})...`);
39
40
 
40
- mkdirSync(installDir, { recursive: true });
41
-
42
- const file = require("fs").createWriteStream(binaryPath);
43
-
44
- https.get(url, (res) => {
45
- if (res.statusCode !== 200) {
46
- console.error(`Download failed (HTTP ${res.statusCode})`);
47
- console.error(`URL: ${url}`);
48
- process.exit(1);
49
- }
50
- res.pipe(file);
51
- file.on("finish", () => {
52
- file.close();
53
- try { chmodSync(binaryPath, 0o755); } catch {}
54
- console.log(`Kode v${version} installed to ${binaryPath}`);
55
- });
56
- }).on("error", (err) => {
57
- console.error(`Download error: ${err.message}`);
41
+ // Try versioned URL first, fall back to API-resolved latest URL
42
+ const versionedURL = `https://github.com/${repo}/releases/download/v${version}/${binaryName}`;
43
+ const latestURL = `https://api.github.com/repos/${repo}/releases/latest`;
44
+
45
+ download(versionedURL).catch(() => {
46
+ // Fallback: resolve latest release asset URL via API
47
+ return resolveLatestAsset(binaryName).then(download);
48
+ }).then(() => {
49
+ try { chmodSync(binaryPath, 0o755); } catch {}
50
+ console.log(`Kode v${version} installed to ${binaryPath}`);
51
+ }).catch((err) => {
52
+ console.error(`Download failed: ${err.message}`);
53
+ console.error(`Tried:\n ${versionedURL}\n (latest release via API)`);
58
54
  process.exit(1);
59
55
  });
56
+
57
+ function mkDir(dir) {
58
+ try { mkdirSync(dir, { recursive: true }); } catch {}
59
+ }
60
+
61
+ function download(url) {
62
+ return new Promise((resolve, reject) => {
63
+ const file = createWriteStream(binaryPath);
64
+ https.get(url, { headers: { "User-Agent": "kode-installer" } }, (res) => {
65
+ // Follow redirects manually (GitHub CDN may return 302)
66
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
67
+ file.close();
68
+ download(res.headers.location).then(resolve, reject);
69
+ return;
70
+ }
71
+ if (res.statusCode !== 200) {
72
+ file.close();
73
+ reject(new Error(`HTTP ${res.statusCode}`));
74
+ return;
75
+ }
76
+ res.pipe(file);
77
+ file.on("finish", () => { file.close(); resolve(); });
78
+ }).on("error", (err) => {
79
+ file.close();
80
+ reject(err);
81
+ });
82
+ });
83
+ }
84
+
85
+ function resolveLatestAsset(assetName) {
86
+ return new Promise((resolve, reject) => {
87
+ https.get(latestURL, { headers: { "User-Agent": "kode-installer", "Accept": "application/json" } }, (res) => {
88
+ let body = "";
89
+ res.on("data", (chunk) => body += chunk);
90
+ res.on("end", () => {
91
+ try {
92
+ const release = JSON.parse(body);
93
+ if (!release.assets) {
94
+ reject(new Error("no assets in latest release"));
95
+ return;
96
+ }
97
+ const asset = release.assets.find(a => a.name === assetName);
98
+ if (!asset) {
99
+ reject(new Error(`asset ${assetName} not found in latest release`));
100
+ return;
101
+ }
102
+ resolve(asset.browser_download_url);
103
+ } catch (e) {
104
+ reject(e);
105
+ }
106
+ });
107
+ }).on("error", reject);
108
+ });
109
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sicario-labs/kode",
3
- "version": "3.3.0",
3
+ "version": "3.3.1",
4
4
  "description": "The safe AI coding agent — zero-config, gatekeeper-verified patches",
5
5
  "bin": {
6
6
  "kode": "cli.js"