@enactprotocol/cli 2.0.0 → 2.0.2

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 (119) 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 +25 -0
  26. package/dist/commands/index.d.ts.map +1 -0
  27. package/dist/commands/index.js +28 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/init/index.d.ts +11 -0
  30. package/dist/commands/init/index.d.ts.map +1 -0
  31. package/dist/commands/init/index.js +192 -0
  32. package/dist/commands/init/index.js.map +1 -0
  33. package/dist/commands/inspect/index.d.ts +13 -0
  34. package/dist/commands/inspect/index.d.ts.map +1 -0
  35. package/dist/commands/inspect/index.js +199 -0
  36. package/dist/commands/inspect/index.js.map +1 -0
  37. package/dist/commands/install/index.d.ts +16 -0
  38. package/dist/commands/install/index.d.ts.map +1 -0
  39. package/dist/commands/install/index.js +520 -0
  40. package/dist/commands/install/index.js.map +1 -0
  41. package/dist/commands/list/index.d.ts +15 -0
  42. package/dist/commands/list/index.d.ts.map +1 -0
  43. package/dist/commands/list/index.js +103 -0
  44. package/dist/commands/list/index.js.map +1 -0
  45. package/dist/commands/publish/index.d.ts +11 -0
  46. package/dist/commands/publish/index.d.ts.map +1 -0
  47. package/dist/commands/publish/index.js +274 -0
  48. package/dist/commands/publish/index.js.map +1 -0
  49. package/dist/commands/report/index.d.ts +12 -0
  50. package/dist/commands/report/index.d.ts.map +1 -0
  51. package/dist/commands/report/index.js +279 -0
  52. package/dist/commands/report/index.js.map +1 -0
  53. package/dist/commands/run/index.d.ts +16 -0
  54. package/dist/commands/run/index.d.ts.map +1 -0
  55. package/dist/commands/run/index.js +525 -0
  56. package/dist/commands/run/index.js.map +1 -0
  57. package/dist/commands/search/index.d.ts +12 -0
  58. package/dist/commands/search/index.d.ts.map +1 -0
  59. package/dist/commands/search/index.js +275 -0
  60. package/dist/commands/search/index.js.map +1 -0
  61. package/dist/commands/setup/index.d.ts +11 -0
  62. package/dist/commands/setup/index.d.ts.map +1 -0
  63. package/dist/commands/setup/index.js +241 -0
  64. package/dist/commands/setup/index.js.map +1 -0
  65. package/dist/commands/sign/index.d.ts +17 -0
  66. package/dist/commands/sign/index.d.ts.map +1 -0
  67. package/dist/commands/sign/index.js +507 -0
  68. package/dist/commands/sign/index.js.map +1 -0
  69. package/dist/commands/trust/index.d.ts +13 -0
  70. package/dist/commands/trust/index.d.ts.map +1 -0
  71. package/dist/commands/trust/index.js +366 -0
  72. package/dist/commands/trust/index.js.map +1 -0
  73. package/dist/commands/unyank/index.d.ts +11 -0
  74. package/dist/commands/unyank/index.d.ts.map +1 -0
  75. package/dist/commands/unyank/index.js +87 -0
  76. package/dist/commands/unyank/index.js.map +1 -0
  77. package/dist/commands/yank/index.d.ts +13 -0
  78. package/dist/commands/yank/index.d.ts.map +1 -0
  79. package/dist/commands/yank/index.js +109 -0
  80. package/dist/commands/yank/index.js.map +1 -0
  81. package/dist/index.d.ts +10 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +68 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/types.d.ts +69 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +15 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/utils/errors.d.ts +159 -0
  90. package/dist/utils/errors.d.ts.map +1 -0
  91. package/dist/utils/errors.js +321 -0
  92. package/dist/utils/errors.js.map +1 -0
  93. package/dist/utils/exit-codes.d.ts +83 -0
  94. package/dist/utils/exit-codes.d.ts.map +1 -0
  95. package/dist/utils/exit-codes.js +126 -0
  96. package/dist/utils/exit-codes.js.map +1 -0
  97. package/dist/utils/ignore.d.ts +25 -0
  98. package/dist/utils/ignore.d.ts.map +1 -0
  99. package/dist/utils/ignore.js +123 -0
  100. package/dist/utils/ignore.js.map +1 -0
  101. package/dist/utils/index.d.ts +8 -0
  102. package/dist/utils/index.d.ts.map +1 -0
  103. package/dist/utils/index.js +12 -0
  104. package/dist/utils/index.js.map +1 -0
  105. package/dist/utils/output.d.ts +103 -0
  106. package/dist/utils/output.d.ts.map +1 -0
  107. package/dist/utils/output.js +201 -0
  108. package/dist/utils/output.js.map +1 -0
  109. package/dist/utils/spinner.d.ts +83 -0
  110. package/dist/utils/spinner.d.ts.map +1 -0
  111. package/dist/utils/spinner.js +162 -0
  112. package/dist/utils/spinner.js.map +1 -0
  113. package/package.json +5 -5
  114. package/src/commands/index.ts +1 -0
  115. package/src/commands/init/index.ts +231 -0
  116. package/src/index.ts +7 -1
  117. package/tests/index.test.ts +1 -1
  118. package/tsconfig.json +1 -0
  119. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * enact publish command
