agent-army 0.1.6 → 0.1.8
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/adapters/api-adapter.js +4 -5
- package/dist/adapters/api-adapter.js.map +1 -1
- package/dist/adapters/cli-adapter.js +6 -5
- package/dist/adapters/cli-adapter.js.map +1 -1
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.js +110 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/lib/exec.d.ts +4 -2
- package/dist/lib/exec.js +10 -7
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/prerequisites.js +7 -4
- package/dist/lib/prerequisites.js.map +1 -1
- package/dist/lib/update-check.d.ts +8 -0
- package/dist/lib/update-check.js +147 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/vendor.d.ts +34 -0
- package/dist/lib/vendor.js +128 -0
- package/dist/lib/vendor.js.map +1 -0
- package/package.json +5 -3
- package/scripts/postinstall.mjs +395 -0
|
@@ -9,14 +9,16 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.APIAdapterCancelError = exports.APIAdapterValidationError = exports.APIAdapterNeedsInputError = void 0;
|
|
11
11
|
exports.createAPIAdapter = createAPIAdapter;
|
|
12
|
+
const vendor_1 = require("../lib/vendor");
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Execution Adapter Implementation
|
|
14
15
|
// ============================================================================
|
|
15
16
|
class APIExecAdapter {
|
|
16
17
|
capture(command, args = [], cwd) {
|
|
17
18
|
const { execFileSync } = require("child_process");
|
|
19
|
+
const resolved = (0, vendor_1.resolveCommand)(command);
|
|
18
20
|
try {
|
|
19
|
-
const result = execFileSync(
|
|
21
|
+
const result = execFileSync(resolved, args, {
|
|
20
22
|
cwd,
|
|
21
23
|
encoding: "utf-8",
|
|
22
24
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -38,10 +40,7 @@ class APIExecAdapter {
|
|
|
38
40
|
return result.exitCode;
|
|
39
41
|
}
|
|
40
42
|
commandExists(command) {
|
|
41
|
-
|
|
42
|
-
const bin = process.platform === "win32" ? "where" : "which";
|
|
43
|
-
const result = spawnSync(bin, [command], { shell: false, stdio: "ignore" });
|
|
44
|
-
return result.status === 0;
|
|
43
|
+
return (0, vendor_1.commandExistsWithVendor)(command);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
// ============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-adapter.js","sourceRoot":"","sources":["../../adapters/api-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"api-adapter.js","sourceRoot":"","sources":["../../adapters/api-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,13 +48,15 @@ const p = __importStar(require("@clack/prompts"));
|
|
|
48
48
|
const picocolors_1 = __importDefault(require("picocolors"));
|
|
49
49
|
const child_process_1 = require("child_process");
|
|
50
50
|
const process_1 = require("../lib/process");
|
|
51
|
+
const vendor_1 = require("../lib/vendor");
|
|
51
52
|
// ============================================================================
|
|
52
53
|
// Execution Adapter Implementation
|
|
53
54
|
// ============================================================================
|
|
54
55
|
class CLIExecAdapter {
|
|
55
56
|
capture(command, args = [], cwd) {
|
|
57
|
+
const resolved = (0, vendor_1.resolveCommand)(command);
|
|
56
58
|
try {
|
|
57
|
-
const result = (0, child_process_1.execSync)([
|
|
59
|
+
const result = (0, child_process_1.execSync)([resolved, ...args].join(" "), {
|
|
58
60
|
cwd,
|
|
59
61
|
encoding: "utf-8",
|
|
60
62
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -71,13 +73,14 @@ class CLIExecAdapter {
|
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
stream(command, args = [], options) {
|
|
76
|
+
const resolved = (0, vendor_1.resolveCommand)(command);
|
|
74
77
|
return new Promise((resolve) => {
|
|
75
78
|
const opts = {
|
|
76
79
|
cwd: options?.cwd,
|
|
77
80
|
stdio: options?.capture ? "pipe" : "inherit",
|
|
78
81
|
shell: true,
|
|
79
82
|
};
|
|
80
|
-
const child = (0, child_process_1.spawn)(
|
|
83
|
+
const child = (0, child_process_1.spawn)(resolved, args, opts);
|
|
81
84
|
(0, process_1.trackChild)(child);
|
|
82
85
|
child.on("close", (code) => resolve(code ?? 1));
|
|
83
86
|
child.on("error", (err) => {
|
|
@@ -87,9 +90,7 @@ class CLIExecAdapter {
|
|
|
87
90
|
});
|
|
88
91
|
}
|
|
89
92
|
commandExists(command) {
|
|
90
|
-
|
|
91
|
-
const result = (0, child_process_1.spawnSync)(bin, [command], { shell: false, stdio: "ignore" });
|
|
92
|
-
return result.status === 0;
|
|
93
|
+
return (0, vendor_1.commandExistsWithVendor)(command);
|
|
93
94
|
}
|
|
94
95
|
}
|
|
95
96
|
// ============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../../adapters/cli-adapter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../../adapters/cli-adapter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4LH,4CAMC;AAhMD,kDAAoC;AACpC,4DAA4B;AAC5B,iDAA8E;AAC9E,4CAA4C;AAC5C,0CAAwE;AAcxE,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,MAAM,cAAc;IAClB,OAAO,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,GAAY;QACxD,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACrD,GAAG;gBACH,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAA4D,CAAC;YACvE,OAAO;gBACL,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;gBAC1C,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;gBAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,OAAuB;QAClE,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAiB;gBACzB,GAAG,EAAE,OAAO,EAAE,GAAG;gBACjB,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAC5C,KAAK,EAAE,IAAI;aACZ,CAAC;YACF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC;YAClB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,OAAO,IAAA,gCAAuB,EAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E,MAAM,YAAY;IAChB,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,oBAAE,CAAC,MAAM,CAAC,oBAAE,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,KAAc;QAClC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,GAAG,GAAG;QACJ,IAAI,CAAC,OAAe;YAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,OAAe;YAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,OAAe;YACrB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,OAAe;YAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,OAAe;YACnB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAgB,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAiB,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,OAAyB;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,8DAA8D;YAC9D,OAAO,EAAE,OAAO,CAAC,OAAc;YAC/B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW,CAAI,OAA8B;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC;YACjC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,8DAA8D;YAC9D,OAAO,EAAE,OAAO,CAAC,OAAc;YAC/B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAa,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO;YACL,IAAI,CAAC,GAAY,EAAE,IAAa;gBAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAW;gBACjB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,OAAO;QACL,EAAE,EAAE,IAAI,YAAY,EAAE;QACtB,IAAI,EAAE,IAAI,cAAc,EAAE;QAC1B,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACU,QAAA,UAAU,GAAG,gBAAgB,EAAE,CAAC"}
|
package/dist/bin.js
CHANGED
|
@@ -51,6 +51,8 @@ const ssh_1 = require("./commands/ssh");
|
|
|
51
51
|
const validate_1 = require("./commands/validate");
|
|
52
52
|
const destroy_1 = require("./commands/destroy");
|
|
53
53
|
const list_1 = require("./commands/list");
|
|
54
|
+
const update_1 = require("./commands/update");
|
|
55
|
+
const update_check_1 = require("./lib/update-check");
|
|
54
56
|
// Forward SIGINT/SIGTERM to child processes before exiting
|
|
55
57
|
(0, process_1.setupGracefulShutdown)();
|
|
56
58
|
// Read version from package.json so it stays in sync with npm publish
|
|
@@ -116,5 +118,13 @@ program
|
|
|
116
118
|
.action(async (opts) => {
|
|
117
119
|
await (0, list_1.listCommand)(opts);
|
|
118
120
|
});
|
|
121
|
+
program
|
|
122
|
+
.command("update")
|
|
123
|
+
.description("Update agent-army CLI to the latest version")
|
|
124
|
+
.action(async (opts) => {
|
|
125
|
+
await (0, update_1.updateCommand)(opts);
|
|
126
|
+
});
|
|
119
127
|
program.parse();
|
|
128
|
+
// Fire-and-forget update check — never blocks exit
|
|
129
|
+
(0, update_check_1.checkForUpdates)(pkgJson.version).catch(() => { });
|
|
120
130
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,yCAAoC;AACpC,2CAAsD;AACtD,0CAA8C;AAC9C,8CAAkD;AAClD,8CAAkD;AAClD,wCAA4C;AAC5C,kDAAsD;AACtD,gDAAoD;AACpD,0CAA8C;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Update the agent-army CLI to the latest version
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.updateCommand = updateCommand;
|
|
43
|
+
const p = __importStar(require("@clack/prompts"));
|
|
44
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
45
|
+
const exec_1 = require("../lib/exec");
|
|
46
|
+
async function updateCommand(_opts) {
|
|
47
|
+
p.intro(picocolors_1.default.bgCyan(picocolors_1.default.black(" Agent Army — Update ")));
|
|
48
|
+
const s = p.spinner();
|
|
49
|
+
s.start("Checking npm for latest version…");
|
|
50
|
+
// Fetch latest version info
|
|
51
|
+
const { default: https } = await Promise.resolve().then(() => __importStar(require("https")));
|
|
52
|
+
const latest = await new Promise((resolve) => {
|
|
53
|
+
const req = https.get("https://registry.npmjs.org/agent-army/latest", { timeout: 5000 }, (res) => {
|
|
54
|
+
let data = "";
|
|
55
|
+
res.on("data", (chunk) => (data += chunk));
|
|
56
|
+
res.on("end", () => {
|
|
57
|
+
try {
|
|
58
|
+
resolve(JSON.parse(data).version ?? null);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
resolve(null);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
req.on("timeout", () => { req.destroy(); resolve(null); });
|
|
66
|
+
req.on("error", () => resolve(null));
|
|
67
|
+
});
|
|
68
|
+
if (!latest) {
|
|
69
|
+
s.stop("Failed to reach npm registry");
|
|
70
|
+
p.log.error("Could not check for updates. Check your internet connection.");
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
// Read current version
|
|
74
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
75
|
+
const path = await Promise.resolve().then(() => __importStar(require("path")));
|
|
76
|
+
const pkgJson = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"));
|
|
77
|
+
const current = pkgJson.version;
|
|
78
|
+
s.stop(`Current: ${picocolors_1.default.dim(current)} Latest: ${picocolors_1.default.green(latest)}`);
|
|
79
|
+
// Compare versions
|
|
80
|
+
const cParts = current.split(".").map(Number);
|
|
81
|
+
const lParts = latest.split(".").map(Number);
|
|
82
|
+
let isOutdated = false;
|
|
83
|
+
for (let i = 0; i < 3; i++) {
|
|
84
|
+
if ((lParts[i] ?? 0) > (cParts[i] ?? 0)) {
|
|
85
|
+
isOutdated = true;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if ((lParts[i] ?? 0) < (cParts[i] ?? 0))
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (!isOutdated) {
|
|
92
|
+
p.log.success("You're already on the latest version!");
|
|
93
|
+
p.outro("Done");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
p.log.step(`Updating ${picocolors_1.default.dim(current)} → ${picocolors_1.default.green(latest)}`);
|
|
97
|
+
console.log();
|
|
98
|
+
const exitCode = await (0, exec_1.stream)("npm", ["install", "-g", `agent-army@${latest}`]);
|
|
99
|
+
console.log();
|
|
100
|
+
if (exitCode === 0) {
|
|
101
|
+
p.log.success(`Updated to ${picocolors_1.default.green(latest)}`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
p.log.error("Update failed. You may need to run with sudo:");
|
|
105
|
+
p.log.message(` sudo npm install -g agent-army@${latest}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
p.outro("Done");
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/exec.d.ts
CHANGED
|
@@ -8,15 +8,17 @@ export interface ExecResult {
|
|
|
8
8
|
exitCode: number;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Execute a command and capture output
|
|
11
|
+
* Execute a command and capture output.
|
|
12
|
+
* Resolves vendored binaries before falling back to system PATH.
|
|
12
13
|
*/
|
|
13
14
|
export declare function capture(command: string, args?: string[], cwd?: string): ExecResult;
|
|
14
15
|
/**
|
|
15
16
|
* Execute a command with streaming output (stdout/stderr pass-through)
|
|
16
17
|
* Returns the exit code.
|
|
18
|
+
* Resolves vendored binaries before falling back to system PATH.
|
|
17
19
|
*/
|
|
18
20
|
export declare function stream(command: string, args?: string[], cwd?: string): Promise<number>;
|
|
19
21
|
/**
|
|
20
|
-
* Check if a command exists
|
|
22
|
+
* Check if a command exists, checking vendor directory first, then system PATH.
|
|
21
23
|
*/
|
|
22
24
|
export declare function commandExists(command: string): boolean;
|
package/dist/lib/exec.js
CHANGED
|
@@ -8,12 +8,15 @@ exports.stream = stream;
|
|
|
8
8
|
exports.commandExists = commandExists;
|
|
9
9
|
const child_process_1 = require("child_process");
|
|
10
10
|
const process_1 = require("./process");
|
|
11
|
+
const vendor_1 = require("./vendor");
|
|
11
12
|
/**
|
|
12
|
-
* Execute a command and capture output
|
|
13
|
+
* Execute a command and capture output.
|
|
14
|
+
* Resolves vendored binaries before falling back to system PATH.
|
|
13
15
|
*/
|
|
14
16
|
function capture(command, args = [], cwd) {
|
|
17
|
+
const resolved = (0, vendor_1.resolveCommand)(command);
|
|
15
18
|
try {
|
|
16
|
-
const result = (0, child_process_1.execSync)([
|
|
19
|
+
const result = (0, child_process_1.execSync)([resolved, ...args].join(" "), {
|
|
17
20
|
cwd,
|
|
18
21
|
encoding: "utf-8",
|
|
19
22
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -32,15 +35,17 @@ function capture(command, args = [], cwd) {
|
|
|
32
35
|
/**
|
|
33
36
|
* Execute a command with streaming output (stdout/stderr pass-through)
|
|
34
37
|
* Returns the exit code.
|
|
38
|
+
* Resolves vendored binaries before falling back to system PATH.
|
|
35
39
|
*/
|
|
36
40
|
function stream(command, args = [], cwd) {
|
|
41
|
+
const resolved = (0, vendor_1.resolveCommand)(command);
|
|
37
42
|
return new Promise((resolve) => {
|
|
38
43
|
const opts = {
|
|
39
44
|
cwd,
|
|
40
45
|
stdio: "inherit",
|
|
41
46
|
shell: true,
|
|
42
47
|
};
|
|
43
|
-
const child = (0, child_process_1.spawn)(
|
|
48
|
+
const child = (0, child_process_1.spawn)(resolved, args, opts);
|
|
44
49
|
(0, process_1.trackChild)(child);
|
|
45
50
|
child.on("close", (code) => resolve(code ?? 1));
|
|
46
51
|
child.on("error", (err) => {
|
|
@@ -50,11 +55,9 @@ function stream(command, args = [], cwd) {
|
|
|
50
55
|
});
|
|
51
56
|
}
|
|
52
57
|
/**
|
|
53
|
-
* Check if a command exists
|
|
58
|
+
* Check if a command exists, checking vendor directory first, then system PATH.
|
|
54
59
|
*/
|
|
55
60
|
function commandExists(command) {
|
|
56
|
-
|
|
57
|
-
const result = (0, child_process_1.spawnSync)(bin, [command], { shell: false, stdio: "ignore" });
|
|
58
|
-
return result.status === 0;
|
|
61
|
+
return (0, vendor_1.commandExistsWithVendor)(command);
|
|
59
62
|
}
|
|
60
63
|
//# sourceMappingURL=exec.js.map
|
package/dist/lib/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../lib/exec.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../lib/exec.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiBH,0BAiBC;AAOD,wBAgBC;AAKD,sCAEC;AA9DD,iDAAmE;AACnE,uCAAuC;AACvC,qCAAmE;AASnE;;;GAGG;AACH,SAAgB,OAAO,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,GAAY;IACxE,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACrD,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAA4D,CAAC;QACvE,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC1C,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;SACxB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,MAAM,CAAC,OAAe,EAAE,OAAiB,EAAE,EAAE,GAAY;IACvE,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAiB;YACzB,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAA,oBAAU,EAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAA,gCAAuB,EAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.checkPrerequisites = checkPrerequisites;
|
|
40
40
|
const p = __importStar(require("@clack/prompts"));
|
|
41
41
|
const exec_1 = require("./exec");
|
|
42
|
+
const vendor_1 = require("./vendor");
|
|
42
43
|
const workspace_1 = require("./workspace");
|
|
43
44
|
/**
|
|
44
45
|
* Run all prerequisite checks and display results.
|
|
@@ -49,14 +50,15 @@ async function checkPrerequisites() {
|
|
|
49
50
|
// Pulumi CLI
|
|
50
51
|
if ((0, exec_1.commandExists)("pulumi")) {
|
|
51
52
|
const ver = (0, exec_1.capture)("pulumi", ["version"]);
|
|
52
|
-
|
|
53
|
+
const source = (0, vendor_1.isVendored)("pulumi") ? "vendored" : "system";
|
|
54
|
+
results.push({ name: "Pulumi", ok: true, message: `found (${ver.stdout}, ${source})` });
|
|
53
55
|
}
|
|
54
56
|
else {
|
|
55
57
|
results.push({
|
|
56
58
|
name: "Pulumi",
|
|
57
59
|
ok: false,
|
|
58
60
|
message: "not found",
|
|
59
|
-
hint: "Install from https://www.pulumi.com/docs/iac/download-install/",
|
|
61
|
+
hint: "Install from https://www.pulumi.com/docs/iac/download-install/ or run `npm install` to vendor automatically",
|
|
60
62
|
});
|
|
61
63
|
}
|
|
62
64
|
// Node.js 18+
|
|
@@ -85,14 +87,15 @@ async function checkPrerequisites() {
|
|
|
85
87
|
}
|
|
86
88
|
// AWS CLI
|
|
87
89
|
if ((0, exec_1.commandExists)("aws")) {
|
|
88
|
-
|
|
90
|
+
const source = (0, vendor_1.isVendored)("aws") ? "vendored" : "system";
|
|
91
|
+
results.push({ name: "AWS CLI", ok: true, message: `found (${source})` });
|
|
89
92
|
}
|
|
90
93
|
else {
|
|
91
94
|
results.push({
|
|
92
95
|
name: "AWS CLI",
|
|
93
96
|
ok: false,
|
|
94
97
|
message: "not found",
|
|
95
|
-
hint: "Install from https://aws.amazon.com/cli/",
|
|
98
|
+
hint: "Install from https://aws.amazon.com/cli/ or run `npm install` to vendor automatically",
|
|
96
99
|
});
|
|
97
100
|
}
|
|
98
101
|
// pnpm (only required in dev mode — installed mode uses npm in the workspace)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../lib/prerequisites.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../lib/prerequisites.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,gDAkFC;AA5FD,kDAAoC;AAEpC,iCAAgD;AAChD,qCAAsC;AACtC,2CAAwC;AAExC;;;GAGG;AACI,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,aAAa;IACb,IAAI,IAAA,oBAAa,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,6GAA6G;SACpH,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACd,IAAI,IAAA,oBAAa,EAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,aAAa;gBACnC,IAAI,EAAE,wDAAwD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,kCAAkC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;IACV,IAAI,IAAA,oBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,uFAAuF;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,IAAI,IAAA,qBAAS,GAAE,EAAE,CAAC;QAChB,IAAI,IAAA,oBAAa,EAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,mCAAmC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background update notifier — checks npm for newer versions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check for updates and print a notice if a newer version is available.
|
|
6
|
+
* Non-blocking — errors are silently ignored.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkForUpdates(currentVersion: string): Promise<void>;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Background update notifier — checks npm for newer versions
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.checkForUpdates = checkForUpdates;
|
|
43
|
+
const https = __importStar(require("https"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
48
|
+
const PACKAGE_NAME = "agent-army";
|
|
49
|
+
const CACHE_FILE = ".update-check.json";
|
|
50
|
+
const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
51
|
+
const FETCH_TIMEOUT_MS = 3000;
|
|
52
|
+
function getCacheDir() {
|
|
53
|
+
return path.join(os.homedir(), ".agent-army");
|
|
54
|
+
}
|
|
55
|
+
function getCachePath() {
|
|
56
|
+
return path.join(getCacheDir(), CACHE_FILE);
|
|
57
|
+
}
|
|
58
|
+
function loadCache() {
|
|
59
|
+
try {
|
|
60
|
+
const raw = fs.readFileSync(getCachePath(), "utf-8");
|
|
61
|
+
return JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function saveCache(cache) {
|
|
68
|
+
const dir = getCacheDir();
|
|
69
|
+
if (!fs.existsSync(dir)) {
|
|
70
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
71
|
+
}
|
|
72
|
+
fs.writeFileSync(getCachePath(), JSON.stringify(cache), "utf-8");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Compare two semver strings. Returns:
|
|
76
|
+
* 1 if a > b, -1 if a < b, 0 if equal
|
|
77
|
+
*/
|
|
78
|
+
function compareSemver(a, b) {
|
|
79
|
+
const pa = a.split(".").map(Number);
|
|
80
|
+
const pb = b.split(".").map(Number);
|
|
81
|
+
for (let i = 0; i < 3; i++) {
|
|
82
|
+
const na = pa[i] ?? 0;
|
|
83
|
+
const nb = pb[i] ?? 0;
|
|
84
|
+
if (na > nb)
|
|
85
|
+
return 1;
|
|
86
|
+
if (na < nb)
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
function fetchLatestVersion() {
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const req = https.get(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { timeout: FETCH_TIMEOUT_MS }, (res) => {
|
|
94
|
+
let data = "";
|
|
95
|
+
res.on("data", (chunk) => (data += chunk));
|
|
96
|
+
res.on("end", () => {
|
|
97
|
+
try {
|
|
98
|
+
const json = JSON.parse(data);
|
|
99
|
+
resolve(json.version ?? null);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
resolve(null);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
req.on("timeout", () => {
|
|
107
|
+
req.destroy();
|
|
108
|
+
resolve(null);
|
|
109
|
+
});
|
|
110
|
+
req.on("error", () => resolve(null));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check for updates and print a notice if a newer version is available.
|
|
115
|
+
* Non-blocking — errors are silently ignored.
|
|
116
|
+
*/
|
|
117
|
+
async function checkForUpdates(currentVersion) {
|
|
118
|
+
try {
|
|
119
|
+
const cache = loadCache();
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
// Use cached version if fresh enough
|
|
122
|
+
if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {
|
|
123
|
+
if (compareSemver(cache.latestVersion, currentVersion) > 0) {
|
|
124
|
+
printUpdateNotice(currentVersion, cache.latestVersion);
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Fetch in background — don't block CLI exit
|
|
129
|
+
const latest = await fetchLatestVersion();
|
|
130
|
+
if (!latest)
|
|
131
|
+
return;
|
|
132
|
+
saveCache({ lastChecked: now, latestVersion: latest });
|
|
133
|
+
if (compareSemver(latest, currentVersion) > 0) {
|
|
134
|
+
printUpdateNotice(currentVersion, latest);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Never fail the CLI over an update check
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function printUpdateNotice(current, latest) {
|
|
142
|
+
console.log();
|
|
143
|
+
console.log(` Update available: ${picocolors_1.default.dim(current)} ${picocolors_1.default.dim("→")} ${picocolors_1.default.green(latest)}`);
|
|
144
|
+
console.log(` Run ${picocolors_1.default.cyan("agent-army update")} to install`);
|
|
145
|
+
console.log();
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../lib/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendor binary management
|
|
3
|
+
*
|
|
4
|
+
* Resolves vendored CLI binaries (Pulumi, AWS CLI) installed to cli/vendor/
|
|
5
|
+
* by the postinstall script. Falls back to system PATH if not found.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get the vendor directory path.
|
|
9
|
+
* At runtime this resolves from cli/dist/lib/vendor.js → ../../vendor/
|
|
10
|
+
*/
|
|
11
|
+
export declare function getVendorDir(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a command to its vendored binary path if available.
|
|
14
|
+
* Returns the full path to the vendored binary, or null if not found.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveVendoredBinary(command: string): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a command, checking vendor directory first, then system PATH.
|
|
19
|
+
* Returns the resolved command string (full path for vendor, original for system).
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveCommand(command: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a vendored binary exists for the given command.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isVendored(command: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a command exists, checking vendor directory first, then system PATH.
|
|
28
|
+
*/
|
|
29
|
+
export declare function commandExistsWithVendor(command: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get the vendor PATH prefix for adding to child process environment.
|
|
32
|
+
* This allows vendored binaries to be found by child processes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getVendorPATH(): string;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vendor binary management
|
|
4
|
+
*
|
|
5
|
+
* Resolves vendored CLI binaries (Pulumi, AWS CLI) installed to cli/vendor/
|
|
6
|
+
* by the postinstall script. Falls back to system PATH if not found.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.getVendorDir = getVendorDir;
|
|
43
|
+
exports.resolveVendoredBinary = resolveVendoredBinary;
|
|
44
|
+
exports.resolveCommand = resolveCommand;
|
|
45
|
+
exports.isVendored = isVendored;
|
|
46
|
+
exports.commandExistsWithVendor = commandExistsWithVendor;
|
|
47
|
+
exports.getVendorPATH = getVendorPATH;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const child_process_1 = require("child_process");
|
|
51
|
+
/**
|
|
52
|
+
* Get the vendor directory path.
|
|
53
|
+
* At runtime this resolves from cli/dist/lib/vendor.js → ../../vendor/
|
|
54
|
+
*/
|
|
55
|
+
function getVendorDir() {
|
|
56
|
+
return path.join(__dirname, "..", "..", "vendor");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the vendor bin directory for the current platform.
|
|
60
|
+
* Structure: vendor/pulumi/, vendor/aws-cli/
|
|
61
|
+
*/
|
|
62
|
+
function getVendorBinDir(tool) {
|
|
63
|
+
return path.join(getVendorDir(), tool);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Map of commands to their vendor subdirectory and binary name.
|
|
67
|
+
*/
|
|
68
|
+
const VENDOR_COMMANDS = {
|
|
69
|
+
pulumi: { dir: "pulumi", bin: process.platform === "win32" ? "pulumi.exe" : "pulumi" },
|
|
70
|
+
aws: { dir: "aws-cli", bin: process.platform === "win32" ? "aws.exe" : "aws" },
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Resolve a command to its vendored binary path if available.
|
|
74
|
+
* Returns the full path to the vendored binary, or null if not found.
|
|
75
|
+
*/
|
|
76
|
+
function resolveVendoredBinary(command) {
|
|
77
|
+
const entry = VENDOR_COMMANDS[command];
|
|
78
|
+
if (!entry)
|
|
79
|
+
return null;
|
|
80
|
+
const binPath = path.join(getVendorBinDir(entry.dir), entry.bin);
|
|
81
|
+
if (fs.existsSync(binPath)) {
|
|
82
|
+
return binPath;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a command, checking vendor directory first, then system PATH.
|
|
88
|
+
* Returns the resolved command string (full path for vendor, original for system).
|
|
89
|
+
*/
|
|
90
|
+
function resolveCommand(command) {
|
|
91
|
+
const vendored = resolveVendoredBinary(command);
|
|
92
|
+
if (vendored)
|
|
93
|
+
return vendored;
|
|
94
|
+
return command;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a vendored binary exists for the given command.
|
|
98
|
+
*/
|
|
99
|
+
function isVendored(command) {
|
|
100
|
+
return resolveVendoredBinary(command) !== null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a command exists, checking vendor directory first, then system PATH.
|
|
104
|
+
*/
|
|
105
|
+
function commandExistsWithVendor(command) {
|
|
106
|
+
// Check vendor first
|
|
107
|
+
if (isVendored(command))
|
|
108
|
+
return true;
|
|
109
|
+
// Fall back to system PATH
|
|
110
|
+
const bin = process.platform === "win32" ? "where" : "which";
|
|
111
|
+
const result = (0, child_process_1.spawnSync)(bin, [command], { shell: false, stdio: "ignore" });
|
|
112
|
+
return result.status === 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the vendor PATH prefix for adding to child process environment.
|
|
116
|
+
* This allows vendored binaries to be found by child processes.
|
|
117
|
+
*/
|
|
118
|
+
function getVendorPATH() {
|
|
119
|
+
const dirs = [];
|
|
120
|
+
for (const entry of Object.values(VENDOR_COMMANDS)) {
|
|
121
|
+
const dir = getVendorBinDir(entry.dir);
|
|
122
|
+
if (fs.existsSync(dir)) {
|
|
123
|
+
dirs.push(dir);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return dirs.join(path.delimiter);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../lib/vendor.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,oCAEC;AAsBD,sDAUC;AAMD,wCAIC;AAKD,gCAEC;AAKD,0DAQC;AAMD,sCASC;AAvFD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAA0C;AAE1C;;;GAGG;AACH,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,eAAe,GAAiD;IACpE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtF,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE;CAC/E,CAAC;AAEF;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,qBAAqB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,qBAAqB;IACrB,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,2BAA2B;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-army",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Deploy and manage a fleet of OpenClaw AI agents on AWS",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agent-army": "dist/bin.js"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
"dist",
|
|
10
|
-
"infra"
|
|
10
|
+
"infra",
|
|
11
|
+
"scripts"
|
|
11
12
|
],
|
|
12
13
|
"scripts": {
|
|
13
14
|
"build": "tsc",
|
|
14
|
-
"watch": "tsc --watch"
|
|
15
|
+
"watch": "tsc --watch",
|
|
16
|
+
"postinstall": "node scripts/postinstall.mjs"
|
|
15
17
|
},
|
|
16
18
|
"dependencies": {
|
|
17
19
|
"@clack/prompts": "^0.9",
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Postinstall script for agent-army CLI
|
|
5
|
+
*
|
|
6
|
+
* Downloads vendored binaries (Pulumi CLI, AWS CLI v2) for the current
|
|
7
|
+
* platform to cli/vendor/. Runs automatically after `npm install`.
|
|
8
|
+
*
|
|
9
|
+
* Versions and checksums are fetched dynamically:
|
|
10
|
+
* - Pulumi: latest release from GitHub API, checksums from release assets
|
|
11
|
+
* - AWS CLI: latest from AWS, checksums from .sha256 sidecar files
|
|
12
|
+
*
|
|
13
|
+
* If downloads fail (network issues, unsupported platform), the CLI
|
|
14
|
+
* falls back to system PATH binaries — this is not a fatal error.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import os from "node:os";
|
|
20
|
+
import https from "node:https";
|
|
21
|
+
import crypto from "node:crypto";
|
|
22
|
+
import { execSync } from "node:child_process";
|
|
23
|
+
|
|
24
|
+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
25
|
+
const VENDOR_DIR = path.join(__dirname, "..", "vendor");
|
|
26
|
+
|
|
27
|
+
function getPlatform() {
|
|
28
|
+
const platform = process.platform;
|
|
29
|
+
const arch = process.arch;
|
|
30
|
+
|
|
31
|
+
let osName;
|
|
32
|
+
if (platform === "darwin") osName = "darwin";
|
|
33
|
+
else if (platform === "linux") osName = "linux";
|
|
34
|
+
else if (platform === "win32") osName = "windows";
|
|
35
|
+
else return null;
|
|
36
|
+
|
|
37
|
+
let archName;
|
|
38
|
+
if (arch === "x64") archName = "x64";
|
|
39
|
+
else if (arch === "arm64") archName = "arm64";
|
|
40
|
+
else return null;
|
|
41
|
+
|
|
42
|
+
return { os: osName, arch: archName };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Compute SHA256 hash of a file.
|
|
47
|
+
*/
|
|
48
|
+
function sha256File(filePath) {
|
|
49
|
+
const hash = crypto.createHash("sha256");
|
|
50
|
+
const data = fs.readFileSync(filePath);
|
|
51
|
+
hash.update(data);
|
|
52
|
+
return hash.digest("hex");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Verify SHA256 checksum of a downloaded file.
|
|
57
|
+
* Throws if checksum doesn't match.
|
|
58
|
+
*/
|
|
59
|
+
function verifyChecksum(filePath, expectedHash, label) {
|
|
60
|
+
if (!expectedHash) {
|
|
61
|
+
console.log(` ⚠ No checksum available for ${label} — skipping verification`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const actualHash = sha256File(filePath);
|
|
65
|
+
if (actualHash !== expectedHash) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`Checksum mismatch for ${label}!\n` +
|
|
68
|
+
` Expected: ${expectedHash}\n` +
|
|
69
|
+
` Got: ${actualHash}\n` +
|
|
70
|
+
` This could indicate a corrupted download or supply chain attack.\n` +
|
|
71
|
+
` Delete the file and retry, or install the CLI manually.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
console.log(` ✓ Checksum verified for ${label}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Make an HTTPS GET request and return the response body as a string.
|
|
79
|
+
*/
|
|
80
|
+
function httpsGet(url) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const doRequest = (reqUrl, redirectCount = 0) => {
|
|
83
|
+
if (redirectCount > 5) {
|
|
84
|
+
reject(new Error("Too many redirects"));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
https.get(reqUrl, { headers: { "User-Agent": "agent-army-postinstall" } }, (res) => {
|
|
88
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
89
|
+
res.resume();
|
|
90
|
+
doRequest(res.headers.location, redirectCount + 1);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (res.statusCode !== 200) {
|
|
94
|
+
res.resume();
|
|
95
|
+
reject(new Error(`HTTP ${res.statusCode} for ${reqUrl}`));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
let data = "";
|
|
99
|
+
res.on("data", (chunk) => (data += chunk));
|
|
100
|
+
res.on("end", () => resolve(data));
|
|
101
|
+
}).on("error", reject);
|
|
102
|
+
};
|
|
103
|
+
doRequest(url);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function download(url, destPath) {
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
const file = fs.createWriteStream(destPath);
|
|
110
|
+
const request = (reqUrl, redirectCount = 0) => {
|
|
111
|
+
if (redirectCount > 5) {
|
|
112
|
+
reject(new Error("Too many redirects"));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
https
|
|
116
|
+
.get(reqUrl, { headers: { "User-Agent": "agent-army-postinstall" } }, (response) => {
|
|
117
|
+
if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
|
|
118
|
+
response.resume();
|
|
119
|
+
request(response.headers.location, redirectCount + 1);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (response.statusCode !== 200) {
|
|
123
|
+
response.resume();
|
|
124
|
+
reject(new Error(`HTTP ${response.statusCode} for ${reqUrl}`));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
response.pipe(file);
|
|
128
|
+
file.on("finish", () => {
|
|
129
|
+
file.close();
|
|
130
|
+
resolve();
|
|
131
|
+
});
|
|
132
|
+
})
|
|
133
|
+
.on("error", (err) => {
|
|
134
|
+
try { fs.unlinkSync(destPath); } catch {}
|
|
135
|
+
reject(err);
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
request(url);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Fetch the latest Pulumi version from GitHub releases API.
|
|
144
|
+
*/
|
|
145
|
+
async function getLatestPulumiVersion() {
|
|
146
|
+
const data = await httpsGet("https://api.github.com/repos/pulumi/pulumi/releases/latest");
|
|
147
|
+
const release = JSON.parse(data);
|
|
148
|
+
const version = release.tag_name.replace(/^v/, "");
|
|
149
|
+
console.log(` Resolved Pulumi latest version: v${version}`);
|
|
150
|
+
return version;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Fetch Pulumi checksums from the GitHub release checksums.txt asset.
|
|
155
|
+
* Returns a map of filename -> sha256 hash.
|
|
156
|
+
*/
|
|
157
|
+
async function getPulumiChecksums(version) {
|
|
158
|
+
const url = `https://github.com/pulumi/pulumi/releases/download/v${version}/pulumi-${version}-checksums.txt`;
|
|
159
|
+
try {
|
|
160
|
+
const data = await httpsGet(url);
|
|
161
|
+
const checksums = {};
|
|
162
|
+
for (const line of data.trim().split("\n")) {
|
|
163
|
+
const [hash, filename] = line.trim().split(/\s+/);
|
|
164
|
+
if (hash && filename) {
|
|
165
|
+
checksums[filename] = hash;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return checksums;
|
|
169
|
+
} catch (err) {
|
|
170
|
+
console.warn(` ⚠ Could not fetch Pulumi checksums: ${err.message}`);
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function getPulumiFilename(version, platform) {
|
|
176
|
+
const ext = platform.os === "windows" ? "zip" : "tar.gz";
|
|
177
|
+
return `pulumi-v${version}-${platform.os}-${platform.arch}.${ext}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function getPulumiUrl(version, platform) {
|
|
181
|
+
return `https://get.pulumi.com/releases/sdk/${getPulumiFilename(version, platform)}`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function getAwsCliUrl(platform) {
|
|
185
|
+
if (platform.os === "linux" && platform.arch === "x64") {
|
|
186
|
+
return "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip";
|
|
187
|
+
}
|
|
188
|
+
if (platform.os === "linux" && platform.arch === "arm64") {
|
|
189
|
+
return "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip";
|
|
190
|
+
}
|
|
191
|
+
if (platform.os === "darwin") {
|
|
192
|
+
return "https://awscli.amazonaws.com/AWSCLIV2.pkg";
|
|
193
|
+
}
|
|
194
|
+
if (platform.os === "windows") {
|
|
195
|
+
return "https://awscli.amazonaws.com/AWSCLIV2.msi";
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Fetch the SHA256 checksum for an AWS CLI download from the .sha256 sidecar.
|
|
202
|
+
*/
|
|
203
|
+
async function getAwsCliChecksum(url) {
|
|
204
|
+
try {
|
|
205
|
+
const data = await httpsGet(`${url}.sha256`);
|
|
206
|
+
// Format: "<hash> filename" or just the hash
|
|
207
|
+
const hash = data.trim().split(/\s+/)[0];
|
|
208
|
+
if (hash && /^[a-f0-9]{64}$/.test(hash)) {
|
|
209
|
+
return hash;
|
|
210
|
+
}
|
|
211
|
+
return null;
|
|
212
|
+
} catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async function installPulumi(platform) {
|
|
218
|
+
// Resolve version dynamically
|
|
219
|
+
const version = await getLatestPulumiVersion();
|
|
220
|
+
const checksums = await getPulumiChecksums(version);
|
|
221
|
+
const filename = getPulumiFilename(version, platform);
|
|
222
|
+
const expectedChecksum = checksums[filename] || null;
|
|
223
|
+
const url = getPulumiUrl(version, platform);
|
|
224
|
+
const platformKey = `${platform.os}-${platform.arch}`;
|
|
225
|
+
const destDir = path.join(VENDOR_DIR, "pulumi");
|
|
226
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
227
|
+
|
|
228
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "agent-army-pulumi-"));
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
if (platform.os === "windows") {
|
|
232
|
+
const zipPath = path.join(tmpDir, "pulumi.zip");
|
|
233
|
+
console.log(` Downloading Pulumi v${version} (${platformKey})...`);
|
|
234
|
+
await download(url, zipPath);
|
|
235
|
+
verifyChecksum(zipPath, expectedChecksum, `Pulumi v${version} (${platformKey})`);
|
|
236
|
+
|
|
237
|
+
execSync(`powershell -Command "Expand-Archive -Path '${zipPath}' -DestinationPath '${tmpDir}' -Force"`, {
|
|
238
|
+
stdio: "pipe",
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
const extractedDir = path.join(tmpDir, "pulumi", "bin");
|
|
242
|
+
if (fs.existsSync(extractedDir)) {
|
|
243
|
+
for (const file of fs.readdirSync(extractedDir)) {
|
|
244
|
+
fs.copyFileSync(path.join(extractedDir, file), path.join(destDir, file));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
} else {
|
|
248
|
+
const tarPath = path.join(tmpDir, "pulumi.tar.gz");
|
|
249
|
+
console.log(` Downloading Pulumi v${version} (${platformKey})...`);
|
|
250
|
+
await download(url, tarPath);
|
|
251
|
+
verifyChecksum(tarPath, expectedChecksum, `Pulumi v${version} (${platformKey})`);
|
|
252
|
+
|
|
253
|
+
execSync(`tar xzf "${tarPath}" -C "${tmpDir}"`, { stdio: "pipe" });
|
|
254
|
+
|
|
255
|
+
const extractedDir = path.join(tmpDir, "pulumi");
|
|
256
|
+
if (fs.existsSync(extractedDir)) {
|
|
257
|
+
for (const file of fs.readdirSync(extractedDir)) {
|
|
258
|
+
const srcPath = path.join(extractedDir, file);
|
|
259
|
+
const dstPath = path.join(destDir, file);
|
|
260
|
+
fs.copyFileSync(srcPath, dstPath);
|
|
261
|
+
fs.chmodSync(dstPath, 0o755);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Write version file for runtime reference
|
|
267
|
+
fs.writeFileSync(path.join(destDir, ".version"), version);
|
|
268
|
+
console.log(` ✓ Pulumi v${version} installed to vendor/pulumi/`);
|
|
269
|
+
} finally {
|
|
270
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function installAwsCli(platform) {
|
|
275
|
+
const url = getAwsCliUrl(platform);
|
|
276
|
+
if (!url) {
|
|
277
|
+
console.log(" AWS CLI: unsupported platform, skipping vendor install");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const platformKey = `${platform.os}-${platform.arch}`;
|
|
282
|
+
const destDir = path.join(VENDOR_DIR, "aws-cli");
|
|
283
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
284
|
+
|
|
285
|
+
// Fetch checksum from AWS .sha256 sidecar file
|
|
286
|
+
const expectedChecksum = await getAwsCliChecksum(url);
|
|
287
|
+
|
|
288
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "agent-army-awscli-"));
|
|
289
|
+
|
|
290
|
+
try {
|
|
291
|
+
if (platform.os === "linux") {
|
|
292
|
+
const zipPath = path.join(tmpDir, "awscli.zip");
|
|
293
|
+
console.log(` Downloading AWS CLI v2 (${platformKey})...`);
|
|
294
|
+
await download(url, zipPath);
|
|
295
|
+
verifyChecksum(zipPath, expectedChecksum, `AWS CLI v2 (${platformKey})`);
|
|
296
|
+
|
|
297
|
+
execSync(`unzip -q "${zipPath}" -d "${tmpDir}"`, { stdio: "pipe" });
|
|
298
|
+
|
|
299
|
+
const installDir = path.join(destDir, "v2");
|
|
300
|
+
execSync(
|
|
301
|
+
`"${tmpDir}/aws/install" --install-dir "${installDir}" --bin-dir "${destDir}" --update`,
|
|
302
|
+
{ stdio: "pipe" }
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
console.log(` ✓ AWS CLI v2 installed to vendor/aws-cli/`);
|
|
306
|
+
} else if (platform.os === "darwin") {
|
|
307
|
+
const pkgPath = path.join(tmpDir, "AWSCLIV2.pkg");
|
|
308
|
+
console.log(` Downloading AWS CLI v2 (${platformKey})...`);
|
|
309
|
+
await download(url, pkgPath);
|
|
310
|
+
verifyChecksum(pkgPath, expectedChecksum, `AWS CLI v2 (${platformKey})`);
|
|
311
|
+
|
|
312
|
+
const expandDir = path.join(tmpDir, "expanded");
|
|
313
|
+
execSync(`pkgutil --expand "${pkgPath}" "${expandDir}"`, { stdio: "pipe" });
|
|
314
|
+
|
|
315
|
+
const payloadDir = path.join(tmpDir, "payload");
|
|
316
|
+
fs.mkdirSync(payloadDir, { recursive: true });
|
|
317
|
+
|
|
318
|
+
const awsCliPkg = path.join(expandDir, "aws-cli.pkg");
|
|
319
|
+
if (fs.existsSync(path.join(awsCliPkg, "Payload"))) {
|
|
320
|
+
execSync(`cd "${payloadDir}" && cat "${awsCliPkg}/Payload" | cpio -idm 2>/dev/null || true`, {
|
|
321
|
+
stdio: "pipe",
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const awsBinSrc = path.join(payloadDir, "aws-cli", "aws");
|
|
326
|
+
if (fs.existsSync(awsBinSrc)) {
|
|
327
|
+
copyDirSync(path.join(payloadDir, "aws-cli"), destDir);
|
|
328
|
+
fs.chmodSync(path.join(destDir, "aws"), 0o755);
|
|
329
|
+
console.log(` ✓ AWS CLI v2 installed to vendor/aws-cli/`);
|
|
330
|
+
} else {
|
|
331
|
+
console.log(" AWS CLI: could not locate binary in .pkg payload, skipping");
|
|
332
|
+
}
|
|
333
|
+
} else if (platform.os === "windows") {
|
|
334
|
+
console.log(" AWS CLI: Windows uses MSI installer, skipping vendor install");
|
|
335
|
+
console.log(" Install from: https://awscli.amazonaws.com/AWSCLIV2.msi");
|
|
336
|
+
}
|
|
337
|
+
} finally {
|
|
338
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function copyDirSync(src, dest) {
|
|
343
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
344
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
345
|
+
const srcPath = path.join(src, entry.name);
|
|
346
|
+
const destPath = path.join(dest, entry.name);
|
|
347
|
+
if (entry.isDirectory()) {
|
|
348
|
+
copyDirSync(srcPath, destPath);
|
|
349
|
+
} else {
|
|
350
|
+
fs.copyFileSync(srcPath, destPath);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
async function main() {
|
|
356
|
+
// Skip in CI or if AGENT_ARMY_SKIP_POSTINSTALL is set
|
|
357
|
+
if (process.env.AGENT_ARMY_SKIP_POSTINSTALL || process.env.CI) {
|
|
358
|
+
console.log("agent-army: skipping postinstall (CI or AGENT_ARMY_SKIP_POSTINSTALL set)");
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const platform = getPlatform();
|
|
363
|
+
if (!platform) {
|
|
364
|
+
console.log(`agent-army: unsupported platform (${process.platform}/${process.arch}), skipping vendor install`);
|
|
365
|
+
console.log(" Pulumi and AWS CLI must be installed manually.");
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
console.log(`agent-army: installing vendored binaries (${platform.os}/${platform.arch})...`);
|
|
370
|
+
|
|
371
|
+
// Install Pulumi
|
|
372
|
+
try {
|
|
373
|
+
await installPulumi(platform);
|
|
374
|
+
} catch (err) {
|
|
375
|
+
console.warn(` ✗ Failed to install Pulumi: ${err instanceof Error ? err.message : String(err)}`);
|
|
376
|
+
console.warn(" The CLI will fall back to system PATH for Pulumi.");
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Install AWS CLI
|
|
380
|
+
try {
|
|
381
|
+
await installAwsCli(platform);
|
|
382
|
+
} catch (err) {
|
|
383
|
+
console.warn(` ✗ Failed to install AWS CLI: ${err instanceof Error ? err.message : String(err)}`);
|
|
384
|
+
console.warn(" The CLI will fall back to system PATH for AWS CLI.");
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
console.log("agent-army: postinstall complete.");
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
main().catch((err) => {
|
|
391
|
+
// Non-fatal — the CLI will fall back to system PATH
|
|
392
|
+
console.warn(`agent-army postinstall: ${err instanceof Error ? err.message : String(err)}`);
|
|
393
|
+
console.warn(" Vendored binaries may not be available. Falling back to system PATH.");
|
|
394
|
+
process.exit(0); // Exit 0 so npm install doesn't fail
|
|
395
|
+
});
|