@enactprotocol/cli 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/commands/auth/index.d.ts +12 -0
  2. package/dist/commands/auth/index.d.ts.map +1 -0
  3. package/dist/commands/auth/index.js +743 -0
  4. package/dist/commands/auth/index.js.map +1 -0
  5. package/dist/commands/cache/index.d.ts +11 -0
  6. package/dist/commands/cache/index.d.ts.map +1 -0
  7. package/dist/commands/cache/index.js +304 -0
  8. package/dist/commands/cache/index.js.map +1 -0
  9. package/dist/commands/config/index.d.ts +11 -0
  10. package/dist/commands/config/index.d.ts.map +1 -0
  11. package/dist/commands/config/index.js +138 -0
  12. package/dist/commands/config/index.js.map +1 -0
  13. package/dist/commands/env/index.d.ts +11 -0
  14. package/dist/commands/env/index.d.ts.map +1 -0
  15. package/dist/commands/env/index.js +303 -0
  16. package/dist/commands/env/index.js.map +1 -0
  17. package/dist/commands/exec/index.d.ts +12 -0
  18. package/dist/commands/exec/index.d.ts.map +1 -0
  19. package/dist/commands/exec/index.js +154 -0
  20. package/dist/commands/exec/index.js.map +1 -0
  21. package/dist/commands/get/index.d.ts +11 -0
  22. package/dist/commands/get/index.d.ts.map +1 -0
  23. package/dist/commands/get/index.js +151 -0
  24. package/dist/commands/get/index.js.map +1 -0
  25. package/dist/commands/index.d.ts +24 -0
  26. package/dist/commands/index.d.ts.map +1 -0
  27. package/dist/commands/index.js +27 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/inspect/index.d.ts +13 -0
  30. package/dist/commands/inspect/index.d.ts.map +1 -0
  31. package/dist/commands/inspect/index.js +199 -0
  32. package/dist/commands/inspect/index.js.map +1 -0
  33. package/dist/commands/install/index.d.ts +16 -0
  34. package/dist/commands/install/index.d.ts.map +1 -0
  35. package/dist/commands/install/index.js +520 -0
  36. package/dist/commands/install/index.js.map +1 -0
  37. package/dist/commands/list/index.d.ts +15 -0
  38. package/dist/commands/list/index.d.ts.map +1 -0
  39. package/dist/commands/list/index.js +103 -0
  40. package/dist/commands/list/index.js.map +1 -0
  41. package/dist/commands/publish/index.d.ts +11 -0
  42. package/dist/commands/publish/index.d.ts.map +1 -0
  43. package/dist/commands/publish/index.js +274 -0
  44. package/dist/commands/publish/index.js.map +1 -0
  45. package/dist/commands/report/index.d.ts +12 -0
  46. package/dist/commands/report/index.d.ts.map +1 -0
  47. package/dist/commands/report/index.js +279 -0
  48. package/dist/commands/report/index.js.map +1 -0
  49. package/dist/commands/run/index.d.ts +16 -0
  50. package/dist/commands/run/index.d.ts.map +1 -0
  51. package/dist/commands/run/index.js +525 -0
  52. package/dist/commands/run/index.js.map +1 -0
  53. package/dist/commands/search/index.d.ts +12 -0
  54. package/dist/commands/search/index.d.ts.map +1 -0
  55. package/dist/commands/search/index.js +275 -0
  56. package/dist/commands/search/index.js.map +1 -0
  57. package/dist/commands/setup/index.d.ts +11 -0
  58. package/dist/commands/setup/index.d.ts.map +1 -0
  59. package/dist/commands/setup/index.js +241 -0
  60. package/dist/commands/setup/index.js.map +1 -0
  61. package/dist/commands/sign/index.d.ts +17 -0
  62. package/dist/commands/sign/index.d.ts.map +1 -0
  63. package/dist/commands/sign/index.js +507 -0
  64. package/dist/commands/sign/index.js.map +1 -0
  65. package/dist/commands/trust/index.d.ts +13 -0
  66. package/dist/commands/trust/index.d.ts.map +1 -0
  67. package/dist/commands/trust/index.js +366 -0
  68. package/dist/commands/trust/index.js.map +1 -0
  69. package/dist/commands/unyank/index.d.ts +11 -0
  70. package/dist/commands/unyank/index.d.ts.map +1 -0
  71. package/dist/commands/unyank/index.js +87 -0
  72. package/dist/commands/unyank/index.js.map +1 -0
  73. package/dist/commands/yank/index.d.ts +13 -0
  74. package/dist/commands/yank/index.d.ts.map +1 -0
  75. package/dist/commands/yank/index.js +109 -0
  76. package/dist/commands/yank/index.js.map +1 -0
  77. package/dist/index.d.ts +10 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +67 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/types.d.ts +69 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +15 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/utils/errors.d.ts +159 -0
  86. package/dist/utils/errors.d.ts.map +1 -0
  87. package/dist/utils/errors.js +321 -0
  88. package/dist/utils/errors.js.map +1 -0
  89. package/dist/utils/exit-codes.d.ts +83 -0
  90. package/dist/utils/exit-codes.d.ts.map +1 -0
  91. package/dist/utils/exit-codes.js +126 -0
  92. package/dist/utils/exit-codes.js.map +1 -0
  93. package/dist/utils/ignore.d.ts +25 -0
  94. package/dist/utils/ignore.d.ts.map +1 -0
  95. package/dist/utils/ignore.js +123 -0
  96. package/dist/utils/ignore.js.map +1 -0
  97. package/dist/utils/index.d.ts +8 -0
  98. package/dist/utils/index.d.ts.map +1 -0
  99. package/dist/utils/index.js +12 -0
  100. package/dist/utils/index.js.map +1 -0
  101. package/dist/utils/output.d.ts +103 -0
  102. package/dist/utils/output.d.ts.map +1 -0
  103. package/dist/utils/output.js +201 -0
  104. package/dist/utils/output.js.map +1 -0
  105. package/dist/utils/spinner.d.ts +83 -0
  106. package/dist/utils/spinner.d.ts.map +1 -0
  107. package/dist/utils/spinner.js +162 -0
  108. package/dist/utils/spinner.js.map +1 -0
  109. package/package.json +5 -5
  110. package/src/index.ts +4 -0
  111. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,303 @@
