@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,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* enact sign command
|
|
3
|
+
*
|
|
4
|
+
* Cryptographically sign a tool using Sigstore keyless signing.
|
|
5
|
+
* Creates an in-toto attestation, logs to Rekor transparency log,
|
|
6
|
+
* and submits the attestation to the Enact registry.
|
|
7
|
+
*
|
|
8
|
+
* Supports both local paths and remote tool references:
|
|
9
|
+
* - Local: enact sign ./my-tool
|
|
10
|
+
* - Remote: enact sign author/tool@1.0.0
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { dirname, join, resolve } from "node:path";
|
|
14
|
+
import { createApiClient, getToolVersion, submitAttestation as submitAttestationToRegistry, } from "@enactprotocol/api";
|
|
15
|
+
import { getSecret } from "@enactprotocol/secrets";
|
|
16
|
+
import { addTrustedAuditor, emailToProviderIdentity, getTrustedAuditors, loadConfig, loadManifestFromDir, tryLoadManifest, validateManifest, } from "@enactprotocol/shared";
|
|
17
|
+
import { createEnactToolStatement, signAttestation, } from "@enactprotocol/trust";
|
|
18
|
+
import { colors, confirm, dim, error, formatError, info, json, keyValue, newline, success, symbols, warning, withSpinner, } from "../../utils";
|
|
19
|
+
/** Auth namespace for token storage */
|
|
20
|
+
const AUTH_NAMESPACE = "enact:auth";
|
|
21
|
+
const ACCESS_TOKEN_KEY = "access_token";
|
|
22
|
+
/** Default output filename for the signature bundle */
|
|
23
|
+
const DEFAULT_BUNDLE_FILENAME = ".sigstore-bundle.json";
|
|
24
|
+
/**
|
|
25
|
+
* Parse a remote tool reference like "author/tool@1.0.0"
|
|
26
|
+
* Returns null if not a valid remote reference
|
|
27
|
+
*/
|
|
28
|
+
function parseRemoteToolRef(ref) {
|
|
29
|
+
// Remote refs look like: author/tool@version or org/author/tool@version
|
|
30
|
+
// They don't start with . or / and contain @ for version
|
|
31
|
+
if (ref.startsWith(".") || ref.startsWith("/") || ref.startsWith("~")) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const atIndex = ref.lastIndexOf("@");
|
|
35
|
+
if (atIndex === -1 || atIndex === 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const name = ref.substring(0, atIndex);
|
|
39
|
+
const version = ref.substring(atIndex + 1);
|
|
40
|
+
// Must have at least one / in the name (author/tool)
|
|
41
|
+
if (!name.includes("/") || !version) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return { name, version };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Find the manifest file in a directory or at a path
|
|
48
|
+
*/
|
|
49
|
+
function findManifestPath(pathArg) {
|
|
50
|
+
const absolutePath = resolve(pathArg);
|
|
51
|
+
// Check if it's a directory or file
|
|
52
|
+
try {
|
|
53
|
+
// Try loading from directory first
|
|
54
|
+
const loaded = loadManifestFromDir(absolutePath);
|
|
55
|
+
return {
|
|
56
|
+
manifestPath: loaded.filePath,
|
|
57
|
+
manifestDir: absolutePath,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Try as a direct file path
|
|
62
|
+
const loaded = tryLoadManifest(absolutePath);
|
|
63
|
+
if (loaded) {
|
|
64
|
+
return {
|
|
65
|
+
manifestPath: absolutePath,
|
|
66
|
+
manifestDir: dirname(absolutePath),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`No manifest found at: ${pathArg}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Display signing preview (dry run)
|
|
74
|
+
*/
|
|
75
|
+
function displayDryRun(manifestPath, manifest, outputPath, options) {
|
|
76
|
+
newline();
|
|
77
|
+
info(colors.bold("Dry Run Preview - Signing"));
|
|
78
|
+
newline();
|
|
79
|
+
keyValue("Tool", manifest.name);
|
|
80
|
+
keyValue("Version", manifest.version ?? "unversioned");
|
|
81
|
+
keyValue("Manifest", manifestPath);
|
|
82
|
+
keyValue("Output", outputPath);
|
|
83
|
+
keyValue("Submit to registry", options.local ? "No (local only)" : "Yes");
|
|
84
|
+
newline();
|
|
85
|
+
info("Actions that would be performed:");
|
|
86
|
+
dim(" 1. Authenticate via OIDC (browser-based OAuth flow)");
|
|
87
|
+
dim(" 2. Create in-toto attestation for tool manifest");
|
|
88
|
+
dim(" 3. Request signing certificate from Fulcio");
|
|
89
|
+
dim(" 4. Sign attestation with ephemeral keypair");
|
|
90
|
+
dim(" 5. Log signature to Rekor transparency log");
|
|
91
|
+
dim(` 6. Write bundle to ${outputPath}`);
|
|
92
|
+
if (!options.local) {
|
|
93
|
+
dim(" 7. Submit attestation to Enact registry");
|
|
94
|
+
}
|
|
95
|
+
newline();
|
|
96
|
+
warning("Note: Actual signing requires OIDC authentication.");
|
|
97
|
+
dim("You will be prompted to authenticate in your browser.");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Prompt user to add themselves to trusted auditors list (local config)
|
|
101
|
+
*/
|
|
102
|
+
async function promptAddToTrustList(auditorEmail, isInteractive) {
|
|
103
|
+
if (!isInteractive) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
// Convert email to provider:identity format (e.g., github:alice)
|
|
108
|
+
const providerIdentity = emailToProviderIdentity(auditorEmail);
|
|
109
|
+
// Check if already in local trust list
|
|
110
|
+
const trustedAuditors = getTrustedAuditors();
|
|
111
|
+
if (trustedAuditors.includes(providerIdentity)) {
|
|
112
|
+
// Already trusted
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
newline();
|
|
116
|
+
info(colors.command("Trust Configuration"));
|
|
117
|
+
newline();
|
|
118
|
+
dim(`You signed this tool with: ${colors.bold(auditorEmail)}`);
|
|
119
|
+
dim(`Identity format: ${colors.bold(providerIdentity)}`);
|
|
120
|
+
dim("This identity is not currently in your local trusted auditors list.");
|
|
121
|
+
newline();
|
|
122
|
+
const shouldAdd = await confirm("Would you like to add this identity to ~/.enact/config.yaml?", true);
|
|
123
|
+
if (!shouldAdd) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
// Add to local config file
|
|
127
|
+
const added = addTrustedAuditor(providerIdentity);
|
|
128
|
+
if (added) {
|
|
129
|
+
newline();
|
|
130
|
+
success(`Added ${providerIdentity} to ~/.enact/config.yaml`);
|
|
131
|
+
dim("This tool (and others you sign) will now be automatically trusted");
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
// Silently fail if trust update fails - don't block signing
|
|
138
|
+
if (err instanceof Error) {
|
|
139
|
+
dim(`Note: Could not update trust list: ${err.message}`);
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Display signing result
|
|
146
|
+
*/
|
|
147
|
+
function displayResult(bundle, outputPath, manifest, options, registryResult) {
|
|
148
|
+
if (options.json) {
|
|
149
|
+
json({
|
|
150
|
+
success: true,
|
|
151
|
+
tool: manifest.name,
|
|
152
|
+
version: manifest.version ?? "unversioned",
|
|
153
|
+
bundlePath: outputPath,
|
|
154
|
+
bundle,
|
|
155
|
+
registry: registryResult
|
|
156
|
+
? {
|
|
157
|
+
submitted: true,
|
|
158
|
+
auditor: registryResult.auditor,
|
|
159
|
+
rekorLogIndex: registryResult.rekorLogIndex,
|
|
160
|
+
}
|
|
161
|
+
: { submitted: false },
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
newline();
|
|
166
|
+
success(`Successfully signed ${manifest.name}@${manifest.version ?? "unversioned"}`);
|
|
167
|
+
newline();
|
|
168
|
+
keyValue("Bundle saved to", outputPath);
|
|
169
|
+
// Show some bundle details
|
|
170
|
+
if (bundle.verificationMaterial?.tlogEntries?.[0]) {
|
|
171
|
+
const entry = bundle.verificationMaterial.tlogEntries[0];
|
|
172
|
+
if (entry.logIndex !== undefined) {
|
|
173
|
+
keyValue("Rekor log index", String(entry.logIndex));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Show registry submission result
|
|
177
|
+
if (registryResult) {
|
|
178
|
+
newline();
|
|
179
|
+
success("Attestation submitted to registry");
|
|
180
|
+
keyValue("Auditor identity", registryResult.auditor);
|
|
181
|
+
}
|
|
182
|
+
else if (!options.local) {
|
|
183
|
+
newline();
|
|
184
|
+
warning("Attestation was not submitted to registry (use --local to suppress this warning)");
|
|
185
|
+
}
|
|
186
|
+
newline();
|
|
187
|
+
if (options.local) {
|
|
188
|
+
info("Note: Attestation saved locally only (--local flag)");
|
|
189
|
+
dim(" • Run 'enact sign .' without --local to submit to registry");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Sign a remote tool from the registry
|
|
194
|
+
*/
|
|
195
|
+
async function signRemoteTool(toolRef, options, _ctx) {
|
|
196
|
+
const config = loadConfig();
|
|
197
|
+
const registryUrl = process.env.ENACT_REGISTRY_URL ??
|
|
198
|
+
config.registry?.url ??
|
|
199
|
+
"https://siikwkfgsmouioodghho.supabase.co/functions/v1";
|
|
200
|
+
const client = createApiClient({ baseUrl: registryUrl });
|
|
201
|
+
// Fetch tool info from registry
|
|
202
|
+
info(`Fetching ${toolRef.name}@${toolRef.version} from registry...`);
|
|
203
|
+
let toolInfo;
|
|
204
|
+
try {
|
|
205
|
+
toolInfo = await getToolVersion(client, toolRef.name, toolRef.version);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
error(`Tool not found: ${toolRef.name}@${toolRef.version}`);
|
|
209
|
+
if (err instanceof Error) {
|
|
210
|
+
dim(` ${err.message}`);
|
|
211
|
+
}
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
newline();
|
|
215
|
+
keyValue("Tool", toolInfo.name);
|
|
216
|
+
keyValue("Version", toolInfo.version);
|
|
217
|
+
keyValue("Bundle hash", toolInfo.bundle.hash);
|
|
218
|
+
keyValue("Published by", toolInfo.publishedBy.username);
|
|
219
|
+
// Show existing attestations
|
|
220
|
+
if (toolInfo.attestations.length > 0) {
|
|
221
|
+
newline();
|
|
222
|
+
info("Existing attestations:");
|
|
223
|
+
for (const att of toolInfo.attestations) {
|
|
224
|
+
dim(` • ${att.auditor} (${att.auditorProvider})`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Dry run mode
|
|
228
|
+
if (options.dryRun) {
|
|
229
|
+
newline();
|
|
230
|
+
info(colors.bold("Dry Run - Would perform:"));
|
|
231
|
+
dim(" 1. Authenticate via OIDC (browser-based OAuth flow)");
|
|
232
|
+
dim(" 2. Create in-toto attestation for bundle hash");
|
|
233
|
+
dim(" 3. Request signing certificate from Fulcio");
|
|
234
|
+
dim(" 4. Sign attestation with ephemeral keypair");
|
|
235
|
+
dim(" 5. Log signature to Rekor transparency log");
|
|
236
|
+
dim(" 6. Submit attestation to registry");
|
|
237
|
+
newline();
|
|
238
|
+
warning("Note: Actual signing requires OIDC authentication.");
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
// Check auth before doing anything - remote signing always submits to registry
|
|
242
|
+
const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
|
|
243
|
+
if (!authToken) {
|
|
244
|
+
error("Not authenticated with registry");
|
|
245
|
+
dim("Run 'enact auth login' to authenticate before signing remote tools");
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
// Confirm signing
|
|
249
|
+
if (_ctx.isInteractive) {
|
|
250
|
+
newline();
|
|
251
|
+
const shouldSign = await confirm(`Sign ${toolInfo.name}@${toolInfo.version} with your identity?`, true);
|
|
252
|
+
if (!shouldSign) {
|
|
253
|
+
info("Signing cancelled");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Sign the attestation (using bundle hash as the artifact)
|
|
258
|
+
const attestationOptions = {
|
|
259
|
+
name: toolInfo.name,
|
|
260
|
+
version: toolInfo.version,
|
|
261
|
+
publisher: options.identity ?? "unknown",
|
|
262
|
+
description: toolInfo.description,
|
|
263
|
+
buildTimestamp: new Date(),
|
|
264
|
+
bundleHash: toolInfo.bundle.hash,
|
|
265
|
+
};
|
|
266
|
+
// Create the in-toto statement - use bundle hash as the "content" for remote tools
|
|
267
|
+
const statement = createEnactToolStatement(toolInfo.bundle.hash, attestationOptions);
|
|
268
|
+
// Sign it
|
|
269
|
+
const result = await withSpinner("Signing attestation...", async () => {
|
|
270
|
+
try {
|
|
271
|
+
return await signAttestation(statement, {
|
|
272
|
+
timeout: 120000, // 2 minutes for OIDC flow
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
if (err instanceof Error && err.message.includes("cancelled")) {
|
|
277
|
+
throw new Error("Signing cancelled by user");
|
|
278
|
+
}
|
|
279
|
+
throw err;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
// Submit to registry
|
|
283
|
+
client.setAuthToken(authToken);
|
|
284
|
+
try {
|
|
285
|
+
const attestationResult = await withSpinner("Submitting attestation to registry...", async () => {
|
|
286
|
+
return await submitAttestationToRegistry(client, {
|
|
287
|
+
name: toolInfo.name,
|
|
288
|
+
version: toolInfo.version,
|
|
289
|
+
sigstoreBundle: result.bundle,
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
newline();
|
|
293
|
+
success(`Signed ${toolInfo.name}@${toolInfo.version}`);
|
|
294
|
+
keyValue("Auditor identity", attestationResult.auditor);
|
|
295
|
+
if (attestationResult.rekorLogIndex) {
|
|
296
|
+
keyValue("Rekor log index", String(attestationResult.rekorLogIndex));
|
|
297
|
+
}
|
|
298
|
+
// Prompt to add to trust list
|
|
299
|
+
if (_ctx.isInteractive && !options.json) {
|
|
300
|
+
await promptAddToTrustList(attestationResult.auditor, _ctx.isInteractive);
|
|
301
|
+
}
|
|
302
|
+
if (options.json) {
|
|
303
|
+
json({
|
|
304
|
+
success: true,
|
|
305
|
+
tool: toolInfo.name,
|
|
306
|
+
version: toolInfo.version,
|
|
307
|
+
auditor: attestationResult.auditor,
|
|
308
|
+
rekorLogIndex: attestationResult.rekorLogIndex,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
error("Failed to submit attestation to registry");
|
|
314
|
+
if (err instanceof Error) {
|
|
315
|
+
dim(` ${err.message}`);
|
|
316
|
+
}
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Sign command handler (local files)
|
|
322
|
+
*/
|
|
323
|
+
async function signLocalTool(pathArg, options, _ctx) {
|
|
324
|
+
// Find manifest
|
|
325
|
+
const { manifestPath, manifestDir } = findManifestPath(pathArg);
|
|
326
|
+
const manifestContent = readFileSync(manifestPath, "utf-8");
|
|
327
|
+
// Load and validate manifest
|
|
328
|
+
const loaded = tryLoadManifest(manifestPath);
|
|
329
|
+
if (!loaded) {
|
|
330
|
+
error(`Failed to load manifest from: ${manifestPath}`);
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
const manifest = loaded.manifest;
|
|
334
|
+
// Validate manifest
|
|
335
|
+
const validation = validateManifest(manifest);
|
|
336
|
+
if (!validation.valid && validation.errors) {
|
|
337
|
+
error("Manifest validation failed:");
|
|
338
|
+
for (const err of validation.errors) {
|
|
339
|
+
dim(` ${symbols.cross} ${err.path}: ${err.message}`);
|
|
340
|
+
}
|
|
341
|
+
process.exit(1);
|
|
342
|
+
}
|
|
343
|
+
// Determine output path
|
|
344
|
+
const outputPath = options.output
|
|
345
|
+
? resolve(options.output)
|
|
346
|
+
: join(manifestDir, DEFAULT_BUNDLE_FILENAME);
|
|
347
|
+
// Dry run mode
|
|
348
|
+
if (options.dryRun) {
|
|
349
|
+
displayDryRun(manifestPath, manifest, outputPath, options);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
// Prepare attestation options
|
|
353
|
+
const attestationOptions = {
|
|
354
|
+
name: manifest.name,
|
|
355
|
+
version: manifest.version ?? "1.0.0",
|
|
356
|
+
publisher: options.identity ?? "unknown",
|
|
357
|
+
description: manifest.description,
|
|
358
|
+
buildTimestamp: new Date(),
|
|
359
|
+
};
|
|
360
|
+
// Check for git repository for source info
|
|
361
|
+
try {
|
|
362
|
+
const { execSync } = await import("node:child_process");
|
|
363
|
+
const gitCommit = execSync("git rev-parse HEAD", {
|
|
364
|
+
cwd: manifestDir,
|
|
365
|
+
encoding: "utf-8",
|
|
366
|
+
}).trim();
|
|
367
|
+
attestationOptions.sourceCommit = gitCommit;
|
|
368
|
+
const remoteUrl = execSync("git remote get-url origin", {
|
|
369
|
+
cwd: manifestDir,
|
|
370
|
+
encoding: "utf-8",
|
|
371
|
+
}).trim();
|
|
372
|
+
attestationOptions.repository = remoteUrl;
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
// Not a git repository or git not available
|
|
376
|
+
if (options.verbose) {
|
|
377
|
+
dim("Note: Not a git repository, skipping source commit info");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// Create in-toto attestation statement
|
|
381
|
+
const statement = createEnactToolStatement(manifestContent, attestationOptions);
|
|
382
|
+
if (options.verbose) {
|
|
383
|
+
info("Created attestation statement:");
|
|
384
|
+
dim(JSON.stringify(statement, null, 2));
|
|
385
|
+
newline();
|
|
386
|
+
}
|
|
387
|
+
// Sign the attestation
|
|
388
|
+
info("Starting OIDC signing flow...");
|
|
389
|
+
dim("A browser window will open for authentication.");
|
|
390
|
+
newline();
|
|
391
|
+
const result = await withSpinner("Signing attestation...", async () => {
|
|
392
|
+
try {
|
|
393
|
+
// Cast statement to Record<string, unknown> for signAttestation
|
|
394
|
+
return await signAttestation(statement, {
|
|
395
|
+
timeout: 120000, // 2 minutes for OIDC flow
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
// Re-throw with more context
|
|
400
|
+
if (err instanceof Error) {
|
|
401
|
+
if (err.message.includes("OIDC") || err.message.includes("token")) {
|
|
402
|
+
throw new Error(`OIDC authentication failed: ${err.message}\nMake sure you complete the browser authentication flow.`);
|
|
403
|
+
}
|
|
404
|
+
if (err.message.includes("Fulcio") || err.message.includes("certificate")) {
|
|
405
|
+
throw new Error(`Certificate issuance failed: ${err.message}\nThis may be a temporary issue with the Sigstore infrastructure.`);
|
|
406
|
+
}
|
|
407
|
+
if (err.message.includes("Rekor") || err.message.includes("transparency")) {
|
|
408
|
+
throw new Error(`Transparency log failed: ${err.message}\nThis may be a temporary issue with the Sigstore infrastructure.`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
throw err;
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
// Save the bundle locally
|
|
415
|
+
writeFileSync(outputPath, JSON.stringify(result.bundle, null, 2));
|
|
416
|
+
// Submit attestation to registry (unless --local)
|
|
417
|
+
let registryResult;
|
|
418
|
+
if (!options.local) {
|
|
419
|
+
// Check for auth token from keyring
|
|
420
|
+
const authToken = await getSecret(AUTH_NAMESPACE, ACCESS_TOKEN_KEY);
|
|
421
|
+
if (!authToken) {
|
|
422
|
+
warning("Not authenticated with registry - attestation saved locally only");
|
|
423
|
+
dim("Run 'enact auth login' to authenticate, then sign again to submit");
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
const client = createApiClient();
|
|
427
|
+
client.setAuthToken(authToken);
|
|
428
|
+
try {
|
|
429
|
+
const attestationResult = await withSpinner("Submitting attestation to registry...", async () => {
|
|
430
|
+
// Submit the Sigstore bundle directly (v2 API)
|
|
431
|
+
return await submitAttestationToRegistry(client, {
|
|
432
|
+
name: manifest.name,
|
|
433
|
+
version: manifest.version ?? "1.0.0",
|
|
434
|
+
sigstoreBundle: result.bundle,
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
registryResult = {
|
|
438
|
+
auditor: attestationResult.auditor,
|
|
439
|
+
rekorLogIndex: attestationResult.rekorLogIndex,
|
|
440
|
+
};
|
|
441
|
+
// Prompt to add auditor to trust list (if interactive and not in JSON mode)
|
|
442
|
+
if (!options.json && _ctx.isInteractive) {
|
|
443
|
+
await promptAddToTrustList(attestationResult.auditor, _ctx.isInteractive);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
warning("Failed to submit attestation to registry");
|
|
448
|
+
if (err instanceof Error) {
|
|
449
|
+
dim(` ${err.message}`);
|
|
450
|
+
}
|
|
451
|
+
dim("The attestation was saved locally and logged to Rekor.");
|
|
452
|
+
dim("You can try submitting again later.");
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// Display result
|
|
457
|
+
displayResult(result.bundle, outputPath, manifest, options, registryResult);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Main sign command handler - routes to local or remote
|
|
461
|
+
*/
|
|
462
|
+
async function signHandler(pathArg, options, ctx) {
|
|
463
|
+
// Check if this is a remote tool reference (author/tool@version)
|
|
464
|
+
const remoteRef = parseRemoteToolRef(pathArg);
|
|
465
|
+
if (remoteRef) {
|
|
466
|
+
// Sign remote tool from registry
|
|
467
|
+
await signRemoteTool(remoteRef, options, ctx);
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
// Sign local tool
|
|
471
|
+
await signLocalTool(pathArg, options, ctx);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Configure the sign command
|
|
476
|
+
*/
|
|
477
|
+
export function configureSignCommand(program) {
|
|
478
|
+
program
|
|
479
|
+
.command("sign")
|
|
480
|
+
.description("Cryptographically sign a tool and submit attestation to registry")
|
|
481
|
+
.argument("<path>", "Path to tool directory, manifest file, or remote tool (author/tool@version)")
|
|
482
|
+
.option("-i, --identity <email>", "Sign with specific identity (uses OAuth)")
|
|
483
|
+
.option("-o, --output <path>", "Output path for signature bundle (local only)")
|
|
484
|
+
.option("--dry-run", "Show what would be signed without signing")
|
|
485
|
+
.option("--local", "Save signature locally only, do not submit to registry")
|
|
486
|
+
.option("-v, --verbose", "Show detailed output")
|
|
487
|
+
.option("--json", "Output result as JSON")
|
|
488
|
+
.action(async (pathArg, options) => {
|
|
489
|
+
const ctx = {
|
|
490
|
+
cwd: process.cwd(),
|
|
491
|
+
options,
|
|
492
|
+
isCI: Boolean(process.env.CI),
|
|
493
|
+
isInteractive: process.stdout.isTTY ?? false,
|
|
494
|
+
};
|
|
495
|
+
try {
|
|
496
|
+
await signHandler(pathArg, options, ctx);
|
|
497
|
+
}
|
|
498
|
+
catch (err) {
|
|
499
|
+
error(formatError(err));
|
|
500
|
+
if (options.verbose && err instanceof Error && err.stack) {
|
|
501
|
+
dim(err.stack);
|
|
502
|
+
}
|
|
503
|
+
process.exit(1);
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sign/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 type { Command } from "commander";
|
|
9
|
+
/**
|
|
10
|
+
* Configure the trust command
|
|
11
|
+
*/
|
|
12
|
+
export declare function configureTrustCommand(program: Command): void;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/trust/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+VzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE5D"}
|