@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.
- package/dist/commands/auth/index.d.ts +12 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +743 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/cache/index.d.ts +11 -0
- package/dist/commands/cache/index.d.ts.map +1 -0
- package/dist/commands/cache/index.js +304 -0
- package/dist/commands/cache/index.js.map +1 -0
- package/dist/commands/config/index.d.ts +11 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +138 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/env/index.d.ts +11 -0
- package/dist/commands/env/index.d.ts.map +1 -0
- package/dist/commands/env/index.js +303 -0
- package/dist/commands/env/index.js.map +1 -0
- package/dist/commands/exec/index.d.ts +12 -0
- package/dist/commands/exec/index.d.ts.map +1 -0
- package/dist/commands/exec/index.js +154 -0
- package/dist/commands/exec/index.js.map +1 -0
- package/dist/commands/get/index.d.ts +11 -0
- package/dist/commands/get/index.d.ts.map +1 -0
- package/dist/commands/get/index.js +151 -0
- package/dist/commands/get/index.js.map +1 -0
- package/dist/commands/index.d.ts +24 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +27 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/inspect/index.d.ts +13 -0
- package/dist/commands/inspect/index.d.ts.map +1 -0
- package/dist/commands/inspect/index.js +199 -0
- package/dist/commands/inspect/index.js.map +1 -0
- package/dist/commands/install/index.d.ts +16 -0
- package/dist/commands/install/index.d.ts.map +1 -0
- package/dist/commands/install/index.js +520 -0
- package/dist/commands/install/index.js.map +1 -0
- package/dist/commands/list/index.d.ts +15 -0
- package/dist/commands/list/index.d.ts.map +1 -0
- package/dist/commands/list/index.js +103 -0
- package/dist/commands/list/index.js.map +1 -0
- package/dist/commands/publish/index.d.ts +11 -0
- package/dist/commands/publish/index.d.ts.map +1 -0
- package/dist/commands/publish/index.js +274 -0
- package/dist/commands/publish/index.js.map +1 -0
- package/dist/commands/report/index.d.ts +12 -0
- package/dist/commands/report/index.d.ts.map +1 -0
- package/dist/commands/report/index.js +279 -0
- package/dist/commands/report/index.js.map +1 -0
- package/dist/commands/run/index.d.ts +16 -0
- package/dist/commands/run/index.d.ts.map +1 -0
- package/dist/commands/run/index.js +525 -0
- package/dist/commands/run/index.js.map +1 -0
- package/dist/commands/search/index.d.ts +12 -0
- package/dist/commands/search/index.d.ts.map +1 -0
- package/dist/commands/search/index.js +275 -0
- package/dist/commands/search/index.js.map +1 -0
- package/dist/commands/setup/index.d.ts +11 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +241 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/sign/index.d.ts +17 -0
- package/dist/commands/sign/index.d.ts.map +1 -0
- package/dist/commands/sign/index.js +507 -0
- package/dist/commands/sign/index.js.map +1 -0
- package/dist/commands/trust/index.d.ts +13 -0
- package/dist/commands/trust/index.d.ts.map +1 -0
- package/dist/commands/trust/index.js +366 -0
- package/dist/commands/trust/index.js.map +1 -0
- package/dist/commands/unyank/index.d.ts +11 -0
- package/dist/commands/unyank/index.d.ts.map +1 -0
- package/dist/commands/unyank/index.js +87 -0
- package/dist/commands/unyank/index.js.map +1 -0
- package/dist/commands/yank/index.d.ts +13 -0
- package/dist/commands/yank/index.d.ts.map +1 -0
- package/dist/commands/yank/index.js +109 -0
- package/dist/commands/yank/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +159 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +321 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +83 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +126 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/ignore.d.ts +25 -0
- package/dist/utils/ignore.d.ts.map +1 -0
- package/dist/utils/ignore.js +123 -0
- package/dist/utils/ignore.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/output.d.ts +103 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +201 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/spinner.d.ts +83 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +162 -0
- package/dist/utils/spinner.js.map +1 -0
- package/package.json +5 -5
- package/src/index.ts +4 -0
- package/tsconfig.tsbuildinfo +0 -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"}
|