1
+ /**
2
+ * enact env command
3
+ *
4
+ * Manage environment variables and secrets.
5
+ */
6
+ import { deleteEnv, deleteSecret, getEnv, listEnv, listSecrets, secretExists, setEnv, setSecret, } from "@enactprotocol/secrets";
7
+ import { dim, error, formatError, header, info, json, keyValue, newline, password, success, table, } from "../../utils";
8
+ /**
9
+ * Set environment variable or secret
10
+ */
11
+ async function envSetHandler(key, value, options, ctx) {
12
+ if (options.secret) {
13
+ // Setting a secret in the keyring
14
+ if (!options.namespace) {
15
+ error("--namespace is required when setting a secret");
16
+ dim("Example: enact env set API_KEY --secret --namespace alice/api");
17
+ process.exit(1);
18
+ }
19
+ // If no value provided, prompt for it
20
+ let secretValue = value;
21
+ if (!secretValue) {
22
+ if (!ctx.isInteractive) {
23
+ error("Value is required in non-interactive mode");
24
+ process.exit(1);
25
+ }
26
+ const prompted = await password(`Enter value for ${key}:`);
27
+ if (!prompted) {
28
+ error("No value provided");
29
+ process.exit(1);
30
+ }
31
+ secretValue = prompted;
32
+ }
33
+ await setSecret(options.namespace, key, secretValue);
34
+ if (options.json) {
35
+ json({ set: true, key, namespace: options.namespace, type: "secret" });
36
+ return;
37
+ }
38
+ success(`Secret ${key} set for namespace ${options.namespace}`);
39
+ }
40
+ else {
41
+ // Setting an environment variable in .env file
42
+ if (!value) {
43
+ error("Value is required for environment variables");
44
+ dim("Example: enact env set API_URL https://api.example.com");
45
+ process.exit(1);
46
+ }
47
+ const scope = options.local ? "local" : "global";
48
+ setEnv(key, value, scope, ctx.cwd);
49
+ if (options.json) {
50
+ json({ set: true, key, value, scope, type: "env" });
51
+ return;
52
+ }
53
+ success(`Environment variable ${key} set (${scope})`);
54
+ }
55
+ }
56
+ /**
57
+ * Get environment variable or check secret existence
58
+ */
59
+ async function envGetHandler(key, options, ctx) {
60
+ if (options.secret) {
61
+ // Check if secret exists (never show value)
62
+ if (!options.namespace) {
63
+ error("--namespace is required when getting a secret");
64
+ process.exit(1);
65
+ }
66
+ const exists = await secretExists(options.namespace, key);
67
+ if (options.json) {
68
+ json({ key, namespace: options.namespace, exists, type: "secret" });
69
+ return;
70
+ }
71
+ if (exists) {
72
+ success(`Secret ${key} exists for namespace ${options.namespace}`);
73
+ }
74
+ else {
75
+ info(`Secret ${key} not found for namespace ${options.namespace}`);
76
+ }
77
+ }
78
+ else {
79
+ // Get environment variable
80
+ const result = getEnv(key, undefined, ctx.cwd);
81
+ if (options.json) {
82
+ json(result ? { ...result, type: "env" } : { key, found: false, type: "env" });
83
+ return;
84
+ }
85
+ if (result) {
86
+ keyValue("Key", key);
87
+ keyValue("Value", result.value);
88
+ keyValue("Source", result.source);
89
+ if (result.filePath) {
90
+ keyValue("File", result.filePath);
91
+ }
92
+ }
93
+ else {
94
+ info(`Environment variable ${key} not found`);
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * List environment variables or secrets
100
+ */
101
+ async function envListHandler(options, ctx) {
102
+ if (options.secret) {
103
+ // List secrets for a namespace
104
+ if (!options.namespace) {
105
+ error("--namespace is required when listing secrets");
106
+ process.exit(1);
107
+ }
108
+ const secrets = await listSecrets(options.namespace);
109
+ if (options.json) {
110
+ json({ namespace: options.namespace, secrets, type: "secrets" });
111
+ return;
112
+ }
113
+ if (secrets.length === 0) {
114
+ info(`No secrets found for namespace ${options.namespace}`);
115
+ return;
116
+ }
117
+ header(`Secrets for ${options.namespace}`);
118
+ newline();
119
+ for (const name of secrets) {
120
+ dim(` • ${name}`);
121
+ }
122
+ newline();
123
+ dim(`Total: ${secrets.length} secret(s)`);
124
+ }
125
+ else {
126
+ // List environment variables
127
+ let scope = "all";
128
+ if (options.local && !options.global) {
129
+ scope = "local";
130
+ }
131
+ else if (options.global && !options.local) {
132
+ scope = "global";
133
+ }
134
+ const envVars = listEnv(scope, ctx.cwd);
135
+ if (options.json) {
136
+ json({ scope, variables: envVars, type: "env" });
137
+ return;
138
+ }
139
+ if (envVars.length === 0) {
140
+ info("No environment variables found");
141
+ dim("Set variables with 'enact env set KEY VALUE'");
142
+ return;
143
+ }
144
+ header("Environment Variables");
145
+ newline();
146
+ const columns = [
147
+ { key: "key", header: "Key", width: 25 },
148
+ { key: "value", header: "Value", width: 40 },
149
+ { key: "source", header: "Source", width: 10 },
150
+ ];
151
+ // Transform to table-compatible format
152
+ const tableData = envVars.map((v) => ({
153
+ key: v.key,
154
+ value: v.value.length > 40 ? `${v.value.slice(0, 37)}...` : v.value,
155
+ source: v.source,
156
+ }));
157
+ table(tableData, columns);
158
+ newline();
159
+ dim(`Total: ${envVars.length} variable(s)`);
160
+ }
161
+ }
162
+ /**
163
+ * Delete environment variable or secret
164
+ */
165
+ async function envDeleteHandler(key, options, ctx) {
166
+ if (options.secret) {
167
+ // Delete secret from keyring
168
+ if (!options.namespace) {
169
+ error("--namespace is required when deleting a secret");
170
+ process.exit(1);
171
+ }
172
+ const deleted = await deleteSecret(options.namespace, key);
173
+ if (options.json) {
174
+ json({ deleted, key, namespace: options.namespace, type: "secret" });
175
+ return;
176
+ }
177
+ if (deleted) {
178
+ success(`Secret ${key} deleted from namespace ${options.namespace}`);
179
+ }
180
+ else {
181
+ info(`Secret ${key} not found for namespace ${options.namespace}`);
182
+ }
183
+ }
184
+ else {
185
+ // Delete environment variable
186
+ const scope = options.local ? "local" : "global";
187
+ const deleted = deleteEnv(key, scope, ctx.cwd);
188
+ if (options.json) {
189
+ json({ deleted, key, scope, type: "env" });
190
+ return;
191
+ }
192
+ if (deleted) {
193
+ success(`Environment variable ${key} deleted (${scope})`);
194
+ }
195
+ else {
196
+ info(`Environment variable ${key} not found (${scope})`);
197
+ }
198
+ }
199
+ }
200
+ /**
201
+ * Configure the env command
202
+ */
203
+ export function configureEnvCommand(program) {
204
+ const env = program.command("env").description("Manage environment variables and secrets");
205
+ // env set
206
+ env
207
+ .command("set")
208
+ .description("Set an environment variable or secret")
209
+ .argument("<key>", "Variable name")
210
+ .argument("[value]", "Variable value (prompted if secret and not provided)")
211
+ .option("-s, --secret", "Store as secret in OS keyring")
212
+ .option("-n, --namespace <namespace>", "Namespace for secret (required with --secret)")
213
+ .option("-l, --local", "Set in project .enact/.env instead of global")
214
+ .option("--json", "Output as JSON")
215
+ .action(async (key, value, options) => {
216
+ const ctx = {
217
+ cwd: process.cwd(),
218
+ options,
219
+ isCI: Boolean(process.env.CI),
220
+ isInteractive: process.stdout.isTTY ?? false,
221
+ };
222
+ try {
223
+ await envSetHandler(key, value, options, ctx);
224
+ }
225
+ catch (err) {
226
+ error(formatError(err));
227
+ process.exit(1);
228
+ }
229
+ });
230
+ // env get
231
+ env
232
+ .command("get")
233
+ .description("Get an environment variable or check if a secret exists")
234
+ .argument("<key>", "Variable name")
235
+ .option("-s, --secret", "Check secret in OS keyring (never shows value)")
236
+ .option("-n, --namespace <namespace>", "Namespace for secret (required with --secret)")
237
+ .option("--json", "Output as JSON")
238
+ .action(async (key, options) => {
239
+ const ctx = {
240
+ cwd: process.cwd(),
241
+ options,
242
+ isCI: Boolean(process.env.CI),
243
+ isInteractive: process.stdout.isTTY ?? false,
244
+ };
245
+ try {
246
+ await envGetHandler(key, options, ctx);
247
+ }
248
+ catch (err) {
249
+ error(formatError(err));
250
+ process.exit(1);
251
+ }
252
+ });
253
+ // env list
254
+ env
255
+ .command("list")
256
+ .description("List environment variables or secrets")
257
+ .option("-s, --secret", "List secrets from OS keyring")
258
+ .option("-n, --namespace <namespace>", "Namespace for secrets (required with --secret)")
259
+ .option("-l, --local", "Show only project .enact/.env variables")
260
+ .option("-g, --global", "Show only global ~/.enact/.env variables")
261
+ .option("--json", "Output as JSON")
262
+ .action(async (options) => {
263
+ const ctx = {
264
+ cwd: process.cwd(),
265
+ options,
266
+ isCI: Boolean(process.env.CI),
267
+ isInteractive: process.stdout.isTTY ?? false,
268
+ };
269
+ try {
270
+ await envListHandler(options, ctx);
271
+ }
272
+ catch (err) {
273
+ error(formatError(err));
274
+ process.exit(1);
275
+ }
276
+ });
277
+ // env delete
278
+ env
279
+ .command("delete")
280
+ .alias("rm")
281
+ .description("Delete an environment variable or secret")
282
+ .argument("<key>", "Variable name")
283
+ .option("-s, --secret", "Delete secret from OS keyring")
284
+ .option("-n, --namespace <namespace>", "Namespace for secret (required with --secret)")
285
+ .option("-l, --local", "Delete from project .enact/.env instead of global")
286
+ .option("--json", "Output as JSON")
287
+ .action(async (key, options) => {
288
+ const ctx = {
289
+ cwd: process.cwd(),
290
+ options,
291
+ isCI: Boolean(process.env.CI),
292
+ isInteractive: process.stdout.isTTY ?? false,
293
+ };
294
+ try {
295
+ await envDeleteHandler(key, options, ctx);
296
+ }
297
+ catch (err) {
298
+ error(formatError(err));
299
+ process.exit(1);
300
+ }
301
+ });
302
+ }
303
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/env/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * enact exec command
3
+ *
4
+ * Execute an arbitrary command in a tool's container environment.
5
+ * Unlike `run`, this allows running any command, not just the manifest-defined one.
6
+ */
7
+ import type { Command } from "commander";
8
+ /**
9
+ * Configure the exec command
10
+ */
11
+ export declare function configureExecCommand(program: Command): void;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0JzC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B3D"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * enact exec command
3
+ *
4
+ * Execute an arbitrary command in a tool's container environment.
5
+ * Unlike `run`, this allows running any command, not just the manifest-defined one.
6
+ */
7
+ import { DaggerExecutionProvider } from "@enactprotocol/execution";
8
+ import { resolveSecrets, resolveToolEnv } from "@enactprotocol/secrets";
9
+ import { resolveToolAuto } from "@enactprotocol/shared";
10
+ import { dim, error, formatError, json, newline, suggest, symbols, withSpinner } from "../../utils";
11
+ /**
12
+ * Display execution result
13
+ */
14
+ function displayResult(result, options) {
15
+ if (options.json) {
16
+ json(result);
17
+ return;
18
+ }
19
+ if (result.success) {
20
+ if (result.output?.stdout) {
21
+ process.stdout.write(result.output.stdout);
22
+ if (!result.output.stdout.endsWith("\n")) {
23
+ newline();
24
+ }
25
+ }
26
+ if (options.verbose && result.output?.stderr) {
27
+ dim(`stderr: ${result.output.stderr}`);
28
+ }
29
+ if (options.verbose && result.metadata) {
30
+ newline();
31
+ dim(`Duration: ${result.metadata.durationMs}ms`);
32
+ dim(`Exit code: ${result.output?.exitCode ?? 0}`);
33
+ }
34
+ }
35
+ else {
36
+ error(`Execution failed: ${result.error?.message ?? "Unknown error"}`);
37
+ if (result.output?.stderr) {
38
+ newline();
39
+ dim("stderr:");
40
+ dim(result.output.stderr);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Parse timeout string (e.g., "30s", "5m", "1h")
46
+ */
47
+ function parseTimeout(timeout) {
48
+ const match = timeout.match(/^(\d+)(s|m|h)?$/);
49
+ if (!match) {
50
+ throw new Error(`Invalid timeout format: ${timeout}. Use format like "30s", "5m", or "1h".`);
51
+ }
52
+ const value = Number.parseInt(match[1] ?? "0", 10);
53
+ const unit = match[2] || "s";
54
+ switch (unit) {
55
+ case "h":
56
+ return value * 60 * 60 * 1000;
57
+ case "m":
58
+ return value * 60 * 1000;
59
+ default:
60
+ return value * 1000;
61
+ }
62
+ }
63
+ /**
64
+ * Exec command handler
65
+ */
66
+ async function execHandler(tool, command, options, ctx) {
67
+ // Resolve the tool
68
+ const resolution = await withSpinner(`Resolving tool: ${tool}`, async () => resolveToolAuto(tool, { startDir: ctx.cwd }), `${symbols.success} Resolved: ${tool}`);
69
+ if (!resolution) {
70
+ error(`Tool not found: ${tool}`);
71
+ suggest(`Try 'enact install ${tool}' first, or check the tool name.`);
72
+ process.exit(1);
73
+ }
74
+ const manifest = resolution.manifest;
75
+ // Resolve environment variables (non-secrets)
76
+ const { resolved: envResolved } = resolveToolEnv(manifest.env ?? {}, ctx.cwd);
77
+ const envVars = {};
78
+ for (const [key, envRes] of envResolved) {
79
+ envVars[key] = envRes.value;
80
+ }
81
+ // Resolve secrets
82
+ const secretDeclarations = Object.entries(manifest.env ?? {})
83
+ .filter(([_, v]) => v.secret)
84
+ .map(([k]) => k);
85
+ if (secretDeclarations.length > 0) {
86
+ const namespace = manifest.name.split("/").slice(0, -1).join("/") || manifest.name;
87
+ const secretResults = await resolveSecrets(namespace, secretDeclarations);
88
+ for (const [key, result] of secretResults) {
89
+ if (result.found && result.value) {
90
+ envVars[key] = result.value;
91
+ }
92
+ }
93
+ }
94
+ // Execute the custom command
95
+ const providerConfig = {};
96
+ if (options.timeout) {
97
+ providerConfig.defaultTimeout = parseTimeout(options.timeout);
98
+ }
99
+ if (options.verbose) {
100
+ providerConfig.verbose = true;
101
+ }
102
+ const provider = new DaggerExecutionProvider(providerConfig);
103
+ try {
104
+ await provider.initialize();
105
+ // Create a modified manifest with the custom command
106
+ const execManifest = {
107
+ ...manifest,
108
+ command,
109
+ };
110
+ const result = await withSpinner(`Executing in ${manifest.name}...`, async () => provider.execute(execManifest, {
111
+ params: {},
112
+ envOverrides: envVars,
113
+ }), options.verbose ? `${symbols.success} Execution complete` : undefined);
114
+ displayResult(result, options);
115
+ if (!result.success) {
116
+ process.exit(1);
117
+ }
118
+ }
119
+ finally {
120
+ // Provider cleanup handled by Dagger
121
+ }
122
+ }
123
+ /**
124
+ * Configure the exec command
125
+ */
126
+ export function configureExecCommand(program) {
127
+ program
128
+ .command("exec")
129
+ .description("Execute an arbitrary command in a tool's container environment")
130
+ .argument("<tool>", "Tool to run in (name, path, or '.' for current directory)")
131
+ .argument("<command>", "Command to execute (quote complex commands)")
132
+ .option("-t, --timeout <duration>", "Execution timeout (e.g., 30s, 5m)")
133
+ .option("-v, --verbose", "Show detailed output")
134
+ .option("--json", "Output result as JSON")
135
+ .action(async (tool, command, options) => {
136
+ const ctx = {
137
+ cwd: process.cwd(),
138
+ options,
139
+ isCI: Boolean(process.env.CI),
140
+ isInteractive: process.stdout.isTTY ?? false,
141
+ };
142
+ try {
143
+ await execHandler(tool, command, options, ctx);
144
+ }
145
+ catch (err) {
146
+ error(formatError(err));
147
+ if (options.verbose && err instanceof Error && err.stack) {
148
+ dim(err.stack);
149
+ }
150
+ process.exit(1);
151
+ }
152
+ });
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/exec/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * enact get command
3
+ *
4
+ * Show detailed information about a tool from the registry.
5
+ */
6
+ import type { Command } from "commander";
7
+ /**
8
+ * Configure the get command
9
+ */
10
+ export declare function configureGetCommand(program: Command): void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/get/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6JzC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB1D"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * enact get command
3
+ *
4
+ * Show detailed information about a tool from the registry.
5
+ */
6
+ import { createApiClient, getToolInfo, getToolVersion, } from "@enactprotocol/api";
7
+ import { loadConfig } from "@enactprotocol/shared";
8
+ import { dim, error, formatError, header, info, json, keyValue, newline, success, } from "../../utils";
9
+ /**
10
+ * Format a date for display
11
+ */
12
+ function formatDate(date) {
13
+ return date.toLocaleDateString("en-US", {
14
+ year: "numeric",
15
+ month: "short",
16
+ day: "numeric",
17
+ });
18
+ }
19
+ /**
20
+ * Display tool info
21
+ */
22
+ function displayToolInfo(tool, options) {
23
+ header(tool.name);
24
+ newline();
25
+ info(tool.description);
26
+ newline();
27
+ keyValue("Latest Version", tool.latestVersion);
28
+ keyValue("License", tool.license);
29
+ keyValue("Created", formatDate(tool.createdAt));
30
+ keyValue("Updated", formatDate(tool.updatedAt));
31
+ if (tool.tags.length > 0) {
32
+ keyValue("Tags", tool.tags.join(", "));
33
+ }
34
+ if (tool.author) {
35
+ keyValue("Author", tool.author.username);
36
+ }
37
+ newline();
38
+ keyValue("Available Versions", tool.versions.join(", "));
39
+ if (options.verbose) {
40
+ newline();
41
+ dim("Use --version <ver> to see version-specific details");
42
+ }
43
+ }
44
+ /**
45
+ * Display version-specific info
46
+ */
47
+ function displayVersionInfo(version) {
48
+ header(`${version.name}@${version.version}`);
49
+ newline();
50
+ info(version.description);
51
+ newline();
52
+ keyValue("Version", version.version);
53
+ keyValue("License", version.license);
54
+ if (version.bundle) {
55
+ keyValue("Bundle Hash", version.bundle.hash);
56
+ keyValue("Bundle Size", `${(version.bundle.size / 1024).toFixed(1)} KB`);
57
+ }
58
+ if (version.yanked) {
59
+ newline();
60
+ dim(`⚠ This version is yanked${version.yankReason ? `: ${version.yankReason}` : ""}`);
61
+ if (version.yankReplacement) {
62
+ dim(` Recommended: ${version.yankReplacement}`);
63
+ }
64
+ }
65
+ if (version.manifest) {
66
+ newline();
67
+ dim("Manifest:");
68
+ console.log(JSON.stringify(version.manifest, null, 2));
69
+ }
70
+ }
71
+ /**
72
+ * Get command handler
73
+ */
74
+ async function getHandler(toolName, options, ctx) {
75
+ const config = loadConfig();
76
+ const registryUrl = process.env.ENACT_REGISTRY_URL ??
77
+ config.registry?.url ??
78
+ "https://siikwkfgsmouioodghho.supabase.co/functions/v1";
79
+ const authToken = config.registry?.authToken;
80
+ const client = createApiClient({
81
+ baseUrl: registryUrl,
82
+ authToken: authToken,
83
+ });
84
+ if (ctx.options.verbose) {
85
+ info(`Fetching info for: ${toolName}`);
86
+ }
87
+ try {
88
+ if (options.version) {
89
+ // Get specific version info
90
+ const versionInfo = await getToolVersion(client, toolName, options.version);
91
+ if (options.json) {
92
+ json(versionInfo);
93
+ return;
94
+ }
95
+ displayVersionInfo(versionInfo);
96
+ }
97
+ else {
98
+ // Get general tool info
99
+ const toolInfo = await getToolInfo(client, toolName);
100
+ if (options.json) {
101
+ json(toolInfo);
102
+ return;
103
+ }
104
+ displayToolInfo(toolInfo, options);
105
+ }
106
+ newline();
107
+ success(`Install with: enact install ${toolName}`);
108
+ }
109
+ catch (err) {
110
+ if (err instanceof Error) {
111
+ if (err.message.includes("not_found") || err.message.includes("404")) {
112
+ error(`Tool not found: ${toolName}`);
113
+ dim("Check the tool name or search with: enact search <query>");
114
+ process.exit(1);
115
+ }
116
+ if (err.message.includes("fetch")) {
117
+ error("Unable to connect to registry. Check your internet connection.");
118
+ process.exit(1);
119
+ }
120
+ }
121
+ throw err;
122
+ }
123
+ }
124
+ /**
125
+ * Configure the get command
126
+ */
127
+ export function configureGetCommand(program) {
128
+ program
129
+ .command("get <tool>")
130
+ .alias("info")
131
+ .description("Show detailed information about a tool")
132
+ .option("-V, --version <version>", "Show info for a specific version")
133
+ .option("-v, --verbose", "Show detailed output")
134
+ .option("--json", "Output as JSON")
135
+ .action(async (toolName, options) => {
136
+ const ctx = {
137
+ cwd: process.cwd(),
138
+ options,
139
+ isCI: Boolean(process.env.CI),
140
+ isInteractive: process.stdout.isTTY ?? false,
141
+ };
142
+ try {
143
+ await getHandler(toolName, options, ctx);
144
+ }
145
+ catch (err) {
146
+ error(formatError(err));
147
+ process.exit(1);
148
+ }
149
+ });
150
+ }
151
+ //# sourceMappingURL=index.js.map