@namespacelabs/actions-toolkit 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -17,8 +17,8 @@ Install and execute the [spacectl](https://github.com/namespacelabs/space) CLI.
17
17
  ```typescript
18
18
  import { install, exec } from "@namespacelabs/actions-toolkit/spacectl";
19
19
 
20
- const { binPath, version } = await install();
21
- const result = await exec(binPath, ["cache", "modes"]);
20
+ await install();
21
+ const result = await exec(["cache", "modes"]);
22
22
  ```
23
23
 
24
24
  See [spacectl documentation](src/spacectl/README.md) for detailed usage.
@@ -0,0 +1,38 @@
1
+ import * as actionsExec from "@actions/exec";
2
+
3
+ //#region src/spacectl/exec.d.ts
4
+ type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
5
+ type ExecResult = actionsExec.ExecOutput;
6
+ declare class SpacectlExecError extends Error {
7
+ readonly exitCode: number;
8
+ readonly stdout: string;
9
+ readonly stderr: string;
10
+ readonly command: string;
11
+ constructor(message: string, exitCode: number, stdout: string, stderr: string, command: string, cause?: unknown);
12
+ }
13
+ declare function exec(args: string[], options?: ExecOptions & {
14
+ binPath?: string;
15
+ }): Promise<ExecResult>;
16
+ //#endregion
17
+ //#region src/spacectl/installer.d.ts
18
+ interface InstallOptions {
19
+ version?: string;
20
+ githubToken?: string;
21
+ /** Check for existing binary before downloading. @default true */
22
+ useSystemBinary?: boolean;
23
+ /** Add binary directory to PATH via core.addPath(). @default true */
24
+ addToPath?: boolean;
25
+ }
26
+ interface InstallResult {
27
+ binPath: string;
28
+ version: string;
29
+ }
30
+ type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "UNSUPPORTED_ARCH" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
31
+ declare class SpacectlInstallError extends Error {
32
+ readonly code: SpacectlInstallErrorCode;
33
+ constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
34
+ }
35
+ declare function install(options?: InstallOptions): Promise<InstallResult>;
36
+ //#endregion
37
+ export { ExecOptions as a, exec as c, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, SpacectlExecError as s, InstallOptions as t };
38
+ //# sourceMappingURL=index-D8KbltV5.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D8KbltV5.d.cts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAEY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,cAExB,iBAAA,SAA0B,KAAA;EAAA,SAC5B,QAAA;EAAA,SACA,MAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;cAGP,OAAA,UACA,QAAA,UACA,MAAA,UACA,MAAA,UACA,OAAA,UACA,KAAA;AAAA;AAAA,iBAWkB,IAAA,CACpB,IAAA,YACA,OAAA,GAAU,WAAA;EAAgB,OAAA;AAAA,IACzB,OAAA,CAAQ,UAAA;;;UCtBM,cAAA;EACf,OAAA;EACA,WAAA;EDbqB;ECerB,eAAA;EDf4B;ECiB5B,SAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAOC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;cAEH,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
@@ -0,0 +1,38 @@
1
+ import * as actionsExec from "@actions/exec";
2
+
3
+ //#region src/spacectl/exec.d.ts
4
+ type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
5
+ type ExecResult = actionsExec.ExecOutput;
6
+ declare class SpacectlExecError extends Error {
7
+ readonly exitCode: number;
8
+ readonly stdout: string;
9
+ readonly stderr: string;
10
+ readonly command: string;
11
+ constructor(message: string, exitCode: number, stdout: string, stderr: string, command: string, cause?: unknown);
12
+ }
13
+ declare function exec(args: string[], options?: ExecOptions & {
14
+ binPath?: string;
15
+ }): Promise<ExecResult>;
16
+ //#endregion
17
+ //#region src/spacectl/installer.d.ts
18
+ interface InstallOptions {
19
+ version?: string;
20
+ githubToken?: string;
21
+ /** Check for existing binary before downloading. @default true */
22
+ useSystemBinary?: boolean;
23
+ /** Add binary directory to PATH via core.addPath(). @default true */
24
+ addToPath?: boolean;
25
+ }
26
+ interface InstallResult {
27
+ binPath: string;
28
+ version: string;
29
+ }
30
+ type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "UNSUPPORTED_ARCH" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
31
+ declare class SpacectlInstallError extends Error {
32
+ readonly code: SpacectlInstallErrorCode;
33
+ constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
34
+ }
35
+ declare function install(options?: InstallOptions): Promise<InstallResult>;
36
+ //#endregion
37
+ export { ExecOptions as a, exec as c, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, SpacectlExecError as s, InstallOptions as t };
38
+ //# sourceMappingURL=index-DwGIuc_X.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DwGIuc_X.d.mts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAEY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,cAExB,iBAAA,SAA0B,KAAA;EAAA,SAC5B,QAAA;EAAA,SACA,MAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;cAGP,OAAA,UACA,QAAA,UACA,MAAA,UACA,MAAA,UACA,OAAA,UACA,KAAA;AAAA;AAAA,iBAWkB,IAAA,CACpB,IAAA,YACA,OAAA,GAAU,WAAA;EAAgB,OAAA;AAAA,IACzB,OAAA,CAAQ,UAAA;;;UCtBM,cAAA;EACf,OAAA;EACA,WAAA;EDbqB;ECerB,eAAA;EDf4B;ECiB5B,SAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAOC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;cAEH,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,6 @@
1
- const require_spacectl = require('./spacectl-6udimwjI.cjs');
1
+ const require_spacectl = require('./spacectl-DJeTPYLE.cjs');
2
2
 
3
+ exports.SpacectlExecError = require_spacectl.SpacectlExecError;
3
4
  exports.SpacectlInstallError = require_spacectl.SpacectlInstallError;
4
5
  exports.exec = require_spacectl.exec;
5
6
  exports.install = require_spacectl.install;
package/dist/index.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as exec, t as InstallOptions } from "./index-DJzkZaGq.cjs";
2
- export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
1
+ import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-D8KbltV5.cjs";
2
+ export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as exec, t as InstallOptions } from "./index-C6FXIu0Q.mjs";
2
- export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
1
+ import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-DwGIuc_X.mjs";
2
+ export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { n as install, r as exec, t as SpacectlInstallError } from "./spacectl-COQOkFHx.mjs";
1
+ import { i as exec, n as install, r as SpacectlExecError, t as SpacectlInstallError } from "./spacectl-DoqF-x68.mjs";
2
2
 
