@mandors/cli 0.0.17 → 0.0.18

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/npm/lib/install.js +36 -20
  2. package/package.json +1 -1
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * @fileoverview Post-install hook for Mandor CLI
3
3
  * @description Downloads binary from GitHub releases during npm install
4
- * @version 0.0.3
4
+ * @version 0.0.4
5
5
  */
6
6
 
7
7
  const fs = require('fs');
8
8
  const path = require('path');
9
9
  const os = require('os');
10
10
  const { execSync } = require('child_process');
11
+ const https = require('https');
11
12
 
12
13
  const REPO = 'sanxzy/mandor';
13
14
  const GITHUB_API = 'https://api.github.com';
@@ -29,13 +30,39 @@ async function getLatestVersion(prerelease = false) {
29
30
  ? `${GITHUB_API}/repos/${REPO}/releases`
30
31
  : `${GITHUB_API}/repos/${REPO}/releases/latest`;
31
32
 
32
- const response = await fetch(url);
33
- if (!response.ok) {
34
- throw new Error(`Failed to fetch releases: ${response.statusText}`);
35
- }
36
- const data = await response.json();
37
- const tagName = Array.isArray(data) ? data[0].tag_name : data.tag_name;
38
- return tagName.replace(/^v/, '');
33
+ return new Promise((resolve, reject) => {
34
+ https.get(url, { headers: { 'User-Agent': 'Mandor-CLI' } }, (res) => {
35
+ let data = '';
36
+ res.on('data', chunk => data += chunk);
37
+ res.on('end', () => {
38
+ try {
39
+ const parsed = JSON.parse(data);
40
+ const tagName = Array.isArray(parsed) ? parsed[0].tag_name : parsed.tag_name;
41
+ resolve(tagName.replace(/^v/, ''));
42
+ } catch (e) {
43
+ reject(e);
44
+ }
45
+ });
46
+ }).on('error', reject);
47
+ });
48
+ }
49
+
50
+ function downloadFile(url, dest) {
51
+ return new Promise((resolve, reject) => {
52
+ const file = fs.createWriteStream(dest);
53
+ https.get(url, (res) => {
54
+ if (res.statusCode === 302 || res.statusCode === 301) {
55
+ return downloadFile(res.headers.location, dest).then(resolve).catch(reject);
56
+ }
57
+ res.pipe(file);
58
+ file.on('finish', () => {
59
+ file.close(resolve);
60
+ });
61
+ }).on('error', (err) => {
62
+ fs.unlink(dest, () => {});
63
+ reject(err);
64
+ });
65
+ });
39
66
  }
40
67
 
41
68
  async function install(options = {}) {
@@ -71,18 +98,7 @@ async function install(options = {}) {
71
98
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mandor-install-'));
72
99
  const tarball = path.join(tempDir, assetName);
73
100
 
74
- const response = await fetch(downloadUrl);
75
- if (!response.ok) {
76
- fs.rmSync(tempDir, { recursive: true });
77
- throw new Error(`Download failed: ${response.statusText} (${downloadUrl})`);
78
- }
79
-
80
- const file = fs.createWriteStream(tarball);
81
- await new Promise((resolve, reject) => {
82
- response.body.pipe(file);
83
- file.on('finish', resolve);
84
- file.on('error', reject);
85
- });
101
+ await downloadFile(downloadUrl, tarball);
86
102
 
87
103
  if (!fs.existsSync(cachePath)) {
88
104
  fs.mkdirSync(cachePath, { recursive: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mandors/cli",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "description": "Event-based task manager CLI for AI agent workflows",
5
5
  "main": "npm/lib/index.js",
6
6
  "bin": {