@appforge-ci/admin-cli 0.3.2 → 0.3.3

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.
@@ -0,0 +1,143 @@
1
+ import "../test-support/home-sandbox.js";
2
+ import { test } from "node:test";
3
+ import assert from "node:assert/strict";
4
+ import { existsSync, mkdirSync } from "node:fs";
5
+ import { mkdtemp, rm, mkdir, writeFile } from "node:fs/promises";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { DEFAULT_RUNNER_USER, DEFAULT_RUNNER_VERSION, ensureRunnerDownloaded, ensureRunnerUser, installRunnerUser, nextFreeUid, registrationCommands, runnerArch, runnerDownloadUrl, } from "./runner-user.js";
9
+ function fakeDeps(over = {}) {
10
+ const calls = [];
11
+ const logs = [];
12
+ const deps = {
13
+ userExists: () => false,
14
+ listUserUids: () => "someone 501\nanother 502\n",
15
+ run: (cmd, args) => calls.push({ cmd, args }),
16
+ tryRun: () => true,
17
+ // Real filesystem calls by default: the tests that need isolation from the real /Users/ci-runner pass
18
+ // their own `home`/`user` pointed at a real mkdtemp dir (ensureRunnerDownloaded's own test), or never
19
+ // reach a real path at all because `userExists` short-circuits account/download creation first
20
+ // (installRunnerUser's own tests, below, all set userExists: () => true for exactly this reason —
21
+ // except they still reach ensureRunnerDownloaded, which is why those mock `exists`/`mkdirp` too).
22
+ exists: (p) => existsSync(p),
23
+ mkdirp: (p) => mkdirSync(p, { recursive: true }),
24
+ log: (l) => logs.push(l),
25
+ arch: "arm64",
26
+ ...over,
27
+ };
28
+ return { deps, calls, logs };
29
+ }
30
+ test("runnerDownloadUrl names the exact GitHub release asset for each arch", () => {
31
+ assert.equal(runnerDownloadUrl("2.321.0", "arm64"), "https://github.com/actions/runner/releases/download/v2.321.0/actions-runner-osx-arm64-2.321.0.tar.gz");
32
+ assert.equal(runnerDownloadUrl("2.321.0", "x64"), "https://github.com/actions/runner/releases/download/v2.321.0/actions-runner-osx-x64-2.321.0.tar.gz");
33
+ });
34
+ test("runnerArch maps Node's arch to the runner release's naming; anything but arm64 is x64", () => {
35
+ assert.equal(runnerArch("arm64"), "arm64");
36
+ assert.equal(runnerArch("x64"), "x64");
37
+ assert.equal(runnerArch("ia32"), "x64");
38
+ assert.equal(runnerArch("arm"), "x64");
39
+ });
40
+ test("nextFreeUid picks one past the highest regular uid found, and falls back to 501 on an empty or unparseable listing", () => {
41
+ assert.equal(nextFreeUid("tooming 501\nci-runner 502\n"), 503);
42
+ assert.equal(nextFreeUid(""), 501);
43
+ assert.equal(nextFreeUid("garbage with no numbers\n\n"), 501);
44
+ // A system/hidden account's low uid never raises the max above the regular-user floor.
45
+ assert.equal(nextFreeUid("_appforgebuild 320\ntooming 501\n"), 502);
46
+ // Out-of-order listing: the actual MAX is picked, not the last line.
47
+ assert.equal(nextFreeUid("c 503\na 501\nb 502\n"), 504);
48
+ });
49
+ test("registrationCommands: absolute-path argv arrays, never a shell string; svc.sh install is always given the target user explicitly", () => {
50
+ const { config, svcInstall, svcStart } = registrationCommands({
51
+ dir: "/Users/ci-runner/actions-runner",
52
+ user: "ci-runner",
53
+ githubUrl: "https://github.com/acme/widgets",
54
+ githubToken: "AABBCCDDEEFF",
55
+ runnerName: "mac-mini-2",
56
+ });
57
+ assert.deepEqual(config, [
58
+ "/Users/ci-runner/actions-runner/config.sh",
59
+ "--url",
60
+ "https://github.com/acme/widgets",
61
+ "--token",
62
+ "AABBCCDDEEFF",
63
+ "--unattended",
64
+ "--name",
65
+ "mac-mini-2",
66
+ ]);
67
+ assert.deepEqual(svcInstall, ["/Users/ci-runner/actions-runner/svc.sh", "install", "ci-runner"]);
68
+ assert.deepEqual(svcStart, ["/Users/ci-runner/actions-runner/svc.sh", "start"]);
69
+ // Not a template literal anywhere in the result: no value could break out of a shell quoting scheme that
70
+ // was never used, because execFileSync (behind `run`) never invokes a shell for these.
71
+ for (const argv of [config, svcInstall, svcStart])
72
+ for (const a of argv)
73
+ assert.equal(typeof a, "string");
74
+ });
75
+ test("ensureRunnerUser is a no-op (besides one log line) when the account already exists — never resets or touches it", () => {
76
+ const { deps, calls, logs } = fakeDeps({ userExists: (u) => u === DEFAULT_RUNNER_USER });
77
+ const home = ensureRunnerUser(DEFAULT_RUNNER_USER, deps);
78
+ assert.equal(home, "/Users/ci-runner");
79
+ assert.deepEqual(calls, []);
80
+ assert.match(logs.join(""), /already exists, leaving it alone/);
81
+ });
82
+ test("ensureRunnerUser creates an ORDINARY (not hidden) account at the next free uid, with its own primary group and a real home", () => {
83
+ const { deps, calls, logs } = fakeDeps({ userExists: () => false, listUserUids: () => "a 501\nb 503\n" });
84
+ const home = ensureRunnerUser("ci-runner-2", deps);
85
+ assert.equal(home, "/Users/ci-runner-2");
86
+ const dscl = calls.filter((c) => c.cmd === "sudo" && c.args[0] === "dscl");
87
+ assert.ok(dscl.some((c) => c.args.join(" ") === `dscl . -create /Groups/ci-runner-2`));
88
+ assert.ok(dscl.some((c) => c.args.join(" ") === `dscl . -create /Groups/ci-runner-2 PrimaryGroupID 504`));
89
+ assert.ok(dscl.some((c) => c.args.join(" ") === `dscl . -create /Users/ci-runner-2 UniqueID 504`));
90
+ assert.ok(dscl.some((c) => c.args.join(" ") === `dscl . -create /Users/ci-runner-2 PrimaryGroupID 504`));
91
+ assert.ok(dscl.some((c) => c.args.join(" ") === `dscl . -create /Users/ci-runner-2 NFSHomeDirectory /Users/ci-runner-2`));
92
+ // No IsHidden, no Password — see the module's own reasoning for why this must stay an ordinary account.
93
+ assert.ok(!calls.some((c) => c.args.includes("IsHidden")));
94
+ assert.ok(!calls.some((c) => c.args.includes("Password")));
95
+ assert.ok(calls.some((c) => c.cmd === "sudo" && c.args[0] === "createhomedir"));
96
+ assert.match(logs.join(""), /created \/Users\/ci-runner-2 \(uid 504\)/);
97
+ });
98
+ test("ensureRunnerDownloaded downloads, extracts and chowns to the target user; a no-op when already installed", async () => {
99
+ const home = await mkdtemp(join(tmpdir(), "appforge-runner-"));
100
+ try {
101
+ const { deps, calls } = fakeDeps();
102
+ const dir = ensureRunnerDownloaded("ci-runner", home, DEFAULT_RUNNER_VERSION, deps);
103
+ assert.equal(dir, join(home, "actions-runner"));
104
+ assert.ok(calls.some((c) => c.cmd === "curl" && c.args.includes(runnerDownloadUrl(DEFAULT_RUNNER_VERSION, "arm64"))));
105
+ assert.ok(calls.some((c) => c.cmd === "tar"));
106
+ assert.ok(calls.some((c) => c.cmd === "sudo" && c.args.join(" ") === `chown -R ci-runner:ci-runner ${dir}`));
107
+ // Pretend the download already happened (a real config.sh present): a second call must not re-download.
108
+ await mkdir(dir, { recursive: true });
109
+ await writeFile(join(dir, "config.sh"), "#!/bin/bash\n");
110
+ const second = fakeDeps();
111
+ const dir2 = ensureRunnerDownloaded("ci-runner", home, DEFAULT_RUNNER_VERSION, second.deps);
112
+ assert.equal(dir2, dir);
113
+ assert.deepEqual(second.calls, []);
114
+ assert.match(second.logs.join(""), /already has a runner install/);
115
+ }
116
+ finally {
117
+ await rm(home, { recursive: true, force: true });
118
+ }
119
+ });
120
+ test("installRunnerUser: given both --github-url and --github-token, it registers and starts the service as the dedicated user", () => {
121
+ const { deps, calls } = fakeDeps({ userExists: () => true, exists: () => false, mkdirp: () => { } }); // account exists; the download dir does not (avoids touching a real /Users/ci-runner)
122
+ installRunnerUser({ user: "ci-runner", githubUrl: "https://github.com/acme/widgets", githubToken: "TOK123", runnerName: "mini-7" }, deps);
123
+ assert.deepEqual(calls.find((c) => c.cmd === "sudo" && c.args[0] === "-u")?.args, ["-u", "ci-runner", "--", "/Users/ci-runner/actions-runner/config.sh", "--url", "https://github.com/acme/widgets", "--token", "TOK123", "--unattended", "--name", "mini-7"]);
124
+ assert.ok(calls.some((c) => c.cmd === "sudo" && c.args.join(" ") === "/Users/ci-runner/actions-runner/svc.sh install ci-runner"));
125
+ assert.ok(calls.some((c) => c.cmd === "sudo" && c.args.join(" ") === "/Users/ci-runner/actions-runner/svc.sh start"));
126
+ });
127
+ test("installRunnerUser: given neither flag, it registers nothing and prints the exact commands to finish by hand, token never guessed or stored", () => {
128
+ const { deps, calls, logs } = fakeDeps({ userExists: () => true, exists: () => false, mkdirp: () => { } });
129
+ installRunnerUser({ user: "ci-runner", runnerName: "mini-7" }, deps);
130
+ assert.ok(!calls.some((c) => c.cmd === "sudo" && c.args[0] === "-u"), "config.sh must never run without a real token");
131
+ assert.ok(!calls.some((c) => c.args.some((a) => a.includes("svc.sh"))), "svc.sh must never run unregistered");
132
+ const printed = logs.join("\n");
133
+ assert.match(printed, /sudo -u ci-runner -- \/Users\/ci-runner\/actions-runner\/config\.sh --url <url> --token <token>/);
134
+ assert.match(printed, /sudo \/Users\/ci-runner\/actions-runner\/svc\.sh install ci-runner/);
135
+ assert.match(printed, /sudo \/Users\/ci-runner\/actions-runner\/svc\.sh start/);
136
+ });
137
+ test("installRunnerUser defaults the user to ci-runner and the version to DEFAULT_RUNNER_VERSION", () => {
138
+ const { deps, calls } = fakeDeps({ userExists: () => true, exists: () => false, mkdirp: () => { } });
139
+ installRunnerUser({}, deps);
140
+ assert.ok(calls.some((c) => c.cmd === "curl" && c.args.some((a) => a.includes(DEFAULT_RUNNER_VERSION))), "downloads the default pinned version");
141
+ assert.ok(calls.some((c) => c.args.some((a) => a.includes("/Users/ci-runner/actions-runner"))), "installs under the default account's home");
142
+ });
143
+ //# sourceMappingURL=runner-user.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-user.test.js","sourceRoot":"","sources":["../../src/lib/runner-user.test.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAE1B,SAAS,QAAQ,CAAC,OAAuC,EAAE;IACzD,MAAM,KAAK,GAAsC,EAAE,CAAC;IACpD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAA0B;QAClC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;QACvB,YAAY,EAAE,GAAG,EAAE,CAAC,4BAA4B;QAChD,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;QAClB,sGAAsG;QACtG,sGAAsG;QACtG,+FAA+F;QAC/F,kGAAkG;QAClG,kGAAkG;QAClG,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,OAAO;QACb,GAAG,IAAI;KACR,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,sGAAsG,CAAC,CAAC;IAC5J,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,oGAAoG,CAAC,CAAC;AAC1J,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uFAAuF,EAAE,GAAG,EAAE;IACjG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oHAAoH,EAAE,GAAG,EAAE;IAC9H,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,8BAA8B,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,6BAA6B,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,uFAAuF;IACvF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,mCAAmC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpE,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kIAAkI,EAAE,GAAG,EAAE;IAC5I,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC;QAC5D,GAAG,EAAE,iCAAiC;QACtC,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,iCAAiC;QAC5C,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,YAAY;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,2CAA2C;QAC3C,OAAO;QACP,iCAAiC;QACjC,SAAS;QACT,cAAc;QACd,cAAc;QACd,QAAQ;QACR,YAAY;KACb,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,wCAAwC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACjG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,wCAAwC,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,yGAAyG;IACzG,uFAAuF;IACvF,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;QAAE,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5G,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iHAAiH,EAAE,GAAG,EAAE;IAC3H,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4HAA4H,EAAE,GAAG,EAAE;IACtI,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1G,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,oCAAoC,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,uDAAuD,CAAC,CAAC,CAAC;IAC1G,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gDAAgD,CAAC,CAAC,CAAC;IACnG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,sDAAsD,CAAC,CAAC,CAAC;IACzG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,uEAAuE,CAAC,CAAC,CAAC;IAC1H,wGAAwG;IACxG,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,0CAA0C,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;IAC1H,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACpF,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gCAAgC,GAAG,EAAE,CAAC,CAAC,CAAC;QAE7G,wGAAwG;QACxG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;IACrE,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0HAA0H,EAAE,GAAG,EAAE;IACpI,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC,CAAC,sFAAsF;IAC3L,iBAAiB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,iCAAiC,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1I,MAAM,CAAC,SAAS,CACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,EAC/D,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,2CAA2C,EAAE,OAAO,EAAE,iCAAiC,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAC5K,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,0DAA0D,CAAC,CAAC,CAAC;IAClI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,8CAA8C,CAAC,CAAC,CAAC;AACxH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4IAA4I,EAAE,GAAG,EAAE;IACtJ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;IAC1G,iBAAiB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,+CAA+C,CAAC,CAAC;IACvH,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,oCAAoC,CAAC,CAAC;IAC9G,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,iGAAiG,CAAC,CAAC;IACzH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,oEAAoE,CAAC,CAAC;IAC5F,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,wDAAwD,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4FAA4F,EAAE,GAAG,EAAE;IACtG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;IACpG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;IACjJ,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE,2CAA2C,CAAC,CAAC;AAC/I,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appforge-ci/admin-cli",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -15,8 +15,8 @@
15
15
  "dependencies": {
16
16
  "chalk": "^5.3.0",
17
17
  "commander": "^12.1.0",
18
- "@appforge-ci/agent": "0.3.2",
19
- "@appforge-ci/core": "0.3.2"
18
+ "@appforge-ci/agent": "0.3.3",
19
+ "@appforge-ci/core": "0.3.3"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^20.16.5",