3
- export { SpacectlInstallError, exec, install };
3
+ export { SpacectlExecError, SpacectlInstallError, exec, install };
@@ -25,12 +25,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
- let _actions_core = require("@actions/core");
29
- _actions_core = __toESM(_actions_core);
30
28
  let _actions_exec = require("@actions/exec");
31
29
  _actions_exec = __toESM(_actions_exec);
32
30
  let node_path = require("node:path");
33
31
  node_path = __toESM(node_path);
32
+ let _actions_core = require("@actions/core");
33
+ _actions_core = __toESM(_actions_core);
34
34
  let _actions_io = require("@actions/io");
35
35
  _actions_io = __toESM(_actions_io);
36
36
  let _actions_tool_cache = require("@actions/tool-cache");
@@ -41,7 +41,22 @@ let _actions_github = require("@actions/github");
41
41
  _actions_github = __toESM(_actions_github);
42
42
 
43
43
  //#region src/spacectl/exec.ts
44
- async function exec(binPath, args, options) {
44
+ var SpacectlExecError = class extends Error {
45
+ exitCode;
46
+ stdout;
47
+ stderr;
48
+ command;
49
+ constructor(message, exitCode, stdout, stderr, command, cause) {
50
+ super(message, cause !== void 0 ? { cause } : void 0);
51
+ this.name = "SpacectlExecError";
52
+ this.exitCode = exitCode;
53
+ this.stdout = stdout;
54
+ this.stderr = stderr;
55
+ this.command = command;
56
+ }
57
+ };
58
+ async function exec(args, options) {
59
+ const binPath = options?.binPath ?? "space";
45
60
  const execArgs = [...args, "--output=json"];
46
61
  let stdout = "";
47
62
  let stderr = "";
@@ -60,13 +75,13 @@ async function exec(binPath, args, options) {
60
75
  }
61
76
  });
62
77
  if (exitCode !== 0) {
63
- let errorMessage = `'${binPath} ${execArgs.join(" ")}' failed with exit code ${exitCode}`;
78
+ const command = `${binPath} ${execArgs.join(" ")}`;
79
+ let errorMessage = `'${command}' failed with exit code ${exitCode}`;
64
80
  try {
65
81
  const errorJson = JSON.parse(stdout.trim());
66
82
  if (errorJson.message) errorMessage = errorJson.message;
67
83
  } catch {}
68
- _actions_core.error(errorMessage);
69
- process.exit(exitCode);
84
+ throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);
70
85
  }
71
86
  return {
72
87
  exitCode,
@@ -87,10 +102,11 @@ function getPlatform() {
87
102
  }
88
103
  }
