@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,366 @@
1
+ /**
2
+ * enact trust command
3
+ *
4
+ * Manage trusted identities for attestation verification.
5
+ * Uses a unified model: all trust is based on cryptographic attestations.
6
+ * Publishers who want their tools trusted should self-sign them.
7
+ */
8
+ import { addTrustedAuditor as addTrustedAuditorToRegistry, createApiClient, getAttestationList, getMyTrustedAuditors, getToolVersion, removeTrustedAuditor as removeTrustedAuditorFromRegistry, verifyAllAttestations, } from "@enactprotocol/api";
9
+ import { getSecret } from "@enactprotocol/secrets";
10
+ import { addTrustedIdentity, getMinimumAttestations, getTrustPolicy, getTrustedIdentities, removeTrustedIdentity, } from "@enactprotocol/shared";
11
+ import { dim, error, formatError, header, info, json, keyValue, listItem, newline, success, warning, } from "../../utils";
12
+ /** Auth namespace for token storage */
13
+ const AUTH_NAMESPACE = "enact:auth";
14
+ const ACCESS_TOKEN_KEY = "access_token";
15
+ /**
16
+ * Validate identity format
17
+ * Must be provider:identity format (e.g., github:alice, google:user@example.com)
18
+ */
19
+ function validateIdentity(identity) {
20
+ if (!identity.includes(":")) {
21
+ return {
22
+ valid: false,
23
+ error: "Invalid identity format. Use provider:identity format (e.g., github:alice, google:user@example.com)",
24
+ };
25
+ }
26
+ const [provider, ...rest] = identity.split(":");
27
+ const id = rest.join(":"); // Handle cases like google:user@example.com
28
+ if (!provider || !id) {
29
+ return {
30
+ valid: false,
31
+ error: "Invalid identity format. Use provider:identity format (e.g., github:alice)",
32
+ };
33
+ }
34
+ const validProviders = ["github", "google", "microsoft", "gitlab"];
35
+ if (!validProviders.includes(provider) && !provider.startsWith("http")) {
36
+ warning(`Unknown provider '${provider}'. Common providers: ${validProviders.join(", ")}`);
37
+ }
38
+ return { valid: true };
39
+ }
40
+ /**
41
+ * Add a trusted identity
42
+ */
43
+ async function addTrust(identity, options, _ctx) {
44
+ // Validate identity format
45
+ const validation = validateIdentity(identity);
46
+ if (!validation.valid) {
47
+ error(validation.error);
48
+ process.exit(1);
49
+ }
50
+ // Add to local config
51
+ const added = addTrustedIdentity(identity);
52
+ if (added) {
53
+ success(`Added ${identity} to trusted identities`);
54
+ }
55
+ else {
56
+ info(`${identity} is already trusted`);
57
+ }
58
+ // Sync to registry if authenticated and --sync flag
59
+ if (options.sync) {
60
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
61
+ if (authToken) {
62
+ const client = createApiClient();
63
+ client.setAuthToken(authToken);
64
+ try {
65
+ await addTrustedAuditorToRegistry(client, identity);
66
+ success(`Synced ${identity} to registry`);
67
+ }
68
+ catch (err) {
69
+ warning(`Failed to sync to registry: ${formatError(err)}`);
70
+ }
71
+ }
72
+ else {
73
+ dim("Not authenticated - skipping registry sync");
74
+ dim("Run 'enact auth login' to enable registry sync");
75
+ }
76
+ }
77
+ if (options.json) {
78
+ json({ added: true, identity });
79
+ }
80
+ }
81
+ /**
82
+ * Remove a trusted identity
83
+ */
84
+ async function removeTrust(identity, options, _ctx) {
85
+ // Remove from local config
86
+ const removed = removeTrustedIdentity(identity);
87
+ if (removed) {
88
+ success(`Removed ${identity} from trusted identities`);
89
+ }
90
+ else {
91
+ info(`${identity} was not in trusted list`);
92
+ }
93
+ // Sync to registry if authenticated and --sync flag
94
+ if (options.sync) {
95
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
96
+ if (authToken) {
97
+ const client = createApiClient();
98
+ client.setAuthToken(authToken);
99
+ try {
100
+ await removeTrustedAuditorFromRegistry(client, identity);
101
+ success(`Removed ${identity} from registry`);
102
+ }
103
+ catch (err) {
104
+ warning(`Failed to sync to registry: ${formatError(err)}`);
105
+ }
106
+ }
107
+ else {
108
+ dim("Not authenticated - skipping registry sync");
109
+ }
110
+ }
111
+ if (options.json) {
112
+ json({ removed: true, identity });
113
+ }
114
+ }
115
+ /**
116
+ * Trust command handler (add or remove)
117
+ */
118
+ async function trustHandler(identity, options, ctx) {
119
+ if (options.remove) {
120
+ return removeTrust(identity, options, ctx);
121
+ }
122
+ return addTrust(identity, options, ctx);
123
+ }
124
+ /**
125
+ * List trusted identities
126
+ */
127
+ async function trustListHandler(options, _ctx) {
128
+ const auditors = getTrustedIdentities();
129
+ const policy = getTrustPolicy();
130
+ const minimumAttestations = getMinimumAttestations();
131
+ // Get remote identities if authenticated and --sync flag
132
+ let remoteIdentities = [];
133
+ if (options.sync) {
134
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
135
+ if (authToken) {
136
+ const client = createApiClient();
137
+ client.setAuthToken(authToken);
138
+ try {
139
+ remoteIdentities = await getMyTrustedAuditors(client);
140
+ }
141
+ catch (err) {
142
+ warning(`Failed to fetch remote trust config: ${formatError(err)}`);
143
+ }
144
+ }
145
+ else {
146
+ dim("Not authenticated - showing local config only");
147
+ }
148
+ }
149
+ if (options.json) {
150
+ json({
151
+ identities: auditors,
152
+ remoteIdentities: options.sync ? remoteIdentities : undefined,
153
+ policy,
154
+ minimum_attestations: minimumAttestations,
155
+ });
156
+ return;
157
+ }
158
+ header("Trusted Identities (Local)");
159
+ newline();
160
+ if (auditors.length === 0) {
161
+ dim(" No trusted identities configured");
162
+ dim(" Add with: enact trust provider:identity");
163
+ }
164
+ else {
165
+ for (const identity of auditors) {
166
+ listItem(identity, 2);
167
+ }
168
+ }
169
+ if (options.sync && remoteIdentities.length > 0) {
170
+ newline();
171
+ header("Trusted Identities (Registry)");
172
+ newline();
173
+ for (const identity of remoteIdentities) {
174
+ listItem(identity, 2);
175
+ }
176
+ }
177
+ newline();
178
+ dim(`Policy: ${policy}`);
179
+ dim(`Minimum attestations: ${minimumAttestations}`);
180
+ }
181
+ /**
182
+ * Parse tool@version syntax
183
+ */
184
+ function parseToolSpec(spec) {
185
+ const atIndex = spec.lastIndexOf("@");
186
+ if (atIndex === -1 || atIndex === 0) {
187
+ return { name: spec, version: undefined };
188
+ }
189
+ return {
190
+ name: spec.slice(0, atIndex),
191
+ version: spec.slice(atIndex + 1),
192
+ };
193
+ }
194
+ /**
195
+ * Check trust status of a tool
196
+ */
197
+ async function trustCheckHandler(tool, options, _ctx) {
198
+ const { name, version } = parseToolSpec(tool);
199
+ if (!version) {
200
+ error("Please specify a version: tool-name@version");
201
+ process.exit(1);
202
+ }
203
+ const trustedIdentities = getTrustedIdentities();
204
+ const client = createApiClient();
205
+ const trustedBy = [];
206
+ let verifiedAuditors = [];
207
+ let allAttestors = [];
208
+ let bundleHash = "";
209
+ try {
210
+ // Fetch tool version info to get bundle hash
211
+ const toolVersion = await getToolVersion(client, name, version);
212
+ bundleHash = toolVersion.bundle?.hash ?? "";
213
+ if (!bundleHash) {
214
+ warning("Cannot verify attestations: tool bundle hash not found");
215
+ }
216
+ else {
217
+ // Fetch attestations from registry
218
+ const attestationsResponse = await getAttestationList(client, name, version);
219
+ const attestations = attestationsResponse.attestations;
220
+ // Collect all attestors
221
+ allAttestors = attestations.map((att) => att.auditor);
222
+ if (attestations.length > 0) {
223
+ // Verify all attestations locally (never trust registry's verification status)
224
+ const verifiedResults = await verifyAllAttestations(client, name, version, bundleHash);
225
+ // Update verifiedAuditors with the new format
226
+ verifiedAuditors = verifiedResults.map((a) => a.providerIdentity);
227
+ // Check which verified auditors are trusted
228
+ for (const result of verifiedResults) {
229
+ if (trustedIdentities.includes(result.providerIdentity)) {
230
+ trustedBy.push(result.providerIdentity);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ catch (err) {
237
+ if (options.json) {
238
+ json({
239
+ tool: name,
240
+ version,
241
+ trusted: false,
242
+ error: formatError(err),
243
+ });
244
+ return;
245
+ }
246
+ warning(`Failed to check attestations: ${formatError(err)}`);
247
+ }
248
+ const trusted = trustedBy.length > 0;
249
+ const hasAnyAttestation = allAttestors.length > 0;
250
+ const verifiedCount = verifiedAuditors.length;
251
+ if (options.json) {
252
+ json({
253
+ tool: name,
254
+ version,
255
+ trusted,
256
+ trustedBy,
257
+ verifiedAuditors,
258
+ totalAttestations: allAttestors.length,
259
+ verifiedAttestations: verifiedCount,
260
+ checkedIdentities: trustedIdentities.length,
261
+ });
262
+ return;
263
+ }
264
+ header(`Trust Status: ${name}@${version}`);
265
+ newline();
266
+ if (trusted) {
267
+ success("✓ Trusted");
268
+ keyValue("Verified by trusted identity(ies)", trustedBy.join(", "));
269
+ }
270
+ else if (hasAnyAttestation) {
271
+ warning("⚠ Not trusted by any configured identities");
272
+ if (verifiedCount > 0) {
273
+ keyValue("Verified attestations", verifiedAuditors.join(", "));
274
+ }
275
+ }
276
+ else {
277
+ warning("⚠ No attestations found");
278
+ }
279
+ newline();
280
+ dim(`Total attestations: ${allAttestors.length}`);
281
+ dim(`Cryptographically verified: ${verifiedCount}`);
282
+ dim(`Trusted identities configured: ${trustedIdentities.length}`);
283
+ if (!trusted && verifiedCount > 0) {
284
+ newline();
285
+ info("To trust this tool, add one of the verified identities:");
286
+ for (const identity of verifiedAuditors.slice(0, 3)) {
287
+ dim(` enact trust ${identity}`);
288
+ }
289
+ }
290
+ }
291
+ /**
292
+ * Configure the trust command
293
+ */
294
+ export function configureTrustCommand(program) {
295
+ const trust = program
296
+ .command("trust")
297
+ .description("Manage trusted publishers and auditors")
298
+ .argument("[identity]", "Identity to trust (format: provider:identity, e.g., github:alice)")
299
+ .option("-r, --remove", "Remove from trusted list instead of adding")
300
+ .option("-s, --sync", "Sync with registry (requires authentication)")
301
+ .option("--json", "Output as JSON")
302
+ .action(async (identity, options) => {
303
+ const ctx = {
304
+ cwd: process.cwd(),
305
+ options,
306
+ isCI: Boolean(process.env.CI),
307
+ isInteractive: process.stdout.isTTY ?? false,
308
+ };
309
+ try {
310
+ if (!identity) {
311
+ // No identity provided, show list
312
+ await trustListHandler(options, ctx);
313
+ }
314
+ else {
315
+ await trustHandler(identity, options, ctx);
316
+ }
317
+ }
318
+ catch (err) {
319
+ error(formatError(err));
320
+ process.exit(1);
321
+ }
322
+ });
323
+ // trust list
324
+ trust
325
+ .command("list")
326
+ .description("List all trusted identities")
327
+ .option("-s, --sync", "Also show registry trust config (requires authentication)")
328
+ .option("--json", "Output as JSON")
329
+ .action(async (options) => {
330
+ const ctx = {
331
+ cwd: process.cwd(),
332
+ options,
333
+ isCI: Boolean(process.env.CI),
334
+ isInteractive: process.stdout.isTTY ?? false,
335
+ };
336
+ try {
337
+ await trustListHandler(options, ctx);
338
+ }
339
+ catch (err) {
340
+ error(formatError(err));
341
+ process.exit(1);
342
+ }
343
+ });
344
+ // trust check
345
+ trust
346
+ .command("check")
347
+ .description("Check trust status of a tool")
348
+ .argument("<tool>", "Tool to check (name@version)")
349
+ .option("--json", "Output as JSON")
350
+ .action(async (tool, options) => {
351
+ const ctx = {
352
+ cwd: process.cwd(),
353
+ options,
354
+ isCI: Boolean(process.env.CI),
355
+ isInteractive: process.stdout.isTTY ?? false,
356
+ };
357
+ try {
358
+ await trustCheckHandler(tool, options, ctx);
359
+ }
360
+ catch (err) {
361
+ error(formatError(err));
362
+ process.exit(1);
363
+ }
364
+ });
365
+ }
366
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/trust/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAEL,iBAAiB,IAAI,2BAA2B,EAChD,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,IAAI,gCAAgC,EACxD,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,GAAG,EACH,KAAK,EACL,WAAW,EACX,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,uCAAuC;AACvC,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAaxC;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EACH,qGAAqG;SACxG,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,4CAA4C;IAEvE,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,4EAA4E;SACpF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,qBAAqB,QAAQ,wBAAwB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,QAAgB,EAChB,OAAqB,EACrB,IAAoB;IAEpB,2BAA2B;IAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,SAAS,QAAQ,wBAAwB,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,QAAQ,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpD,OAAO,CAAC,UAAU,QAAQ,cAAc,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,+BAA+B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAClD,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,QAAgB,EAChB,OAAqB,EACrB,IAAoB;IAEpB,2BAA2B;IAC3B,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,WAAW,QAAQ,0BAA0B,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,QAAQ,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,gCAAgC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACzD,OAAO,CAAC,WAAW,QAAQ,gBAAgB,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,+BAA+B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,4CAA4C,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,QAAgB,EAChB,OAAqB,EACrB,GAAmB;IAEnB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAyB,EAAE,IAAoB;IAC7E,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;IAErD,yDAAyD;IACzD,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;YACjC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,gBAAgB,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,wCAAwC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,UAAU,EAAE,QAAQ;YACpB,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;YAC7D,MAAM;YACN,oBAAoB,EAAE,mBAAmB;SAC1C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC;IACV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC1C,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,+BAA+B,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC;QACV,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;IACV,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IACzB,GAAG,CAAC,yBAAyB,mBAAmB,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,OAA0B,EAC1B,IAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,wDAAwD,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,MAAM,oBAAoB,GAA4B,MAAM,kBAAkB,CAC5E,MAAM,EACN,IAAI,EACJ,OAAO,CACR,CAAC;YACF,MAAM,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC;YAEvD,wBAAwB;YACxB,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAwB,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE3E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,+EAA+E;gBAC/E,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;gBAEvF,8CAA8C;gBAC9C,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBAElE,4CAA4C;gBAC5C,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;oBACrC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBACxD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,EAAE,IAAI;gBACV,OAAO;gBACP,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;aACxB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,OAAO,CAAC,iCAAiC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAE9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,EAAE,IAAI;YACV,OAAO;YACP,OAAO;YACP,SAAS;YACT,gBAAgB;YAChB,iBAAiB,EAAE,YAAY,CAAC,MAAM;YACtC,oBAAoB,EAAE,aAAa;YACnC,iBAAiB,EAAE,iBAAiB,CAAC,MAAM;SAC5C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,CAAC,iBAAiB,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,CAAC;IAEV,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,WAAW,CAAC,CAAC;QACrB,QAAQ,CAAC,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,OAAO,CAAC,4CAA4C,CAAC,CAAC;QACtD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,CAAC;IACV,GAAG,CAAC,uBAAuB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,kCAAkC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,OAAO,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAChE,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wCAAwC,CAAC;SACrD,QAAQ,CAAC,YAAY,EAAE,mEAAmE,CAAC;SAC3F,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACpE,MAAM,CAAC,YAAY,EAAE,8CAA8C,CAAC;SACpE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,QAA4B,EAAE,OAAqB,EAAE,EAAE;QACpE,MAAM,GAAG,GAAmB;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;SAC7C,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,kCAAkC;gBAClC,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,aAAa;IACb,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,YAAY,EAAE,2DAA2D,CAAC;SACjF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAmB;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;SAC7C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,cAAc;IACd,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,QAAQ,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA0B,EAAE,EAAE;QACzD,MAAM,GAAG,GAAmB;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;SAC7C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * enact unyank command
3
+ *
4
+ * Restore a previously yanked tool version.
5
+ */
6
+ import type { Command } from "commander";
7
+ /**
8
+ * Configure the unyank command
9
+ */
10
+ export declare function configureUnyankCommand(program: Command): void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/unyank/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB7D"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * enact unyank command
3
+ *
4
+ * Restore a previously yanked tool version.
5
+ */
6
+ import { createApiClient, unyankVersion } from "@enactprotocol/api";
7
+ import { getSecret } from "@enactprotocol/secrets";
8
+ import { dim, error, formatError, info, json, keyValue, newline, success } from "../../utils";
9
+ /** Auth namespace for token storage */
10
+ const AUTH_NAMESPACE = "enact:auth";
11
+ const ACCESS_TOKEN_KEY = "access_token";
12
+ /**
13
+ * Parse tool@version syntax
14
+ */
15
+ function parseToolSpec(spec) {
16
+ const atIndex = spec.lastIndexOf("@");
17
+ if (atIndex === -1 || atIndex === 0) {
18
+ throw new Error(`Invalid tool specification: ${spec}\nExpected format: tool-name@version (e.g., alice/utils/greeter@1.0.0)`);
19
+ }
20
+ return {
21
+ name: spec.slice(0, atIndex),
22
+ version: spec.slice(atIndex + 1),
23
+ };
24
+ }
25
+ /**
26
+ * Unyank command handler
27
+ */
28
+ async function unyankHandler(toolSpec, options, _ctx) {
29
+ // Parse tool@version
30
+ const { name, version } = parseToolSpec(toolSpec);
31
+ // Check for auth token
32
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
33
+ if (!authToken) {
34
+ error("Not authenticated. Please run: enact auth login");
35
+ process.exit(1);
36
+ }
37
+ const client = createApiClient();
38
+ client.setAuthToken(authToken);
39
+ info(`Restoring ${name}@${version}...`);
40
+ newline();
41
+ try {
42
+ const result = await unyankVersion(client, name, version);
43
+ if (options.json) {
44
+ json({
45
+ yanked: result.yanked,
46
+ name,
47
+ version: result.version,
48
+ unyankedAt: result.unyankedAt.toISOString(),
49
+ });
50
+ return;
51
+ }
52
+ success(`Restored ${name}@${version}`);
53
+ keyValue("Unyanked At", result.unyankedAt.toISOString());
54
+ newline();
55
+ dim("The version is now visible in version listings again.");
56
+ }
57
+ catch (err) {
58
+ error(`Failed to restore version: ${formatError(err)}`);
59
+ process.exit(1);
60
+ }
61
+ }
62
+ /**
63
+ * Configure the unyank command
64
+ */
65
+ export function configureUnyankCommand(program) {
66
+ program
67
+ .command("unyank <tool@version>")
68
+ .description("Restore a previously yanked tool version")
69
+ .option("-v, --verbose", "Show detailed output")
70
+ .option("--json", "Output as JSON")
71
+ .action(async (toolSpec, options) => {
72
+ const ctx = {
73
+ cwd: process.cwd(),
74
+ options,
75
+ isCI: Boolean(process.env.CI),
76
+ isInteractive: process.stdout.isTTY ?? false,
77
+ };
78
+ try {
79
+ await unyankHandler(toolSpec, options, ctx);
80
+ }
81
+ catch (err) {
82
+ error(formatError(err));
83
+ process.exit(1);
84
+ }
85
+ });
86
+ }
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/unyank/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * enact yank command
3
+ *
4
+ * Yank a published tool version from the registry.
5
+ * Yanked versions remain downloadable but are excluded from version listings
6
+ * and show warnings to users.
7
+ */
8
+ import type { Command } from "commander";
9
+ /**
10
+ * Configure the yank command
11
+ */
12
+ export declare function configureYankCommand(program: Command): void;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/yank/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0GzC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuB3D"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * enact yank command
3
+ *
4
+ * Yank a published tool version from the registry.
5
+ * Yanked versions remain downloadable but are excluded from version listings
6
+ * and show warnings to users.
7
+ */
8
+ import { createApiClient, yankVersion } from "@enactprotocol/api";
9
+ import { getSecret } from "@enactprotocol/secrets";
10
+ import { dim, error, formatError, info, json, keyValue, newline, success, warning, } from "../../utils";
11
+ /** Auth namespace for token storage */
12
+ const AUTH_NAMESPACE = "enact:auth";
13
+ const ACCESS_TOKEN_KEY = "access_token";
14
+ /**
15
+ * Parse tool@version syntax
16
+ */
17
+ function parseToolSpec(spec) {
18
+ const atIndex = spec.lastIndexOf("@");
19
+ if (atIndex === -1 || atIndex === 0) {
20
+ throw new Error(`Invalid tool specification: ${spec}\nExpected format: tool-name@version (e.g., alice/utils/greeter@1.0.0)`);
21
+ }
22
+ return {
23
+ name: spec.slice(0, atIndex),
24
+ version: spec.slice(atIndex + 1),
25
+ };
26
+ }
27
+ /**
28
+ * Yank command handler
29
+ */
30
+ async function yankHandler(toolSpec, options, _ctx) {
31
+ // Parse tool@version
32
+ const { name, version } = parseToolSpec(toolSpec);
33
+ // Check for auth token
34
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
35
+ if (!authToken) {
36
+ error("Not authenticated. Please run: enact auth login");
37
+ process.exit(1);
38
+ }
39
+ const client = createApiClient();
40
+ client.setAuthToken(authToken);
41
+ info(`Yanking ${name}@${version}...`);
42
+ if (options.reason) {
43
+ dim(`Reason: ${options.reason}`);
44
+ }
45
+ if (options.replacement) {
46
+ dim(`Replacement: ${options.replacement}`);
47
+ }
48
+ newline();
49
+ try {
50
+ const result = await yankVersion(client, name, version, {
51
+ reason: options.reason,
52
+ replacementVersion: options.replacement,
53
+ });
54
+ if (options.json) {
55
+ json({
56
+ yanked: result.yanked,
57
+ name,
58
+ version: result.version,
59
+ reason: result.reason,
60
+ replacementVersion: result.replacementVersion,
61
+ yankedAt: result.yankedAt.toISOString(),
62
+ });
63
+ return;
64
+ }
65
+ success(`Yanked ${name}@${version}`);
66
+ keyValue("Yanked At", result.yankedAt.toISOString());
67
+ if (result.reason) {
68
+ keyValue("Reason", result.reason);
69
+ }
70
+ if (result.replacementVersion) {
71
+ keyValue("Replacement", result.replacementVersion);
72
+ }
73
+ newline();
74
+ warning("Note: Yanked versions can still be downloaded but show warnings.");
75
+ dim("Use 'enact unyank' to restore the version.");
76
+ }
77
+ catch (err) {
78
+ error(`Failed to yank version: ${formatError(err)}`);
79
+ process.exit(1);
80
+ }
81
+ }
82
+ /**
83
+ * Configure the yank command
84
+ */
85
+ export function configureYankCommand(program) {
86
+ program
87
+ .command("yank <tool@version>")
88
+ .description("Yank a published tool version from the registry")
89
+ .option("-r, --reason <reason>", "Reason for yanking (e.g., security issue)")
90
+ .option("--replacement <version>", "Recommend a replacement version (e.g., 1.2.1)")
91
+ .option("-v, --verbose", "Show detailed output")
92
+ .option("--json", "Output as JSON")
93
+ .action(async (toolSpec, options) => {
94
+ const ctx = {
95
+ cwd: process.cwd(),
96
+ options,
97
+ isCI: Boolean(process.env.CI),
98
+ isInteractive: process.stdout.isTTY ?? false,
99
+ };
100
+ try {
101
+ await yankHandler(toolSpec, options, ctx);
102
+ }
103
+ catch (err) {
104
+ error(formatError(err));
105
+ process.exit(1);
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/yank/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * @enactprotocol/cli
4
+ *
5
+ * Command-line interface for Enact.
6
+ * User-facing commands for tool execution, discovery, and management.
7
+ */
8
+ export declare const version = "0.1.0";
9
+ export type { GlobalOptions, CommandContext } from "./types";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AA0BH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}