3
+ *
4
+ * Publish a tool to the Enact registry using v2 multipart upload.
5
+ */
6
+ import type { Command } from "commander";
7
+ /**
8
+ * Configure the publish command
9
+ */
10
+ export declare function configurePublishCommand(program: Command): void;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/publish/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+SzC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB9D"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * enact publish command
3
+ *
4
+ * Publish a tool to the Enact registry using v2 multipart upload.
5
+ */
6
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
7
+ import { dirname, join, relative, resolve } from "node:path";
8
+ import { createApiClient, publishTool } from "@enactprotocol/api";
9
+ import { getSecret } from "@enactprotocol/secrets";
10
+ import { loadConfig, loadManifest, loadManifestFromDir, validateManifest, } from "@enactprotocol/shared";
11
+ import { dim, error, formatError, header, info, json, keyValue, newline, success, warning, withSpinner, } from "../../utils";
12
+ import { loadGitignore, shouldIgnore } from "../../utils/ignore";
13
+ /** Auth namespace for token storage */
14
+ const AUTH_NAMESPACE = "enact:auth";
15
+ const ACCESS_TOKEN_KEY = "access_token";
16
+ /**
17
+ * Recursively collect all files in a directory
18
+ */
19
+ function collectFiles(dir, baseDir, files = [], ignorePatterns = []) {
20
+ const entries = readdirSync(dir, { withFileTypes: true });
21
+ for (const entry of entries) {
22
+ const fullPath = join(dir, entry.name);
23
+ const relativePath = relative(baseDir, fullPath);
24
+ // Check if file should be ignored
25
+ if (shouldIgnore(relativePath, entry.name, ignorePatterns)) {
26
+ continue;
27
+ }
28
+ if (entry.isDirectory()) {
29
+ collectFiles(fullPath, baseDir, files, ignorePatterns);
30
+ }
31
+ else if (entry.isFile()) {
32
+ files.push({ path: fullPath, relativePath });
33
+ }
34
+ }
35
+ return files;
36
+ }
37
+ /**
38
+ * Create a tar.gz bundle from the tool directory
39
+ */
40
+ async function createBundleFromDir(toolDir) {
41
+ // Load gitignore patterns (ALWAYS_IGNORE is already checked in shouldIgnore)
42
+ const gitignorePatterns = loadGitignore(toolDir);
43
+ // Collect all files to include (respecting ignore patterns)
44
+ const files = collectFiles(toolDir, toolDir, [], gitignorePatterns);
45
+ // Use tar to create the bundle (available on all supported platforms)
46
+ const tempDir = join(process.env.TMPDIR ?? "/tmp", `enact-bundle-${Date.now()}`);
47
+ const tempBundle = join(tempDir, "bundle.tar.gz");
48
+ const { mkdirSync, rmSync } = await import("node:fs");
49
+ mkdirSync(tempDir, { recursive: true });
50
+ try {
51
+ // Create tar.gz using tar command
52
+ const fileList = files.map((f) => f.relativePath).join("\n");
53
+ const fileListPath = join(tempDir, "files.txt");
54
+ const { writeFileSync } = await import("node:fs");
55
+ writeFileSync(fileListPath, fileList);
56
+ // Use COPYFILE_DISABLE=1 to prevent macOS from adding AppleDouble (._) files
57
+ const proc = Bun.spawn(["tar", "-czf", tempBundle, "-C", toolDir, "-T", fileListPath], {
58
+ stdout: "pipe",
59
+ stderr: "pipe",
60
+ env: {
61
+ ...process.env,
62
+ COPYFILE_DISABLE: "1", // Prevents macOS extended attributes/resource forks
63
+ },
64
+ });
65
+ const exitCode = await proc.exited;
66
+ if (exitCode !== 0) {
67
+ const stderr = await new Response(proc.stderr).text();
68
+ throw new Error(`Failed to create bundle: ${stderr}`);
69
+ }
70
+ // Read the bundle
71
+ const bundleData = readFileSync(tempBundle);
72
+ return new Uint8Array(bundleData);
73
+ }
74
+ finally {
75
+ // Clean up temp files
76
+ try {
77
+ rmSync(tempDir, { recursive: true, force: true });
78
+ }
79
+ catch {
80
+ // Ignore cleanup errors
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Load README from tool directory
86
+ */
87
+ function loadReadme(toolDir) {
88
+ const readmeNames = ["README.md", "readme.md", "README", "readme"];
89
+ for (const name of readmeNames) {
90
+ const readmePath = join(toolDir, name);
91
+ if (existsSync(readmePath)) {
92
+ return readFileSync(readmePath, "utf-8");
93
+ }
94
+ }
95
+ return undefined;
96
+ }
97
+ /**
98
+ * Load and validate manifest from file or directory
99
+ */
100
+ async function loadAndValidateManifest(pathArg, ctx) {
101
+ const fullPath = resolve(ctx.cwd, pathArg);
102
+ if (!existsSync(fullPath)) {
103
+ throw new Error(`Path not found: ${fullPath}`);
104
+ }
105
+ // Load manifest - handle both files and directories
106
+ let loaded;
107
+ const stats = statSync(fullPath);
108
+ if (stats.isDirectory()) {
109
+ loaded = loadManifestFromDir(fullPath);
110
+ }
111
+ else {
112
+ loaded = loadManifest(fullPath);
113
+ }
114
+ if (!loaded) {
115
+ throw new Error(`Could not load manifest from: ${fullPath}`);
116
+ }
117
+ // Validate manifest
118
+ const validation = validateManifest(loaded.manifest);
119
+ if (!validation.valid) {
120
+ const errors = validation.errors?.map((e) => ` - ${e}`).join("\n");
121
+ throw new Error(`Invalid manifest:\n${errors}`);
122
+ }
123
+ return {
124
+ manifest: loaded.manifest,
125
+ toolDir: dirname(loaded.filePath),
126
+ };
127
+ }
128
+ /**
129
+ * Publish command handler
130
+ */
131
+ async function publishHandler(pathArg, options, ctx) {
132
+ // Load and validate manifest
133
+ const { manifest, toolDir } = await loadAndValidateManifest(pathArg, ctx);
134
+ const toolName = manifest.name;
135
+ const version = manifest.version ?? "0.0.0";
136
+ header(`Publishing ${toolName}@${version}`);
137
+ newline();
138
+ // Show what we're publishing
139
+ keyValue("Name", toolName);
140
+ keyValue("Version", version);
141
+ keyValue("Description", manifest.description);
142
+ if (manifest.tags && manifest.tags.length > 0) {
143
+ keyValue("Tags", manifest.tags.join(", "));
144
+ }
145
+ newline();
146
+ // Get registry URL from config or environment
147
+ const config = loadConfig();
148
+ const registryUrl = process.env.ENACT_REGISTRY_URL ??
149
+ config.registry?.url ??
150
+ "https://siikwkfgsmouioodghho.supabase.co/functions/v1";
151
+ if (options.verbose) {
152
+ keyValue("Registry", registryUrl);
153
+ }
154
+ // Check for auth token from keyring (skip in local dev mode)
155
+ let authToken;
156
+ if (options.skipAuth) {
157
+ warning("Skipping authentication (local development mode)");
158
+ // For local dev, use the Supabase anon key from environment or default local key
159
+ authToken =
160
+ process.env.SUPABASE_ANON_KEY ??
161
+ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0";
162
+ }
163
+ else {
164
+ const secretToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
165
+ authToken = secretToken ?? undefined;
166
+ if (!authToken) {
167
+ // Check config registry authToken
168
+ authToken = config.registry?.authToken;
169
+ }
170
+ if (!authToken) {
171
+ // Also check environment variable for CI/local dev
172
+ authToken = process.env.ENACT_AUTH_TOKEN;
173
+ }
174
+ if (!authToken) {
175
+ // Fallback to official registry anon key if using official registry
176
+ if (registryUrl.includes("siikwkfgsmouioodghho.supabase.co")) {
177
+ authToken =
178
+ "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InNpaWt3a2Znc21vdWlvb2RnaGhvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjQ2MTkzMzksImV4cCI6MjA4MDE5NTMzOX0.kxnx6-IPFhmGx6rzNx36vbyhFMFZKP_jFqaDbKnJ_E0";
179
+ }
180
+ }
181
+ if (!authToken) {
182
+ error("Not authenticated. Please run: enact auth login");
183
+ dim("Or set ENACT_AUTH_TOKEN environment variable");
184
+ dim("Or use --skip-auth for local development");
185
+ process.exit(1);
186
+ }
187
+ }
188
+ const client = createApiClient({ baseUrl: registryUrl });
189
+ if (authToken) {
190
+ client.setAuthToken(authToken);
191
+ }
192
+ // Dry run mode
193
+ if (options.dryRun) {
194
+ warning("Dry run mode - not actually publishing");
195
+ newline();
196
+ info("Would publish to registry:");
197
+ keyValue("Tool", toolName);
198
+ keyValue("Version", version);
199
+ keyValue("Source", toolDir);
200
+ // Show files that would be bundled
201
+ const files = collectFiles(toolDir, toolDir);
202
+ info(`Would bundle ${files.length} files`);
203
+ if (options.verbose) {
204
+ for (const file of files.slice(0, 10)) {
205
+ dim(` ${file.relativePath}`);
206
+ }
207
+ if (files.length > 10) {
208
+ dim(` ... and ${files.length - 10} more`);
209
+ }
210
+ }
211
+ return;
212
+ }
213
+ // Load README if available
214
+ const readme = loadReadme(toolDir);
215
+ if (readme) {
216
+ info("Found README.md");
217
+ }
218
+ // Create bundle
219
+ const bundle = await withSpinner("Creating bundle...", async () => {
220
+ return await createBundleFromDir(toolDir);
221
+ });
222
+ info(`Bundle size: ${(bundle.length / 1024).toFixed(1)} KB`);
223
+ // Publish to registry using v2 multipart API
224
+ const result = await withSpinner("Publishing to registry...", async () => {
225
+ return await publishTool(client, {
226
+ name: toolName,
227
+ manifest: manifest,
228
+ bundle,
229
+ readme,
230
+ });
231
+ });
232
+ // JSON output
233
+ if (options.json) {
234
+ json(result);
235
+ return;
236
+ }
237
+ // Success output
238
+ newline();
239
+ success(`Published ${result.name}@${result.version}`);
240
+ keyValue("Bundle Hash", result.bundleHash);
241
+ keyValue("Published At", result.publishedAt.toISOString());
242
+ newline();
243
+ dim(`Install with: enact install ${toolName}`);
244
+ }
245
+ /**
246
+ * Configure the publish command
247
+ */
248
+ export function configurePublishCommand(program) {
249
+ program
250
+ .command("publish [path]")
251
+ .description("Publish a tool to the Enact registry")
252
+ .option("-n, --dry-run", "Show what would be published without publishing")
253
+ .option("-t, --tag <tag>", "Add a release tag (e.g., latest, beta)")
254
+ .option("-v, --verbose", "Show detailed output")
255
+ .option("--skip-auth", "Skip authentication (for local development)")
256
+ .option("--json", "Output as JSON")
257
+ .action(async (pathArg, options) => {
258
+ const resolvedPath = pathArg ?? ".";
259
+ const ctx = {
260
+ cwd: process.cwd(),
261
+ options,
262
+ isCI: Boolean(process.env.CI),
263
+ isInteractive: process.stdout.isTTY ?? false,
264
+ };
265
+ try {
266
+ await publishHandler(resolvedPath, options, ctx);
267
+ }
268
+ catch (err) {
269
+ error(formatError(err));
270
+ process.exit(1);
271
+ }
272
+ });
273
+ }
274
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/publish/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * enact report command
3
+ *
4
+ * Report security vulnerabilities or issues with a tool.
5
+ * Creates a signed attestation with result "failed" and submits to the registry.
6
+ */
7
+ import type { Command } from "commander";
8
+ /**
9
+ * Configure the report command
10
+ */
11
+ export declare function configureReportCommand(program: Command): void;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/report/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuTzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC7D"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * enact report command
3
+ *
4
+ * Report security vulnerabilities or issues with a tool.
5
+ * Creates a signed attestation with result "failed" and submits to the registry.
6
+ */
7
+ import { createApiClient, getToolVersion, submitAttestation } from "@enactprotocol/api";
8
+ import { getSecret } from "@enactprotocol/secrets";
9
+ import { loadConfig } from "@enactprotocol/shared";
10
+ import { createEnactAuditStatement, signAttestation, } from "@enactprotocol/trust";
11
+ import { colors, dim, error, formatError, info, json, keyValue, newline, success, warning, withSpinner, } from "../../utils";
12
+ /** Auth namespace for token storage */
13
+ const AUTH_NAMESPACE = "enact:auth";
14
+ const ACCESS_TOKEN_KEY = "access_token";
15
+ /** Valid severity levels */
16
+ const SEVERITY_LEVELS = ["critical", "high", "medium", "low"];
17
+ /** Valid categories */
18
+ const CATEGORIES = ["security", "malware", "quality", "license", "other"];
19
+ /**
20
+ * Parse tool@version format
21
+ */
22
+ function parseToolVersion(toolArg) {
23
+ const atIndex = toolArg.lastIndexOf("@");
24
+ // Check if @ is part of the tool name (like @scope/package) or version separator
25
+ if (atIndex <= 0 || toolArg.startsWith("@")) {
26
+ // Could be @scope/package or @scope/package@version
27
+ const scopedMatch = toolArg.match(/^(@[^/]+\/[^@]+)(?:@(.+))?$/);
28
+ if (scopedMatch) {
29
+ return {
30
+ name: scopedMatch[1] ?? toolArg,
31
+ version: scopedMatch[2],
32
+ };
33
+ }
34
+ return { name: toolArg, version: undefined };
35
+ }
36
+ return {
37
+ name: toolArg.slice(0, atIndex),
38
+ version: toolArg.slice(atIndex + 1),
39
+ };
40
+ }
41
+ /**
42
+ * Display report preview (dry run)
43
+ */
44
+ function displayDryRun(tool, version, options) {
45
+ newline();
46
+ info(colors.bold("Dry Run Preview - Report Submission"));
47
+ newline();
48
+ keyValue("Tool", tool);
49
+ if (version) {
50
+ keyValue("Version", version);
51
+ }
52
+ keyValue("Reason", options.reason);
53
+ keyValue("Severity", options.severity ?? "medium");
54
+ keyValue("Category", options.category ?? "other");
55
+ keyValue("Submit to registry", options.local ? "No (local only)" : "Yes");
56
+ newline();
57
+ info("Actions that would be performed:");
58
+ dim(" 1. Authenticate via OIDC (browser-based OAuth flow)");
59
+ dim(" 2. Create audit attestation with result 'failed'");
60
+ dim(" 3. Request signing certificate from Fulcio");
61
+ dim(" 4. Sign attestation with ephemeral keypair");
62
+ dim(" 5. Log signature to Rekor transparency log");
63
+ if (!options.local) {
64
+ dim(" 6. Submit signed report to Enact registry");
65
+ }
66
+ newline();
67
+ warning("Note: False reports may result in account suspension.");
68
+ dim("Your identity will be cryptographically bound to this report.");
69
+ }
70
+ /**
71
+ * Display report result
72
+ */
73
+ function displayResult(tool, version, options, registryResult) {
74
+ if (options.json) {
75
+ json({
76
+ success: true,
77
+ tool,
78
+ version: version ?? "latest",
79
+ reason: options.reason,
80
+ severity: options.severity ?? "medium",
81
+ category: options.category ?? "other",
82
+ registry: registryResult
83
+ ? {
84
+ submitted: true,
85
+ auditor: registryResult.auditor,
86
+ rekorLogIndex: registryResult.rekorLogIndex,
87
+ }
88
+ : { submitted: false },
89
+ });
90
+ return;
91
+ }
92
+ newline();
93
+ success(`Report submitted for ${tool}${version ? `@${version}` : ""}`);
94
+ newline();
95
+ keyValue("Severity", options.severity ?? "medium");
96
+ keyValue("Category", options.category ?? "other");
97
+ if (registryResult) {
98
+ keyValue("Auditor identity", registryResult.auditor);
99
+ if (registryResult.rekorLogIndex !== undefined) {
100
+ keyValue("Rekor log index", String(registryResult.rekorLogIndex));
101
+ }
102
+ }
103
+ newline();
104
+ info("What happens next:");
105
+ dim(" • Your signed report is recorded on the Rekor transparency log");
106
+ dim(" • Registry moderators will review your report");
107
+ dim(" • The tool publisher will be notified");
108
+ dim(" • You may be contacted for additional information");
109
+ newline();
110
+ warning("Note: Your identity is cryptographically bound to this report.");
111
+ warning("False reports may result in account suspension.");
112
+ }
113
+ /**
114
+ * Report command handler
115
+ */
116
+ async function reportHandler(toolArg, options, _ctx) {
117
+ // Parse tool@version
118
+ const { name: toolName, version: parsedVersion } = parseToolVersion(toolArg);
119
+ // Validate required options
120
+ if (!options.reason || options.reason.trim().length === 0) {
121
+ error("--reason is required. Please provide a description of the issue.");
122
+ process.exit(1);
123
+ }
124
+ // Validate severity if provided
125
+ if (options.severity && !SEVERITY_LEVELS.includes(options.severity)) {
126
+ error(`Invalid severity. Must be one of: ${SEVERITY_LEVELS.join(", ")}`);
127
+ process.exit(1);
128
+ }
129
+ // Validate category if provided
130
+ if (options.category && !CATEGORIES.includes(options.category)) {
131
+ error(`Invalid category. Must be one of: ${CATEGORIES.join(", ")}`);
132
+ process.exit(1);
133
+ }
134
+ // Dry run mode
135
+ if (options.dryRun) {
136
+ displayDryRun(toolName, parsedVersion, options);
137
+ return;
138
+ }
139
+ // Create API client to fetch tool info
140
+ const config = loadConfig();
141
+ const registryUrl = config.registry?.url ?? "https://registry.enact.tools";
142
+ const client = createApiClient({ baseUrl: registryUrl });
143
+ // Get version to report - either specified or latest
144
+ let version = parsedVersion;
145
+ if (!version) {
146
+ try {
147
+ const toolInfo = await withSpinner(`Fetching ${toolName} info...`, async () => getToolVersion(client, toolName, "latest"), `Found ${toolName}`);
148
+ version = toolInfo.version;
149
+ }
150
+ catch (err) {
151
+ error(`Failed to find tool ${toolName}: ${formatError(err)}`);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ // Create the audit notes with severity and category
156
+ const notes = `[${(options.category ?? "other").toUpperCase()}] [${(options.severity ?? "medium").toUpperCase()}] ${options.reason}`;
157
+ // Create audit statement with result "failed"
158
+ const auditOptions = {
159
+ toolName,
160
+ toolVersion: version,
161
+ auditor: "unknown", // Will be filled by OIDC
162
+ result: "failed",
163
+ timestamp: new Date(),
164
+ notes,
165
+ };
166
+ // Create a simple manifest placeholder for the subject hash
167
+ // In a full implementation, we would fetch the actual manifest from registry
168
+ const manifestPlaceholder = JSON.stringify({
169
+ name: toolName,
170
+ version,
171
+ reported: true,
172
+ });
173
+ const statement = createEnactAuditStatement(manifestPlaceholder, auditOptions);
174
+ if (options.verbose) {
175
+ info("Created report attestation statement:");
176
+ dim(JSON.stringify(statement, null, 2));
177
+ newline();
178
+ }
179
+ // Sign the attestation using Sigstore
180
+ info("Starting OIDC signing flow...");
181
+ dim("A browser window will open for authentication.");
182
+ newline();
183
+ const result = await withSpinner("Signing report...", async () => {
184
+ try {
185
+ return await signAttestation(statement, {
186
+ timeout: 120000, // 2 minutes for OIDC flow
187
+ });
188
+ }
189
+ catch (err) {
190
+ if (err instanceof Error) {
191
+ if (err.message.includes("OIDC") || err.message.includes("token")) {
192
+ throw new Error(`OIDC authentication failed: ${err.message}\nMake sure you complete the browser authentication flow.`);
193
+ }
194
+ if (err.message.includes("Fulcio") || err.message.includes("certificate")) {
195
+ throw new Error(`Certificate issuance failed: ${err.message}\nThis may be a temporary issue with the Sigstore infrastructure.`);
196
+ }
197
+ if (err.message.includes("Rekor") || err.message.includes("transparency")) {
198
+ throw new Error(`Transparency log failed: ${err.message}\nThis may be a temporary issue with the Sigstore infrastructure.`);
199
+ }
200
+ }
201
+ throw err;
202
+ }
203
+ });
204
+ // Submit attestation to registry (unless --local)
205
+ let registryResult;
206
+ if (!options.local) {
207
+ // Check for auth token from keyring
208
+ const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
209
+ if (!authToken) {
210
+ warning("Not authenticated with registry - report not submitted");
211
+ dim("Run 'enact auth login' to authenticate, then report again");
212
+ dim("Your report is still recorded on the Rekor transparency log.");
213
+ }
214
+ else {
215
+ client.setAuthToken(authToken);
216
+ try {
217
+ const attestationResult = await withSpinner("Submitting report to registry...", async () => {
218
+ return await submitAttestation(client, {
219
+ name: toolName,
220
+ version: version,
221
+ sigstoreBundle: result.bundle,
222
+ });
223
+ });
224
+ registryResult = {
225
+ auditor: attestationResult.auditor,
226
+ rekorLogIndex: attestationResult.rekorLogIndex,
227
+ };
228
+ }
229
+ catch (err) {
230
+ warning("Failed to submit report to registry");
231
+ if (err instanceof Error) {
232
+ dim(` ${err.message}`);
233
+ }
234
+ dim("Your report is still recorded on the Rekor transparency log.");
235
+ }
236
+ }
237
+ }
238
+ else {
239
+ dim("Report signed locally only (--local flag)");
240
+ dim("The signature is recorded on the Rekor transparency log.");
241
+ }
242
+ // Display result
243
+ displayResult(toolName, version, options, registryResult);
244
+ }
245
+ /**
246
+ * Configure the report command
247
+ */
248
+ export function configureReportCommand(program) {
249
+ program
250
+ .command("report")
251
+ .description("Report security vulnerabilities or issues with a tool (creates signed attestation)")
252
+ .argument("<tool>", "Tool to report (name or name@version)")
253
+ .requiredOption("-r, --reason <description>", "Issue description (required)")
254
+ .option("-s, --severity <level>", "Severity level: critical, high, medium, low", "medium")
255
+ .option("-c, --category <type>", "Issue type: security, malware, quality, license, other", "other")
256
+ .option("--dry-run", "Show what would be submitted without submitting")
257
+ .option("--local", "Sign locally only, do not submit to registry")
258
+ .option("-v, --verbose", "Show detailed output")
259
+ .option("--json", "Output result as JSON")
260
+ .action(async (toolArg, options) => {
261
+ const ctx = {
262
+ cwd: process.cwd(),
263
+ options,
264
+ isCI: Boolean(process.env.CI),
265
+ isInteractive: process.stdout.isTTY ?? false,
266
+ };
267
+ try {
268
+ await reportHandler(toolArg, options, ctx);
269
+ }
270
+ catch (err) {
271
+ error(formatError(err));
272
+ if (options.verbose && err instanceof Error && err.stack) {
273
+ dim(err.stack);
274
+ }
275
+ process.exit(1);
276
+ }
277
+ });
278
+ }
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/report/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * enact run command
3
+ *
4
+ * Execute a tool in its container environment with the manifest-defined command.
5
+ *
6
+ * Resolution order:
7
+ * 1. Check local sources (project → user → cache)
8
+ * 2. If not found and --local not set, fetch from registry to cache
9
+ * 3. Run from resolved location (never copies to installed tools)
10
+ */
11
+ import type { Command } from "commander";
12
+ /**
13
+ * Configure the run command
14
+ */
15
+ export declare function configureRunCommand(program: Command): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/run/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAumBzC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4B1D"}