89
104
  function getArch() {
90
- switch (node_os.arch()) {
105
+ const arch = node_os.arch();
106
+ switch (arch) {
91
107
  case "arm64": return "arm64";
92
108
  case "x64": return "amd64";
93
- default: return "amd64";
109
+ default: throw new Error(`Unsupported architecture: ${arch}`);
94
110
  }
95
111
  }
96
112
  function getBinaryName() {
@@ -102,7 +118,7 @@ function getBinaryName() {
102
118
  const REPO_OWNER$1 = "namespacelabs";
103
119
  const REPO_NAME$1 = "space";
104
120
  function normalizeVersion(version) {
105
- return version.trim().replace(/^v/, "");
121
+ return version.trim().replace(/^[vV]/, "");
106
122
  }
107
123
  async function getLatestVersion(token) {
108
124
  const octokit = _actions_github.getOctokit(token || process.env.GITHUB_TOKEN || "");
@@ -146,12 +162,10 @@ const REPO_OWNER = "namespacelabs";
146
162
  const REPO_NAME = "space";
147
163
  var SpacectlInstallError = class extends Error {
148
164
  code;
149
- cause;
150
165
  constructor(message, code, cause) {
151
- super(message);
166
+ super(message, { cause });
152
167
  this.name = "SpacectlInstallError";
153
168
  this.code = code;
154
- this.cause = cause;
155
169
  }
156
170
  };
157
171
  async function findExistingBinary() {
@@ -176,7 +190,7 @@ async function findExistingBinary() {
176
190
  }
177
191
  }
178
192
  async function getInstalledVersion(binPath) {
179
- const result = await exec(binPath, ["version"]);
193
+ const result = await exec(["version"], { binPath });
180
194
  try {
181
195
  return normalizeVersion(JSON.parse(result.stdout.trim()).version);
182
196
  } catch (error) {
@@ -184,13 +198,11 @@ async function getInstalledVersion(binPath) {
184
198
  throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, "EXEC_FAILED", error);
185
199
  }
186
200
  }
187
- function getDownloadUrl(version) {
188
- return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${getPlatform()}_${getArch()}.tar.gz`}`;
201
+ function getDownloadUrl(version, platform, arch) {
202
+ return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`}`;
189
203
  }
190
- async function downloadAndCache(version, token) {
191
- const platform = getPlatform();
192
- const arch = getArch();
193
- const url = getDownloadUrl(version);
204
+ async function downloadAndCache(version, platform, arch, token) {
205
+ const url = getDownloadUrl(version, platform, arch);
194
206
  _actions_core.info(`Downloading spacectl ${version} from ${url}`);
195
207
  let archivePath;
196
208
  try {
@@ -208,18 +220,25 @@ async function downloadAndCache(version, token) {
208
220
  async function install(options = {}) {
209
221
  const versionSpec = options.version ?? "";
210
222
  const token = options.githubToken ?? process.env.GITHUB_TOKEN;
223
+ let platform;
211
224
  try {
212
- getPlatform();
225
+ platform = getPlatform();
213
226
  } catch (error) {
214
227
  throw new SpacectlInstallError(`Unsupported platform: ${process.platform}`, "UNSUPPORTED_PLATFORM", error);
215
228
  }
216
- const arch = getArch();
229
+ let arch;
230
+ try {
231
+ arch = getArch();
232
+ } catch (error) {
233
+ throw new SpacectlInstallError(`Unsupported architecture: ${process.arch}`, "UNSUPPORTED_ARCH", error);
234
+ }
217
235
  const binaryName = getBinaryName();
218
- if (versionSpec === "") {
236
+ if (versionSpec === "" && options.useSystemBinary !== false) {
219
237
  const existingPath = await findExistingBinary();
220
238
  if (existingPath) {
221
239
  const version = await getInstalledVersion(existingPath);
222
240
  _actions_core.info(`Using existing spacectl ${version} at ${existingPath}`);
241
+ if (options.addToPath !== false) _actions_core.addPath(node_path.dirname(existingPath));
223
242
  return {
224
243
  binPath: existingPath,
225
244
  version
@@ -237,14 +256,16 @@ async function install(options = {}) {
237
256
  if (cached) {
238
257
  const binPath = node_path.join(cached, binaryName);
239
258
  _actions_core.info(`Using cached spacectl ${targetVersion} at ${cached}`);
259
+ if (options.addToPath !== false) _actions_core.addPath(cached);
240
260
  return {
241
261
  binPath,
242
262
  version: targetVersion
243
263
  };
244
264
  }
245
- const cachedDir = await downloadAndCache(targetVersion, token);
265
+ const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);
246
266
  const binPath = node_path.join(cachedDir, binaryName);
247
267
  await getInstalledVersion(binPath);
268
+ if (options.addToPath !== false) _actions_core.addPath(cachedDir);
248
269
  return {
249
270
  binPath,
250
271
  version: targetVersion
@@ -252,6 +273,12 @@ async function install(options = {}) {
252
273
  }
253
274
 
254
275
  //#endregion
276
+ Object.defineProperty(exports, 'SpacectlExecError', {
277
+ enumerable: true,
278
+ get: function () {
279
+ return SpacectlExecError;
280
+ }
281
+ });
255
282
  Object.defineProperty(exports, 'SpacectlInstallError', {
256
283
  enumerable: true,
257
284
  get: function () {
@@ -270,4 +297,4 @@ Object.defineProperty(exports, 'install', {
270
297
  return install;
271
298
  }
272
299
  });
273
- //# sourceMappingURL=spacectl-6udimwjI.cjs.map
300
+ //# sourceMappingURL=spacectl-DJeTPYLE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacectl-DJeTPYLE.cjs","names":["actionsExec","os","REPO_OWNER","REPO_NAME","github","path","io","tc"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport class SpacectlExecError extends Error {\n readonly exitCode: number;\n readonly stdout: string;\n readonly stderr: string;\n readonly command: string;\n\n constructor(\n message: string,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n cause?: unknown\n ) {\n super(message, cause !== undefined ? { cause } : undefined);\n this.name = \"SpacectlExecError\";\n this.exitCode = exitCode;\n this.stdout = stdout;\n this.stderr = stderr;\n this.command = command;\n }\n}\n\nexport async function exec(\n args: string[],\n options?: ExecOptions & { binPath?: string }\n): Promise<ExecResult> {\n const binPath = options?.binPath ?? \"space\"; // install() should have added to path by default\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n const command = `${binPath} ${execArgs.join(\" \")}`;\n let errorMessage = `'${command}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n throw new Error(`Unsupported architecture: ${arch}`);\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^[vV]/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName, type Platform, type Arch } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n /** Check for existing binary before downloading. @default true */\n useSystemBinary?: boolean;\n /** Add binary directory to PATH via core.addPath(). @default true */\n addToPath?: boolean;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"UNSUPPORTED_ARCH\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message, { cause });\n this.name = \"SpacectlInstallError\";\n this.code = code;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec([\"version\"], { binPath });\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nexport function getDownloadUrl(version: string, platform: Platform, arch: Arch): string {\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(\n version: string,\n platform: Platform,\n arch: Arch,\n token?: string\n): Promise<string> {\n const url = getDownloadUrl(version, platform, arch);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n let platform: Platform;\n try {\n platform = getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n let arch: Arch;\n try {\n arch = getArch();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported architecture: ${process.arch}`,\n \"UNSUPPORTED_ARCH\",\n error\n );\n }\n\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\" && options.useSystemBinary !== false) {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n if (options.addToPath !== false) {\n core.addPath(path.dirname(existingPath));\n }\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n if (options.addToPath !== false) {\n core.addPath(cached);\n }\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n if (options.addToPath !== false) {\n core.addPath(cachedDir);\n }\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
@@ -1,13 +1,28 @@
1
- import * as core from "@actions/core";
2
1
  import * as actionsExec from "@actions/exec";
3
2
  import * as path from "node:path";
3
+ import * as core from "@actions/core";
4
4
  import * as io from "@actions/io";
5
5
  import * as tc from "@actions/tool-cache";
6
6
  import * as os from "node:os";
7
7
  import * as github from "@actions/github";
8
8
 
9
9
  //#region src/spacectl/exec.ts
10
- async function exec(binPath, args, options) {
10
+ var SpacectlExecError = class extends Error {
11
+ exitCode;
12
+ stdout;
13
+ stderr;
14
+ command;
15
+ constructor(message, exitCode, stdout, stderr, command, cause) {
16
+ super(message, cause !== void 0 ? { cause } : void 0);
17
+ this.name = "SpacectlExecError";
18
+ this.exitCode = exitCode;
19
+ this.stdout = stdout;
20
+ this.stderr = stderr;
21
+ this.command = command;
22
+ }
23
+ };
24
+ async function exec(args, options) {
25
+ const binPath = options?.binPath ?? "space";
11
26
  const execArgs = [...args, "--output=json"];
12
27
  let stdout = "";
13
28
  let stderr = "";
@@ -26,13 +41,13 @@ async function exec(binPath, args, options) {
26
41
  }
27
42
  });
28
43
  if (exitCode !== 0) {
29
- let errorMessage = `'${binPath} ${execArgs.join(" ")}' failed with exit code ${exitCode}`;
44
+ const command = `${binPath} ${execArgs.join(" ")}`;
45
+ let errorMessage = `'${command}' failed with exit code ${exitCode}`;
30
46
  try {
31
47
  const errorJson = JSON.parse(stdout.trim());
32
48
  if (errorJson.message) errorMessage = errorJson.message;
33
49
  } catch {}
34
- core.error(errorMessage);
35
- process.exit(exitCode);
50
+ throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);
36
51
  }
37
52
  return {
38
53
  exitCode,
@@ -53,10 +68,11 @@ function getPlatform() {
53
68
  }
54
69
  }
55
70
  function getArch() {
56
- switch (os.arch()) {
71
+ const arch = os.arch();
72
+ switch (arch) {
57
73
  case "arm64": return "arm64";
58
74
  case "x64": return "amd64";
59
- default: return "amd64";
75
+ default: throw new Error(`Unsupported architecture: ${arch}`);
60
76
  }
61
77
  }
62
78
  function getBinaryName() {
@@ -68,7 +84,7 @@ function getBinaryName() {
68
84
  const REPO_OWNER$1 = "namespacelabs";
69
85
  const REPO_NAME$1 = "space";
70
86
  function normalizeVersion(version) {
71
- return version.trim().replace(/^v/, "");
87
+ return version.trim().replace(/^[vV]/, "");
72
88
  }
73
89
  async function getLatestVersion(token) {
74
90
  const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || "");
@@ -112,12 +128,10 @@ const REPO_OWNER = "namespacelabs";
112
128
  const REPO_NAME = "space";
113
129
  var SpacectlInstallError = class extends Error {
114
130
  code;
115
- cause;
116
131
  constructor(message, code, cause) {
117
- super(message);
132
+ super(message, { cause });
118
133
  this.name = "SpacectlInstallError";
119
134
  this.code = code;
120
- this.cause = cause;
121
135
  }
122
136
  };
123
137
  async function findExistingBinary() {
@@ -142,7 +156,7 @@ async function findExistingBinary() {
142
156
  }
143
157
  }
144
158
  async function getInstalledVersion(binPath) {
145
- const result = await exec(binPath, ["version"]);
159
+ const result = await exec(["version"], { binPath });
146
160
  try {
147
161
  return normalizeVersion(JSON.parse(result.stdout.trim()).version);
148
162
  } catch (error) {
@@ -150,13 +164,11 @@ async function getInstalledVersion(binPath) {
150
164
  throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, "EXEC_FAILED", error);
151
165
  }
152
166
  }
153
- function getDownloadUrl(version) {
154
- return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${getPlatform()}_${getArch()}.tar.gz`}`;
167
+ function getDownloadUrl(version, platform, arch) {
168
+ return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`}`;
155
169
  }
156
- async function downloadAndCache(version, token) {
157
- const platform = getPlatform();
158
- const arch = getArch();
159
- const url = getDownloadUrl(version);
170
+ async function downloadAndCache(version, platform, arch, token) {
171
+ const url = getDownloadUrl(version, platform, arch);
160
172
  core.info(`Downloading spacectl ${version} from ${url}`);
161
173
  let archivePath;
162
174
  try {
@@ -174,18 +186,25 @@ async function downloadAndCache(version, token) {
174
186
  async function install(options = {}) {
175
187
  const versionSpec = options.version ?? "";
176
188
  const token = options.githubToken ?? process.env.GITHUB_TOKEN;
189
+ let platform;
177
190
  try {
178
- getPlatform();
191
+ platform = getPlatform();
179
192
  } catch (error) {
180
193
  throw new SpacectlInstallError(`Unsupported platform: ${process.platform}`, "UNSUPPORTED_PLATFORM", error);
181
194
  }
182
- const arch = getArch();
195
+ let arch;
196
+ try {
197
+ arch = getArch();
198
+ } catch (error) {
199
+ throw new SpacectlInstallError(`Unsupported architecture: ${process.arch}`, "UNSUPPORTED_ARCH", error);
200
+ }
183
201
  const binaryName = getBinaryName();
184
- if (versionSpec === "") {
202
+ if (versionSpec === "" && options.useSystemBinary !== false) {
185
203
  const existingPath = await findExistingBinary();
186
204
  if (existingPath) {
187
205
  const version = await getInstalledVersion(existingPath);
188
206
  core.info(`Using existing spacectl ${version} at ${existingPath}`);
207
+ if (options.addToPath !== false) core.addPath(path.dirname(existingPath));
189
208
  return {
190
209
  binPath: existingPath,
191
210
  version
@@ -203,14 +222,16 @@ async function install(options = {}) {
203
222
  if (cached) {
204
223
  const binPath = path.join(cached, binaryName);
205
224
  core.info(`Using cached spacectl ${targetVersion} at ${cached}`);
225
+ if (options.addToPath !== false) core.addPath(cached);
206
226
  return {
207
227
  binPath,
208
228
  version: targetVersion
209
229
  };
210
230
  }
211
- const cachedDir = await downloadAndCache(targetVersion, token);
231
+ const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);
212
232
  const binPath = path.join(cachedDir, binaryName);
213
233
  await getInstalledVersion(binPath);
234
+ if (options.addToPath !== false) core.addPath(cachedDir);
214
235
  return {
215
236
  binPath,
216
237
  version: targetVersion
@@ -218,5 +239,5 @@ async function install(options = {}) {
218
239
  }
219
240
 
220
241
  //#endregion
221
- export { install as n, exec as r, SpacectlInstallError as t };
222
- //# sourceMappingURL=spacectl-COQOkFHx.mjs.map
242
+ export { exec as i, install as n, SpacectlExecError as r, SpacectlInstallError as t };
243
+ //# sourceMappingURL=spacectl-DoqF-x68.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spacectl-DoqF-x68.mjs","names":["REPO_OWNER","REPO_NAME"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport class SpacectlExecError extends Error {\n readonly exitCode: number;\n readonly stdout: string;\n readonly stderr: string;\n readonly command: string;\n\n constructor(\n message: string,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n cause?: unknown\n ) {\n super(message, cause !== undefined ? { cause } : undefined);\n this.name = \"SpacectlExecError\";\n this.exitCode = exitCode;\n this.stdout = stdout;\n this.stderr = stderr;\n this.command = command;\n }\n}\n\nexport async function exec(\n args: string[],\n options?: ExecOptions & { binPath?: string }\n): Promise<ExecResult> {\n const binPath = options?.binPath ?? \"space\"; // install() should have added to path by default\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n const command = `${binPath} ${execArgs.join(\" \")}`;\n let errorMessage = `'${command}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n throw new Error(`Unsupported architecture: ${arch}`);\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^[vV]/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName, type Platform, type Arch } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n /** Check for existing binary before downloading. @default true */\n useSystemBinary?: boolean;\n /** Add binary directory to PATH via core.addPath(). @default true */\n addToPath?: boolean;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"UNSUPPORTED_ARCH\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message, { cause });\n this.name = \"SpacectlInstallError\";\n this.code = code;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec([\"version\"], { binPath });\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nexport function getDownloadUrl(version: string, platform: Platform, arch: Arch): string {\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(\n version: string,\n platform: Platform,\n arch: Arch,\n token?: string\n): Promise<string> {\n const url = getDownloadUrl(version, platform, arch);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n let platform: Platform;\n try {\n platform = getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n let arch: Arch;\n try {\n arch = getArch();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported architecture: ${process.arch}`,\n \"UNSUPPORTED_ARCH\",\n error\n );\n }\n\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\" && options.useSystemBinary !== false) {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n if (options.addToPath !== false) {\n core.addPath(path.dirname(existingPath));\n }\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n if (options.addToPath !== false) {\n core.addPath(cached);\n }\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n if (options.addToPath !== false) {\n core.addPath(cachedDir);\n }\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
package/dist/spacectl.cjs CHANGED
@@ -1,5 +1,6 @@
1
- const require_spacectl = require('./spacectl-6udimwjI.cjs');
1
+ const require_spacectl = require('./spacectl-DJeTPYLE.cjs');
2
2
 
3
+ exports.SpacectlExecError = require_spacectl.SpacectlExecError;
3
4
  exports.SpacectlInstallError = require_spacectl.SpacectlInstallError;
4
5
  exports.exec = require_spacectl.exec;
5
6
  exports.install = require_spacectl.install;
@@ -1,2 +1,2 @@
1
- import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as exec, t as InstallOptions } from "./index-DJzkZaGq.cjs";
2
- export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
1
+ import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-D8KbltV5.cjs";
2
+ export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
@@ -1,2 +1,2 @@
1
- import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as exec, t as InstallOptions } from "./index-C6FXIu0Q.mjs";
2
- export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
1
+ import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-DwGIuc_X.mjs";
2
+ export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
package/dist/spacectl.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { n as install, r as exec, t as SpacectlInstallError } from "./spacectl-COQOkFHx.mjs";
1
+ import { i as exec, n as install, r as SpacectlExecError, t as SpacectlInstallError } from "./spacectl-DoqF-x68.mjs";
2
2
 
3
- export { SpacectlInstallError, exec, install };
3
+ export { SpacectlExecError, SpacectlInstallError, exec, install };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namespacelabs/actions-toolkit",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "GitHub Actions toolkit for Namespace",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -11,7 +11,6 @@
11
11
  "engines": {
12
12
  "node": ">=20"
13
13
  },
14
- "packageManager": "pnpm@10.6.2",
15
14
  "files": [
16
15
  "dist"
17
16
  ],
@@ -41,17 +40,6 @@
41
40
  },
42
41
  "./package.json": "./package.json"
43
42
  },
44
- "scripts": {
45
- "build": "tsdown",
46
- "clean": "rm -rf dist",
47
- "typecheck": "tsc --noEmit",
48
- "lint": "eslint src",
49
- "lint:fix": "eslint src --fix",
50
- "format": "prettier --write \"src/**/*.ts\"",
51
- "format:check": "prettier --check \"src/**/*.ts\"",
52
- "test": "vitest",
53
- "test:run": "vitest run"
54
- },
55
43
  "dependencies": {
56
44
  "@actions/core": "^1.11.1",
57
45
  "@actions/exec": "^1.1.1",
@@ -70,5 +58,17 @@
70
58
  "typescript": "^5.8.3",
71
59
  "typescript-eslint": "^8.54.0",
72
60
  "vitest": "^3.1.4"
61
+ },
62
+ "scripts": {
63
+ "build": "tsdown",
64
+ "clean": "rm -rf dist",
65
+ "typecheck": "tsc --noEmit",
66
+ "lint": "eslint src",
67
+ "lint:fix": "eslint src --fix",
68
+ "format": "prettier --write \"src/**/*.ts\"",
69
+ "format:check": "prettier --check \"src/**/*.ts\"",
70
+ "test": "vitest",
71
+ "test:run": "vitest run",
72
+ "release": "./scripts/release.sh"
73
73
  }
74
- }
74
+ }
@@ -1,26 +0,0 @@
1
- import * as actionsExec from "@actions/exec";
2
-
3
- //#region src/spacectl/exec.d.ts
4
- type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
5
- type ExecResult = actionsExec.ExecOutput;
6
- declare function exec(binPath: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
7
- //#endregion
8
- //#region src/spacectl/installer.d.ts
9
- interface InstallOptions {
10
- version?: string;
11
- githubToken?: string;
12
- }
13
- interface InstallResult {
14
- binPath: string;
15
- version: string;
16
- }
17
- type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
18
- declare class SpacectlInstallError extends Error {
19
- readonly code: SpacectlInstallErrorCode;
20
- readonly cause?: unknown;
21
- constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
22
- }
23
- declare function install(options?: InstallOptions): Promise<InstallResult>;
24
- //#endregion
25
- export { ExecOptions as a, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, exec as s, InstallOptions as t };
26
- //# sourceMappingURL=index-C6FXIu0Q.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-C6FXIu0Q.d.mts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAGY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,iBAEf,IAAA,CACpB,OAAA,UACA,IAAA,YACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;;;UCDM,cAAA;EACf,OAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAMC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;EAAA,SACN,KAAA;cAEG,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
@@ -1,26 +0,0 @@
1
- import * as actionsExec from "@actions/exec";
2
-
3
- //#region src/spacectl/exec.d.ts
4
- type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
5
- type ExecResult = actionsExec.ExecOutput;
6
- declare function exec(binPath: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
7
- //#endregion
8
- //#region src/spacectl/installer.d.ts
9
- interface InstallOptions {
10
- version?: string;
11
- githubToken?: string;
12
- }
13
- interface InstallResult {
14
- binPath: string;
15
- version: string;
16
- }
17
- type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
18
- declare class SpacectlInstallError extends Error {
19
- readonly code: SpacectlInstallErrorCode;
20
- readonly cause?: unknown;
21
- constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
22
- }
23
- declare function install(options?: InstallOptions): Promise<InstallResult>;
24
- //#endregion
25
- export { ExecOptions as a, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, exec as s, InstallOptions as t };
26
- //# sourceMappingURL=index-DJzkZaGq.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DJzkZaGq.d.cts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAGY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,iBAEf,IAAA,CACpB,OAAA,UACA,IAAA,YACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;;;UCDM,cAAA;EACf,OAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAMC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;EAAA,SACN,KAAA;cAEG,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spacectl-6udimwjI.cjs","names":["actionsExec","os","REPO_OWNER","REPO_NAME","github","path","io","tc"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as core from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport async function exec(\n binPath: string,\n args: string[],\n options?: ExecOptions\n): Promise<ExecResult> {\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n let errorMessage = `'${binPath} ${execArgs.join(\" \")}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n core.error(errorMessage);\n process.exit(exitCode);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n return \"amd64\";\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^v/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n readonly cause?: unknown;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message);\n this.name = \"SpacectlInstallError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec(binPath, [\"version\"]);\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nfunction getDownloadUrl(version: string): string {\n const platform = getPlatform();\n const arch = getArch();\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(version: string, token?: string): Promise<string> {\n const platform = getPlatform();\n const arch = getArch();\n const url = getDownloadUrl(version);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n try {\n getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n const arch = getArch();\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\") {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,eAAsB,KACpB,SACA,MACA,SACqB;CACrB,MAAM,WAAW,CAAC,GAAG,MAAM,gBAAgB;CAE3C,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,MAAM,WAAW,MAAMA,cAAY,KAAK,SAAS,UAAU;EACzD,GAAG;EACH,kBAAkB;EAClB,QAAQ;EACR,WAAW;GACT,SAAS,SAAiB;AACxB,cAAU,KAAK,UAAU;;GAE3B,SAAS,SAAiB;AACxB,cAAU,KAAK,UAAU;AAIzB,YAAQ,OAAO,MAAM,KAAK;;GAE7B;EACF,CAAC;AAEF,KAAI,aAAa,GAAG;EAClB,IAAI,eAAe,IAAI,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC,0BAA0B;AAC/E,MAAI;GACF,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,CAAC;AAC3C,OAAI,UAAU,QACZ,gBAAe,UAAU;UAErB;AAGR,gBAAK,MAAM,aAAa;AACxB,UAAQ,KAAK,SAAS;;AAGxB,QAAO;EAAE;EAAU;EAAQ;EAAQ;;;;;AC/CrC,SAAgB,cAAwB;CACtC,MAAM,WAAWC,QAAG,UAAU;AAC9B,SAAQ,UAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,QACE,OAAM,IAAI,MAAM,yBAAyB,WAAW;;;AAI1D,SAAgB,UAAgB;AAE9B,SADaA,QAAG,MAAM,EACtB;EACE,KAAK,QACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAgB,gBAAwB;AACtC,QAAO,aAAa,KAAK,YAAY,cAAc;;;;;AC7BrD,MAAMC,eAAa;AACnB,MAAMC,cAAY;AAElB,SAAgB,iBAAiB,SAAyB;AACxD,QAAO,QAAQ,MAAM,CAAC,QAAQ,MAAM,GAAG;;AAGzC,eAAsB,iBAAiB,OAAiC;CACtE,MAAM,UAAUC,gBAAO,WAAW,SAAS,QAAQ,IAAI,gBAAgB,GAAG;AAE1E,KAAI;EACF,MAAM,EAAE,MAAM,YAAY,MAAM,QAAQ,KAAK,MAAM,iBAAiB;GAClE,OAAOF;GACP,MAAMC;GACP,CAAC;AACF,SAAO,iBAAiB,QAAQ,SAAS;UAClC,OAAO;AACd,gBAAK,MAAM,iCAAiC,QAAQ;AACpD,QAAM,IAAI,MACR,oIAED;;;AAIL,eAAsB,oBAAoB,OAAiC;CACzE,MAAM,UAAUC,gBAAO,WAAW,SAAS,QAAQ,IAAI,gBAAgB,GAAG;AAE1E,KAAI;EACF,MAAM,WAAW,QAAQ,SAAS,SAAS,QAAQ,KAAK,MAAM,cAAc;GAC1E,OAAOF;GACP,MAAMC;GACN,UAAU;GACX,CAAC;AAEF,aAAW,MAAM,EAAE,MAAM,cAAc,SACrC,MAAK,MAAM,WAAW,SACpB,KAAI,QAAQ,SAAS,SAAS,OAAO,CACnC,QAAO,iBAAiB,QAAQ,SAAS;AAK/C,QAAM,IAAI,MAAM,uBAAuB;UAChC,OAAO;AACd,gBAAK,MAAM,8BAA8B,QAAQ;AACjD,QAAM,IAAI,MACR,iIAED;;;AAIL,eAAsB,eAAe,aAAqB,OAAiC;CACzF,MAAM,OAAO,YAAY,MAAM,CAAC,aAAa;AAE7C,KAAI,SAAS,MAAM,SAAS,SAC1B,QAAO,iBAAiB,MAAM;AAGhC,KAAI,SAAS,MACX,QAAO,oBAAoB,MAAM;AAGnC,QAAO,iBAAiB,YAAY;;;;;AC1DtC,MAAM,YAAY;AAClB,MAAM,aAAa;AACnB,MAAM,YAAY;AAkBlB,IAAa,uBAAb,cAA0C,MAAM;CAC9C,AAAS;CACT,AAAS;CAET,YAAY,SAAiB,MAAgC,OAAiB;AAC5E,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,QAAQ;;;AAIjB,eAAe,qBAAkD;CAC/D,MAAM,aAAa,eAAe;CAElC,MAAM,eAAe,QAAQ,IAAI;AACjC,KAAI,cAAc;EAChB,MAAM,gBAAgBE,UAAK,KAAK,cAAc,WAAW;AACzD,MAAI;AACF,SAAMC,YAAG,MAAM,eAAe,KAAK;AACnC,iBAAK,MAAM,uCAAuC,gBAAgB;AAClE,UAAO;UACD;AACN,iBAAK,MAAM,sCAAsC,gBAAgB;;;AAIrE,KAAI;EACF,MAAM,aAAa,MAAMA,YAAG,MAAM,WAAW,KAAK;AAClD,gBAAK,MAAM,kCAAkC,aAAa;AAC1D,SAAO;SACD;AACN,gBAAK,MAAM,2BAA2B;;;AAM1C,eAAe,oBAAoB,SAAkC;CACnE,MAAM,SAAS,MAAM,KAAK,SAAS,CAAC,UAAU,CAAC;AAE/C,KAAI;AAEF,SAAO,iBADQ,KAAK,MAAM,OAAO,OAAO,MAAM,CAAC,CAChB,QAAQ;UAChC,OAAO;AACd,gBAAK,MAAM,mCAAmC,QAAQ;AACtD,QAAM,IAAI,qBAAqB,gCAAgC,WAAW,eAAe,MAAM;;;AAInG,SAAS,eAAe,SAAyB;AAI/C,QAAO,sBAAsB,WAAW,GAAG,UAAU,sBAAsB,QAAQ,GADlE,GAAG,UAAU,GAAG,QAAQ,GAFxB,aAAa,CAEuB,GADxC,SAAS,CACuC;;AAI/D,eAAe,iBAAiB,SAAiB,OAAiC;CAChF,MAAM,WAAW,aAAa;CAC9B,MAAM,OAAO,SAAS;CACtB,MAAM,MAAM,eAAe,QAAQ;AAEnC,eAAK,KAAK,wBAAwB,QAAQ,QAAQ,MAAM;CAExD,IAAI;AACJ,KAAI;EACF,MAAM,UAAkC,EAAE;AAC1C,MAAI,MACF,SAAQ,mBAAmB,SAAS;AAEtC,gBAAc,MAAMC,oBAAG,aAAa,KAAK,QAAW,QAAW,QAAQ;UAChE,OAAO;AACd,QAAM,IAAI,qBACR,+BAA+B,QAAQ,OAAO,SAAS,GAAG,QAC1D,mBACA,MACD;;CAGH,MAAM,gBAAgB,MAAMA,oBAAG,WAAW,YAAY;CACtD,MAAM,aAAa,MAAMA,oBAAG,SAAS,eAAe,WAAW,SAAS,KAAK;AAE7E,eAAK,KAAK,mBAAmB,QAAQ,MAAM,aAAa;AACxD,QAAO;;AAGT,eAAsB,QAAQ,UAA0B,EAAE,EAA0B;CAClF,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,QAAQ,QAAQ,eAAe,QAAQ,IAAI;AAEjD,KAAI;AACF,eAAa;UACN,OAAO;AACd,QAAM,IAAI,qBACR,yBAAyB,QAAQ,YACjC,wBACA,MACD;;CAGH,MAAM,OAAO,SAAS;CACtB,MAAM,aAAa,eAAe;AAElC,KAAI,gBAAgB,IAAI;EACtB,MAAM,eAAe,MAAM,oBAAoB;AAC/C,MAAI,cAAc;GAChB,MAAM,UAAU,MAAM,oBAAoB,aAAa;AACvD,iBAAK,KAAK,2BAA2B,QAAQ,MAAM,eAAe;AAClE,UAAO;IACL,SAAS;IACT;IACD;;AAEH,gBAAK,KAAK,yDAAyD;;CAGrE,IAAI;AACJ,KAAI;AACF,kBACE,gBAAgB,KACZ,MAAM,eAAe,UAAU,MAAM,GACrC,MAAM,eAAe,aAAa,MAAM;UACvC,OAAO;AACd,QAAM,IAAI,qBACR,8BAA8B,YAAY,IAC1C,0BACA,MACD;;CAGH,MAAM,SAASA,oBAAG,KAAK,WAAW,eAAe,KAAK;AACtD,KAAI,QAAQ;EACV,MAAM,UAAUF,UAAK,KAAK,QAAQ,WAAW;AAC7C,gBAAK,KAAK,yBAAyB,cAAc,MAAM,SAAS;AAChE,SAAO;GACL;GACA,SAAS;GACV;;CAGH,MAAM,YAAY,MAAM,iBAAiB,eAAe,MAAM;CAC9D,MAAM,UAAUA,UAAK,KAAK,WAAW,WAAW;AAEhD,OAAM,oBAAoB,QAAQ;AAElC,QAAO;EACL;EACA,SAAS;EACV"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spacectl-COQOkFHx.mjs","names":["REPO_OWNER","REPO_NAME"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as core from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport async function exec(\n binPath: string,\n args: string[],\n options?: ExecOptions\n): Promise<ExecResult> {\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n let errorMessage = `'${binPath} ${execArgs.join(\" \")}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n core.error(errorMessage);\n process.exit(exitCode);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n return \"amd64\";\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^v/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n readonly cause?: unknown;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message);\n this.name = \"SpacectlInstallError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec(binPath, [\"version\"]);\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nfunction getDownloadUrl(version: string): string {\n const platform = getPlatform();\n const arch = getArch();\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(version: string, token?: string): Promise<string> {\n const platform = getPlatform();\n const arch = getArch();\n const url = getDownloadUrl(version);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n try {\n getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n const arch = getArch();\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\") {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}