@cefense-npm/cefense-cli 0.1.0
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/LICENSE.md +21 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +190 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/fix.d.ts +3 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +146 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/fixactions.d.ts +12 -0
- package/dist/commands/fixactions.d.ts.map +1 -0
- package/dist/commands/fixactions.js +176 -0
- package/dist/commands/fixactions.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +0 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/observed.d.ts +18 -0
- package/dist/commands/observed.d.ts.map +1 -0
- package/dist/commands/observed.js +254 -0
- package/dist/commands/observed.js.map +1 -0
- package/dist/commands/pick.d.ts +3 -0
- package/dist/commands/pick.d.ts.map +1 -0
- package/dist/commands/pick.js +18 -0
- package/dist/commands/pick.js.map +1 -0
- package/dist/commands/repo.d.ts +12 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +330 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +98 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +250 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/client.d.ts +87 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +235 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +85 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/credentials.d.ts +17 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +139 -0
- package/dist/core/credentials.js.map +1 -0
- package/dist/core/discovery.d.ts +8 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +62 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/errors.d.ts +32 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/oauth.d.ts +20 -0
- package/dist/core/oauth.d.ts.map +1 -0
- package/dist/core/oauth.js +218 -0
- package/dist/core/oauth.js.map +1 -0
- package/dist/core/repo.d.ts +24 -0
- package/dist/core/repo.d.ts.map +1 -0
- package/dist/core/repo.js +101 -0
- package/dist/core/repo.js.map +1 -0
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +32 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types.d.ts +309 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/browser.d.ts +30 -0
- package/dist/ui/browser.d.ts.map +1 -0
- package/dist/ui/browser.js +350 -0
- package/dist/ui/browser.js.map +1 -0
- package/dist/ui/format.d.ts +15 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +131 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/output.d.ts +16 -0
- package/dist/ui/output.d.ts.map +1 -0
- package/dist/ui/output.js +63 -0
- package/dist/ui/output.js.map +1 -0
- package/dist/ui/prompts.d.ts +39 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +76 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/screen.d.ts +27 -0
- package/dist/ui/screen.d.ts.map +1 -0
- package/dist/ui/screen.js +120 -0
- package/dist/ui/screen.js.map +1 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +98 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +14 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +47 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +44 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +85 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/package.json +54 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Cefense
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../core/session.js";
|
|
2
|
+
export declare function authLogin(globals: GlobalOptions, options?: {
|
|
3
|
+
force?: boolean;
|
|
4
|
+
}): Promise<number>;
|
|
5
|
+
export declare function authLogout(globals: GlobalOptions, options?: {
|
|
6
|
+
all?: boolean;
|
|
7
|
+
}): Promise<number>;
|
|
8
|
+
export declare function authStatus(globals: GlobalOptions): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CA8EjB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkDjB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DxE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import { deleteCredentials, keychainName, listStoredOrigins, loadCredentials, saveCredentials } from "../core/credentials.js";
|
|
3
|
+
import { assertVersionSupported, fetchDiscovery } from "../core/discovery.js";
|
|
4
|
+
import { exchangeCode, requestAuthorizationCode, revokeToken } from "../core/oauth.js";
|
|
5
|
+
import { resolveApiUrl } from "../core/config.js";
|
|
6
|
+
import { CefenseClient } from "../core/client.js";
|
|
7
|
+
import { CefenseError } from "../core/errors.js";
|
|
8
|
+
import { openSession } from "../core/session.js";
|
|
9
|
+
import * as out from "../ui/output.js";
|
|
10
|
+
import { confirm, spinner } from "../ui/prompts.js";
|
|
11
|
+
import { c, glyph } from "../ui/theme.js";
|
|
12
|
+
import { keyValue } from "../ui/table.js";
|
|
13
|
+
import { VERSION } from "../version.js";
|
|
14
|
+
export async function authLogin(globals, options = {}) {
|
|
15
|
+
const apiUrl = resolveApiUrl(globals.apiUrl);
|
|
16
|
+
const existing = await loadCredentials(apiUrl);
|
|
17
|
+
if (existing.backend === "environment") {
|
|
18
|
+
out.warn("CEFENSE_TOKEN is set, so the CLI is already authenticated from the environment.");
|
|
19
|
+
out.hint("Unset it to sign in interactively.");
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
if (existing.credentials && !options.force) {
|
|
23
|
+
out.line();
|
|
24
|
+
out.success(`Already signed in to ${c.bold(apiUrl)}${existing.credentials.email ? ` as ${existing.credentials.email}` : ""}.`);
|
|
25
|
+
out.hint("Run cf auth login --force to sign in again.");
|
|
26
|
+
out.line();
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
const config = await fetchDiscovery(apiUrl, { refresh: true });
|
|
30
|
+
assertVersionSupported(config);
|
|
31
|
+
out.heading("Cefense", `${apiUrl} · cli ${VERSION}`);
|
|
32
|
+
const progress = spinner();
|
|
33
|
+
let authorization;
|
|
34
|
+
try {
|
|
35
|
+
authorization = await requestAuthorizationCode(config, {
|
|
36
|
+
onUrl: (url) => {
|
|
37
|
+
out.info("Opening your browser to sign in. If it does not open, paste this:");
|
|
38
|
+
out.line();
|
|
39
|
+
out.line(` ${c.cyan(url)}`);
|
|
40
|
+
out.line();
|
|
41
|
+
void open(url).catch(() => undefined);
|
|
42
|
+
progress.start("Waiting for authentication in the browser");
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
progress.stop("Sign-in did not complete", "fail");
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
progress.stop("Browser sign-in complete");
|
|
51
|
+
const credentials = await exchangeCode(config, authorization);
|
|
52
|
+
const client = new CefenseClient({ apiUrl, config, credentials });
|
|
53
|
+
const me = await client.me().catch((error) => {
|
|
54
|
+
throw new CefenseError("Signed in, but that token could not read your Cefense account.", {
|
|
55
|
+
remedy: "Run cf doctor to check the API, then try again.",
|
|
56
|
+
cause: error,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
const saved = await saveCredentials(apiUrl, {
|
|
60
|
+
...credentials,
|
|
61
|
+
subject: me.user.id,
|
|
62
|
+
email: me.user.email,
|
|
63
|
+
});
|
|
64
|
+
out.line();
|
|
65
|
+
out.success(`Signed in as ${c.bold(me.user.email)}`);
|
|
66
|
+
out.hint(saved.backend === "keychain"
|
|
67
|
+
? `Token stored in ${keychainName()}.`
|
|
68
|
+
: `Token stored in a local file.`);
|
|
69
|
+
if (saved.warning)
|
|
70
|
+
out.warn(saved.warning);
|
|
71
|
+
const github = await client.githubStatus().catch(() => null);
|
|
72
|
+
out.line();
|
|
73
|
+
if (github && !github.connected) {
|
|
74
|
+
out.info("Next: connect a repository");
|
|
75
|
+
out.line(` ${c.dim("cf repo connect")}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
out.info("Next: see what is connected");
|
|
79
|
+
out.line(` ${c.dim("cf status")}`);
|
|
80
|
+
}
|
|
81
|
+
out.line();
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
export async function authLogout(globals, options = {}) {
|
|
85
|
+
const targets = options.all
|
|
86
|
+
? [...new Set([resolveApiUrl(globals.apiUrl), ...(await listStoredOrigins())])]
|
|
87
|
+
: [resolveApiUrl(globals.apiUrl)];
|
|
88
|
+
let signedOut = 0;
|
|
89
|
+
for (const apiUrl of targets) {
|
|
90
|
+
const { credentials, backend } = await loadCredentials(apiUrl);
|
|
91
|
+
if (!credentials)
|
|
92
|
+
continue;
|
|
93
|
+
if (backend === "environment") {
|
|
94
|
+
out.warn(`${apiUrl} is authenticated through CEFENSE_TOKEN, which the CLI cannot clear.`);
|
|
95
|
+
out.hint("Unset CEFENSE_TOKEN in your shell.");
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (!options.all && !globals.yes) {
|
|
99
|
+
const proceed = await confirm({
|
|
100
|
+
message: `Sign out of ${apiUrl}${credentials.email ? ` as ${credentials.email}` : ""}?`,
|
|
101
|
+
initialValue: true,
|
|
102
|
+
assumeYes: globals.yes,
|
|
103
|
+
});
|
|
104
|
+
if (!proceed) {
|
|
105
|
+
out.line();
|
|
106
|
+
out.info("Left signed in.");
|
|
107
|
+
out.line();
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
out.line();
|
|
112
|
+
const config = await fetchDiscovery(apiUrl).catch(() => null);
|
|
113
|
+
if (config) {
|
|
114
|
+
const revoked = await revokeToken(config, credentials.refreshToken ?? credentials.accessToken);
|
|
115
|
+
if (revoked)
|
|
116
|
+
out.success("Token revoked");
|
|
117
|
+
else
|
|
118
|
+
out.warn("The token could not be revoked remotely, so it will expire on its own.");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
out.warn("The Cefense API was unreachable, so the token could not be revoked remotely.");
|
|
122
|
+
}
|
|
123
|
+
await deleteCredentials(apiUrl);
|
|
124
|
+
out.success(`Credentials removed for ${apiUrl}`);
|
|
125
|
+
signedOut += 1;
|
|
126
|
+
}
|
|
127
|
+
if (signedOut === 0) {
|
|
128
|
+
out.line();
|
|
129
|
+
out.info("You were not signed in.");
|
|
130
|
+
}
|
|
131
|
+
out.line();
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
export async function authStatus(globals) {
|
|
135
|
+
const session = await openSession(globals, { auth: false });
|
|
136
|
+
if (!session.credentials) {
|
|
137
|
+
if (out.isJsonMode()) {
|
|
138
|
+
out.json({ apiUrl: session.apiUrl, authenticated: false });
|
|
139
|
+
return 3;
|
|
140
|
+
}
|
|
141
|
+
out.line();
|
|
142
|
+
out.warn(`Not signed in to ${session.apiUrl}.`);
|
|
143
|
+
out.hint("Run cf auth login.");
|
|
144
|
+
out.line();
|
|
145
|
+
return 3;
|
|
146
|
+
}
|
|
147
|
+
const [me, github, billing] = await Promise.all([
|
|
148
|
+
session.client.me(),
|
|
149
|
+
session.client.githubStatus().catch(() => null),
|
|
150
|
+
session.client.billing().catch(() => null),
|
|
151
|
+
]);
|
|
152
|
+
if (out.isJsonMode()) {
|
|
153
|
+
out.json({
|
|
154
|
+
apiUrl: session.apiUrl,
|
|
155
|
+
authenticated: true,
|
|
156
|
+
user: me.user,
|
|
157
|
+
credentialBackend: session.backend,
|
|
158
|
+
github,
|
|
159
|
+
billing,
|
|
160
|
+
});
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
out.heading("Cefense", session.apiUrl);
|
|
164
|
+
const rows = [
|
|
165
|
+
["Account", `${me.user.email}`],
|
|
166
|
+
[
|
|
167
|
+
"Credentials",
|
|
168
|
+
session.backend === "keychain"
|
|
169
|
+
? keychainName()
|
|
170
|
+
: session.backend === "environment"
|
|
171
|
+
? "CEFENSE_TOKEN environment variable"
|
|
172
|
+
: "local file",
|
|
173
|
+
],
|
|
174
|
+
];
|
|
175
|
+
if (github) {
|
|
176
|
+
rows.push([
|
|
177
|
+
"GitHub",
|
|
178
|
+
github.connected ? `connected as ${github.login}` : c.yellow("not connected"),
|
|
179
|
+
]);
|
|
180
|
+
}
|
|
181
|
+
out.lines(keyValue(rows).map((row) => ` ${row}`));
|
|
182
|
+
if (billing) {
|
|
183
|
+
out.section("Entitlements");
|
|
184
|
+
const entries = Object.entries(billing.entitlements).map(([feature, granted]) => granted ? c.green(`${glyph.check} ${feature}`) : c.dim(`${glyph.ring} ${feature}`));
|
|
185
|
+
out.line(` ${entries.join(" ")}`);
|
|
186
|
+
}
|
|
187
|
+
out.line();
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,aAAa,EAAgB,MAAM,oBAAoB,CAAC;AAkGnF,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAqFxE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { openSession } from "../core/session.js";
|
|
2
|
+
import { browse } from "../ui/browser.js";
|
|
3
|
+
import { resolveLinkedProject } from "./link.js";
|
|
4
|
+
import * as out from "../ui/output.js";
|
|
5
|
+
import { wrapText } from "../ui/format.js";
|
|
6
|
+
import { c, displaySeverity, glyph, severityColor, severityRank } from "../ui/theme.js";
|
|
7
|
+
import { fixActions, fixLabel, renderDiff } from "./fixactions.js";
|
|
8
|
+
function detail(row, width) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
const push = (value = "") => lines.push(value ? ` ${value}` : "");
|
|
11
|
+
const body = Math.min(96, width - 4);
|
|
12
|
+
push();
|
|
13
|
+
push(`${c.bold(row.finding.title)} ${severityColor(row.finding.severity)(displaySeverity(row.finding.severity))}`);
|
|
14
|
+
push();
|
|
15
|
+
if (!row.fix) {
|
|
16
|
+
push(c.dim(`${row.finding.filePath} ${row.finding.ruleId ?? ""}`));
|
|
17
|
+
push();
|
|
18
|
+
push("No fix has been generated for this finding yet.");
|
|
19
|
+
push();
|
|
20
|
+
push(c.dim("Press g to generate one."));
|
|
21
|
+
push();
|
|
22
|
+
return lines;
|
|
23
|
+
}
|
|
24
|
+
push(c.dim([row.fix.filePath, `base ${row.fix.baseSha.slice(0, 7)}`].join(" ")));
|
|
25
|
+
push();
|
|
26
|
+
if (row.fix.status === "failed") {
|
|
27
|
+
push(c.red(row.fix.error ?? "Generation failed."));
|
|
28
|
+
push();
|
|
29
|
+
return lines;
|
|
30
|
+
}
|
|
31
|
+
if (row.fix.status === "generating" || row.fix.status === "publishing") {
|
|
32
|
+
push(c.cyan(`${row.fix.status}, this can take a minute.`));
|
|
33
|
+
push();
|
|
34
|
+
return lines;
|
|
35
|
+
}
|
|
36
|
+
if (row.fix.diff) {
|
|
37
|
+
push(c.dim("PATCH"));
|
|
38
|
+
push();
|
|
39
|
+
for (const diffLine of renderDiff(row.fix.diff).slice(0, 200))
|
|
40
|
+
push(diffLine);
|
|
41
|
+
push();
|
|
42
|
+
}
|
|
43
|
+
if (row.fix.explanation) {
|
|
44
|
+
push(c.dim("WHY"));
|
|
45
|
+
push();
|
|
46
|
+
for (const wrapped of wrapText(row.fix.explanation, body))
|
|
47
|
+
push(wrapped);
|
|
48
|
+
push();
|
|
49
|
+
}
|
|
50
|
+
if (row.fix.prUrl) {
|
|
51
|
+
push(c.dim("PULL REQUEST"));
|
|
52
|
+
push();
|
|
53
|
+
push(c.cyan(row.fix.prUrl));
|
|
54
|
+
push();
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
push(c.dim("Press p to open a pull request with this patch."));
|
|
58
|
+
push();
|
|
59
|
+
}
|
|
60
|
+
return lines;
|
|
61
|
+
}
|
|
62
|
+
async function loadRows(session, project) {
|
|
63
|
+
const response = await session.client.findings(project.githubRepoId);
|
|
64
|
+
if (!response.scanId)
|
|
65
|
+
return { rows: [], scanId: null };
|
|
66
|
+
const { fixes } = await session.client.fixesForScan(response.scanId).catch(() => ({ fixes: [] }));
|
|
67
|
+
const byFinding = new Map(fixes.map((fix) => [fix.findingId, fix]));
|
|
68
|
+
const rows = response.findings
|
|
69
|
+
.map((finding) => ({ finding, fix: byFinding.get(finding.id) ?? null }))
|
|
70
|
+
.sort((left, right) => severityRank(left.finding.severity) - severityRank(right.finding.severity) ||
|
|
71
|
+
left.finding.filePath.localeCompare(right.finding.filePath));
|
|
72
|
+
return { rows, scanId: response.scanId };
|
|
73
|
+
}
|
|
74
|
+
export async function fixCommand(globals) {
|
|
75
|
+
const session = await openSession(globals, { auth: true });
|
|
76
|
+
const { project } = await resolveLinkedProject(session, globals);
|
|
77
|
+
const { rows, scanId } = await loadRows(session, project);
|
|
78
|
+
if (out.isJsonMode()) {
|
|
79
|
+
out.json({ repository: project.fullName, scanId, fixes: rows.map((row) => row.fix).filter(Boolean) });
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
if (rows.length === 0) {
|
|
83
|
+
out.line();
|
|
84
|
+
out.info(scanId
|
|
85
|
+
? `No findings in ${c.bold(project.fullName)} to fix.`
|
|
86
|
+
: `${c.bold(project.fullName)} has not been scanned yet.`);
|
|
87
|
+
if (!scanId)
|
|
88
|
+
out.hint("Run cf scan.");
|
|
89
|
+
out.line();
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
if (out.isPiped()) {
|
|
93
|
+
for (const row of rows) {
|
|
94
|
+
out.line([
|
|
95
|
+
displaySeverity(row.finding.severity).toLowerCase(),
|
|
96
|
+
row.finding.filePath,
|
|
97
|
+
row.fix?.status ?? "none",
|
|
98
|
+
row.fix?.prUrl ?? "",
|
|
99
|
+
row.finding.title,
|
|
100
|
+
].join("\t"));
|
|
101
|
+
}
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
const refresh = async () => (await loadRows(session, project)).rows;
|
|
105
|
+
await browse(rows, {
|
|
106
|
+
header: (visible) => {
|
|
107
|
+
const ready = visible.filter((row) => row.fix?.status === "ready").length;
|
|
108
|
+
const opened = visible.filter((row) => row.fix?.status === "opened").length;
|
|
109
|
+
const summary = [
|
|
110
|
+
`${visible.length} ${visible.length === 1 ? "finding" : "findings"}`,
|
|
111
|
+
ready > 0 ? c.green(`${ready} ready`) : "",
|
|
112
|
+
opened > 0 ? c.green(`${opened} in a pull request`) : "",
|
|
113
|
+
]
|
|
114
|
+
.filter(Boolean)
|
|
115
|
+
.join(c.dim(" · "));
|
|
116
|
+
return ["", ` ${c.bold(project.fullName)} ${c.dim(summary)}`, ""];
|
|
117
|
+
},
|
|
118
|
+
renderRow: (row, selected) => {
|
|
119
|
+
const marker = selected ? c.cyan(glyph.arrow) : " ";
|
|
120
|
+
const severity = severityColor(row.finding.severity)(`${glyph.dot} ${displaySeverity(row.finding.severity).toLowerCase().padEnd(8)}`);
|
|
121
|
+
const title = selected ? c.bold(row.finding.title) : row.finding.title;
|
|
122
|
+
return [
|
|
123
|
+
`${marker} ${severity} ${title}`,
|
|
124
|
+
` ${c.dim(row.finding.filePath)} ${fixLabel(row.fix)}`,
|
|
125
|
+
"",
|
|
126
|
+
];
|
|
127
|
+
},
|
|
128
|
+
renderDetail: detail,
|
|
129
|
+
filterText: (row) => `${row.finding.title} ${row.finding.filePath} ${row.fix?.status ?? ""}`,
|
|
130
|
+
emptyMessage: "Nothing matches that filter.",
|
|
131
|
+
refresh,
|
|
132
|
+
actions: [
|
|
133
|
+
...fixActions(session, project, (row) => row ? { findingId: row.finding.id, fix: row.fix } : null),
|
|
134
|
+
{
|
|
135
|
+
key: "u",
|
|
136
|
+
label: "refresh",
|
|
137
|
+
run: async (_row, context) => {
|
|
138
|
+
await context.refresh();
|
|
139
|
+
context.setStatus("Refreshed.");
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
});
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Session } from "../core/session.js";
|
|
2
|
+
import type { Fix, Project } from "../core/types.js";
|
|
3
|
+
import type { BrowserAction } from "../ui/browser.js";
|
|
4
|
+
export interface FixTarget {
|
|
5
|
+
findingId: string;
|
|
6
|
+
fix: Fix | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function fixLabel(fix: Fix | null): string;
|
|
9
|
+
export declare function renderDiff(diff: string): string[];
|
|
10
|
+
export declare function renderFixSection(fix: Fix | null, width: number): string[];
|
|
11
|
+
export declare function fixActions<T>(session: Session, project: Project, target: (item: T | null) => FixTarget | null): BrowserAction<T>[];
|
|
12
|
+
//# sourceMappingURL=fixactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixactions.d.ts","sourceRoot":"","sources":["../../src/commands/fixactions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAMtE,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;CACjB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,MAAM,CAgBhD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAQjD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgDzE;AAuBD,wBAAgB,UAAU,CAAC,CAAC,EAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,SAAS,GAAG,IAAI,GAC3C,aAAa,CAAC,CAAC,CAAC,EAAE,CA2EpB"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import { confirmByTyping } from "../ui/prompts.js";
|
|
3
|
+
import { wrapText } from "../ui/format.js";
|
|
4
|
+
import * as out from "../ui/output.js";
|
|
5
|
+
import { c, glyph } from "../ui/theme.js";
|
|
6
|
+
export function fixLabel(fix) {
|
|
7
|
+
if (!fix)
|
|
8
|
+
return c.dim("no fix yet");
|
|
9
|
+
switch (fix.status) {
|
|
10
|
+
case "generating":
|
|
11
|
+
return c.cyan(`${glyph.pulse} generating`);
|
|
12
|
+
case "ready":
|
|
13
|
+
return c.green(`${glyph.check} fix ready`);
|
|
14
|
+
case "publishing":
|
|
15
|
+
return c.cyan(`${glyph.pulse} publishing`);
|
|
16
|
+
case "opened":
|
|
17
|
+
return c.green(fix.prNumber ? `${glyph.check} PR #${fix.prNumber}` : `${glyph.check} PR open`);
|
|
18
|
+
case "failed":
|
|
19
|
+
return c.red(`${glyph.cross} fix failed`);
|
|
20
|
+
default:
|
|
21
|
+
return c.dim(fix.status);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function renderDiff(diff) {
|
|
25
|
+
return diff.split("\n").map((line) => {
|
|
26
|
+
if (line.startsWith("+++") || line.startsWith("---"))
|
|
27
|
+
return c.dim(line);
|
|
28
|
+
if (line.startsWith("@@"))
|
|
29
|
+
return c.cyan(line);
|
|
30
|
+
if (line.startsWith("+"))
|
|
31
|
+
return c.green(line);
|
|
32
|
+
if (line.startsWith("-"))
|
|
33
|
+
return c.red(line);
|
|
34
|
+
return line;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export function renderFixSection(fix, width) {
|
|
38
|
+
const lines = [];
|
|
39
|
+
const push = (value = "") => lines.push(value ? ` ${value}` : "");
|
|
40
|
+
const body = Math.min(96, width - 4);
|
|
41
|
+
push();
|
|
42
|
+
push(c.dim("FIX"));
|
|
43
|
+
push();
|
|
44
|
+
if (!fix) {
|
|
45
|
+
push(c.dim(`No patch has been generated. Press ${c.bold("g")} to generate one.`));
|
|
46
|
+
push();
|
|
47
|
+
return lines;
|
|
48
|
+
}
|
|
49
|
+
push(c.dim([fix.filePath, `base ${fix.baseSha.slice(0, 7)}`].join(" ")));
|
|
50
|
+
push();
|
|
51
|
+
if (fix.status === "failed") {
|
|
52
|
+
push(c.red(fix.error ?? "Generation failed."));
|
|
53
|
+
push();
|
|
54
|
+
return lines;
|
|
55
|
+
}
|
|
56
|
+
if (fix.status === "generating" || fix.status === "publishing") {
|
|
57
|
+
push(c.cyan(`${fix.status}, this can take a minute.`));
|
|
58
|
+
push();
|
|
59
|
+
return lines;
|
|
60
|
+
}
|
|
61
|
+
if (fix.diff) {
|
|
62
|
+
for (const line of renderDiff(fix.diff).slice(0, 120))
|
|
63
|
+
push(line);
|
|
64
|
+
push();
|
|
65
|
+
}
|
|
66
|
+
if (fix.explanation) {
|
|
67
|
+
for (const wrapped of wrapText(fix.explanation, body))
|
|
68
|
+
push(c.dim(wrapped));
|
|
69
|
+
push();
|
|
70
|
+
}
|
|
71
|
+
if (fix.prUrl) {
|
|
72
|
+
push(`${c.dim("pull request")} ${c.cyan(fix.prUrl)}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
push(c.dim(`Press ${c.bold("p")} to open a pull request with this patch.`));
|
|
76
|
+
}
|
|
77
|
+
push();
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
async function pollUntilSettled(session, findingId, context) {
|
|
81
|
+
for (let attempt = 0; attempt < 90; attempt += 1) {
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
83
|
+
const { fix } = await session.client.fixForFinding(findingId).catch(() => ({ fix: null }));
|
|
84
|
+
await context.refresh();
|
|
85
|
+
if (!fix)
|
|
86
|
+
continue;
|
|
87
|
+
if (fix.status === "generating" || fix.status === "publishing")
|
|
88
|
+
continue;
|
|
89
|
+
context.setStatus(fix.status === "failed"
|
|
90
|
+
? `Generation failed: ${fix.error ?? "no reason given"}`
|
|
91
|
+
: "Fix ready. Press p to open a pull request.");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
context.setStatus("Still working. Come back in a moment.");
|
|
95
|
+
}
|
|
96
|
+
export function fixActions(session, project, target) {
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
key: "g",
|
|
100
|
+
label: (item) => {
|
|
101
|
+
const found = target(item);
|
|
102
|
+
if (!found)
|
|
103
|
+
return null;
|
|
104
|
+
const status = found.fix?.status;
|
|
105
|
+
if (status === "generating" || status === "publishing")
|
|
106
|
+
return null;
|
|
107
|
+
if (status === "opened")
|
|
108
|
+
return null;
|
|
109
|
+
if (status === "failed")
|
|
110
|
+
return "retry fix";
|
|
111
|
+
if (status === "ready")
|
|
112
|
+
return "regenerate";
|
|
113
|
+
return "generate fix";
|
|
114
|
+
},
|
|
115
|
+
run: async (item, context) => {
|
|
116
|
+
const found = target(item);
|
|
117
|
+
if (!found)
|
|
118
|
+
return;
|
|
119
|
+
if (found.fix?.status === "generating") {
|
|
120
|
+
context.setStatus("Already generating.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
context.setStatus("Requesting a fix.");
|
|
124
|
+
await session.client.generateFix(found.findingId);
|
|
125
|
+
await context.refresh();
|
|
126
|
+
context.setStatus("Generating. This can take a minute.");
|
|
127
|
+
await pollUntilSettled(session, found.findingId, context);
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
key: "p",
|
|
132
|
+
label: (item) => {
|
|
133
|
+
const status = target(item)?.fix?.status;
|
|
134
|
+
if (status === "opened")
|
|
135
|
+
return "view pull request";
|
|
136
|
+
if (status === "ready")
|
|
137
|
+
return "open pull request";
|
|
138
|
+
return null;
|
|
139
|
+
},
|
|
140
|
+
run: async (item, context) => {
|
|
141
|
+
const found = target(item);
|
|
142
|
+
if (!found)
|
|
143
|
+
return;
|
|
144
|
+
if (found.fix?.status === "opened" && found.fix.prUrl) {
|
|
145
|
+
void open(found.fix.prUrl).catch(() => undefined);
|
|
146
|
+
context.setStatus(`Opened ${found.fix.prUrl}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (found.fix?.status !== "ready") {
|
|
150
|
+
context.setStatus("Generate a fix first with g, then publish it with p.");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const patch = found.fix;
|
|
154
|
+
const confirmed = await context.suspend(async () => {
|
|
155
|
+
out.line();
|
|
156
|
+
out.warn(`This opens a real pull request on ${c.bold(project.fullName)}.`);
|
|
157
|
+
out.hint(`Branch from ${patch.baseSha.slice(0, 7)}, patching ${patch.filePath}.`);
|
|
158
|
+
out.line();
|
|
159
|
+
return confirmByTyping({
|
|
160
|
+
message: `Type ${project.name} to confirm`,
|
|
161
|
+
expected: project.name,
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
if (!confirmed) {
|
|
165
|
+
context.setStatus("Nothing was published.");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
context.setStatus("Opening a pull request.");
|
|
169
|
+
const result = await session.client.publishFix(found.findingId);
|
|
170
|
+
await context.refresh();
|
|
171
|
+
context.setStatus(result.fix.prUrl ? `Opened ${result.fix.prUrl}` : "Published, but no URL was returned.");
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=fixactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixactions.js","sourceRoot":"","sources":["../../src/commands/fixactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GlobalOptions, Session } from "../core/session.js";
|
|
2
|
+
import type { Project } from "../core/types.js";
|
|
3
|
+
export interface LinkedProject {
|
|
4
|
+
project: Project;
|
|
5
|
+
linked: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveLinkedProject(session: Session, globals: GlobalOptions): Promise<LinkedProject>;
|
|
8
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAUhD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAoGxB"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
|