@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.
Files changed (118) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/commands/auth.d.ts +9 -0
  3. package/dist/commands/auth.d.ts.map +1 -0
  4. package/dist/commands/auth.js +190 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/fix.d.ts +3 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +146 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/fixactions.d.ts +12 -0
  11. package/dist/commands/fixactions.d.ts.map +1 -0
  12. package/dist/commands/fixactions.js +176 -0
  13. package/dist/commands/fixactions.js.map +1 -0
  14. package/dist/commands/link.d.ts +8 -0
  15. package/dist/commands/link.d.ts.map +1 -0
  16. package/dist/commands/link.js +0 -0
  17. package/dist/commands/link.js.map +1 -0
  18. package/dist/commands/observed.d.ts +18 -0
  19. package/dist/commands/observed.d.ts.map +1 -0
  20. package/dist/commands/observed.js +254 -0
  21. package/dist/commands/observed.js.map +1 -0
  22. package/dist/commands/pick.d.ts +3 -0
  23. package/dist/commands/pick.d.ts.map +1 -0
  24. package/dist/commands/pick.js +18 -0
  25. package/dist/commands/pick.js.map +1 -0
  26. package/dist/commands/repo.d.ts +12 -0
  27. package/dist/commands/repo.d.ts.map +1 -0
  28. package/dist/commands/repo.js +330 -0
  29. package/dist/commands/repo.js.map +1 -0
  30. package/dist/commands/scan.d.ts +9 -0
  31. package/dist/commands/scan.d.ts.map +1 -0
  32. package/dist/commands/scan.js +98 -0
  33. package/dist/commands/scan.js.map +1 -0
  34. package/dist/commands/status.d.ts +5 -0
  35. package/dist/commands/status.d.ts.map +1 -0
  36. package/dist/commands/status.js +250 -0
  37. package/dist/commands/status.js.map +1 -0
  38. package/dist/core/client.d.ts +87 -0
  39. package/dist/core/client.d.ts.map +1 -0
  40. package/dist/core/client.js +235 -0
  41. package/dist/core/client.js.map +1 -0
  42. package/dist/core/config.d.ts +24 -0
  43. package/dist/core/config.d.ts.map +1 -0
  44. package/dist/core/config.js +85 -0
  45. package/dist/core/config.js.map +1 -0
  46. package/dist/core/credentials.d.ts +17 -0
  47. package/dist/core/credentials.d.ts.map +1 -0
  48. package/dist/core/credentials.js +139 -0
  49. package/dist/core/credentials.js.map +1 -0
  50. package/dist/core/discovery.d.ts +8 -0
  51. package/dist/core/discovery.d.ts.map +1 -0
  52. package/dist/core/discovery.js +62 -0
  53. package/dist/core/discovery.js.map +1 -0
  54. package/dist/core/errors.d.ts +32 -0
  55. package/dist/core/errors.d.ts.map +1 -0
  56. package/dist/core/errors.js +56 -0
  57. package/dist/core/errors.js.map +1 -0
  58. package/dist/core/index.d.ts +10 -0
  59. package/dist/core/index.d.ts.map +1 -0
  60. package/dist/core/index.js +9 -0
  61. package/dist/core/index.js.map +1 -0
  62. package/dist/core/oauth.d.ts +20 -0
  63. package/dist/core/oauth.d.ts.map +1 -0
  64. package/dist/core/oauth.js +218 -0
  65. package/dist/core/oauth.js.map +1 -0
  66. package/dist/core/repo.d.ts +24 -0
  67. package/dist/core/repo.d.ts.map +1 -0
  68. package/dist/core/repo.js +101 -0
  69. package/dist/core/repo.js.map +1 -0
  70. package/dist/core/session.d.ts +24 -0
  71. package/dist/core/session.d.ts.map +1 -0
  72. package/dist/core/session.js +32 -0
  73. package/dist/core/session.js.map +1 -0
  74. package/dist/core/types.d.ts +309 -0
  75. package/dist/core/types.d.ts.map +1 -0
  76. package/dist/core/types.js +2 -0
  77. package/dist/core/types.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +148 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/ui/browser.d.ts +30 -0
  83. package/dist/ui/browser.d.ts.map +1 -0
  84. package/dist/ui/browser.js +350 -0
  85. package/dist/ui/browser.js.map +1 -0
  86. package/dist/ui/format.d.ts +15 -0
  87. package/dist/ui/format.d.ts.map +1 -0
  88. package/dist/ui/format.js +131 -0
  89. package/dist/ui/format.js.map +1 -0
  90. package/dist/ui/output.d.ts +16 -0
  91. package/dist/ui/output.d.ts.map +1 -0
  92. package/dist/ui/output.js +63 -0
  93. package/dist/ui/output.js.map +1 -0
  94. package/dist/ui/prompts.d.ts +39 -0
  95. package/dist/ui/prompts.d.ts.map +1 -0
  96. package/dist/ui/prompts.js +76 -0
  97. package/dist/ui/prompts.js.map +1 -0
  98. package/dist/ui/screen.d.ts +27 -0
  99. package/dist/ui/screen.d.ts.map +1 -0
  100. package/dist/ui/screen.js +120 -0
  101. package/dist/ui/screen.js.map +1 -0
  102. package/dist/ui/spinner.d.ts +8 -0
  103. package/dist/ui/spinner.d.ts.map +1 -0
  104. package/dist/ui/spinner.js +98 -0
  105. package/dist/ui/spinner.js.map +1 -0
  106. package/dist/ui/table.d.ts +14 -0
  107. package/dist/ui/table.d.ts.map +1 -0
  108. package/dist/ui/table.js +47 -0
  109. package/dist/ui/table.js.map +1 -0
  110. package/dist/ui/theme.d.ts +44 -0
  111. package/dist/ui/theme.d.ts.map +1 -0
  112. package/dist/ui/theme.js +85 -0
  113. package/dist/ui/theme.js.map +1 -0
  114. package/dist/version.d.ts +3 -0
  115. package/dist/version.d.ts.map +1 -0
  116. package/dist/version.js +17 -0
  117. package/dist/version.js.map +1 -0
  118. 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,3 @@
1
+ import { type GlobalOptions } from "../core/session.js";
2
+ export declare function fixCommand(globals: GlobalOptions): Promise<number>;
3
+ //# sourceMappingURL=fix.d.ts.map
@@ -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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"}