@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
@@ -0,0 +1,18 @@
1
+ import { type GlobalOptions } from "../core/session.js";
2
+ import type { Finding, Fix } from "../core/types.js";
3
+ export interface ObservedOptions {
4
+ severity?: string;
5
+ category?: string;
6
+ matched?: boolean;
7
+ limit?: number;
8
+ exitCode?: boolean;
9
+ }
10
+ export interface Row {
11
+ finding: Finding;
12
+ fix: Fix | null;
13
+ }
14
+ export declare function observedCommand(globals: GlobalOptions, options: ObservedOptions & {
15
+ onlyMatched?: boolean;
16
+ }): Promise<number>;
17
+ export declare function requireLimit(value: string): number;
18
+ //# sourceMappingURL=observed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed.d.ts","sourceRoot":"","sources":["../../src/commands/observed.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAW,MAAM,kBAAkB,CAAC;AAS9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;CACjB;AAiJD,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAAC,MAAM,CAAC,CAuHjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,254 @@
1
+ import open from "open";
2
+ import { openSession } from "../core/session.js";
3
+ import { UsageError } from "../core/errors.js";
4
+ import { browse } from "../ui/browser.js";
5
+ import { resolveLinkedProject } from "./link.js";
6
+ import { fixActions, fixLabel, renderFixSection } from "./fixactions.js";
7
+ import * as out from "../ui/output.js";
8
+ import { relativeTime, wrapText } from "../ui/format.js";
9
+ import { c, displaySeverity, glyph, severityColor, severityRank } from "../ui/theme.js";
10
+ function sortRows(rows) {
11
+ return [...rows].sort((left, right) => severityRank(left.finding.severity) - severityRank(right.finding.severity) ||
12
+ left.finding.filePath.localeCompare(right.finding.filePath));
13
+ }
14
+ async function fixesFor(session, scanId) {
15
+ if (!scanId)
16
+ return new Map();
17
+ const { fixes } = await session.client.fixesForScan(scanId).catch(() => ({ fixes: [] }));
18
+ return new Map(fixes.map((fix) => [fix.findingId, fix]));
19
+ }
20
+ function locationOf(finding) {
21
+ return finding.startLine ? `${finding.filePath}:${finding.startLine}` : finding.filePath;
22
+ }
23
+ function githubUrlFor(project, finding) {
24
+ if (!project.htmlUrl)
25
+ return null;
26
+ const branch = project.defaultBranch ?? "HEAD";
27
+ const anchor = finding.startLine
28
+ ? `#L${finding.startLine}${finding.endLine && finding.endLine !== finding.startLine ? `-L${finding.endLine}` : ""}`
29
+ : "";
30
+ return `${project.htmlUrl}/blob/${branch}/${finding.filePath}${anchor}`;
31
+ }
32
+ function renderRow(row, selected, width) {
33
+ const finding = row.finding;
34
+ const marker = selected ? c.cyan(glyph.arrow) : " ";
35
+ const severity = severityColor(finding.severity)(`${glyph.dot} ${displaySeverity(finding.severity).toLowerCase().padEnd(8)}`);
36
+ const title = selected ? c.bold(finding.title) : finding.title;
37
+ const sources = finding.intelligenceSources.length;
38
+ const meta = [
39
+ c.dim(locationOf(finding)),
40
+ finding.ruleId ? c.dim(finding.ruleId) : "",
41
+ sources > 0 ? c.magenta(`${glyph.star} ${sources} ${sources === 1 ? "source" : "sources"}`) : "",
42
+ row.fix ? fixLabel(row.fix) : "",
43
+ c.dim(relativeTime(finding.createdAt)),
44
+ ]
45
+ .filter(Boolean)
46
+ .join(" ");
47
+ void width;
48
+ return [`${marker} ${severity} ${title}`, ` ${meta}`, ""];
49
+ }
50
+ function renderDetail(project, row, width) {
51
+ const finding = row.finding;
52
+ const body = Math.min(96, width - 4);
53
+ const lines = [];
54
+ const push = (value = "") => lines.push(value ? ` ${value}` : "");
55
+ push();
56
+ push(`${c.bold(finding.title)} ${severityColor(finding.severity)(displaySeverity(finding.severity))}`);
57
+ push();
58
+ const facts = [
59
+ locationOf(finding),
60
+ finding.ruleId ?? "",
61
+ finding.confidence !== null ? `confidence ${finding.confidence.toFixed(2)}` : "",
62
+ finding.symbol ? `in ${finding.symbol}` : "",
63
+ ].filter(Boolean);
64
+ push(c.dim(facts.join(" ")));
65
+ const refs = [
66
+ finding.cveId ? c.yellow(finding.cveId) : "",
67
+ finding.cwe ? c.yellow(finding.cwe) : "",
68
+ finding.category ?? "",
69
+ finding.state && finding.state !== "CANDIDATE" ? finding.state.toLowerCase() : "",
70
+ ].filter(Boolean);
71
+ if (refs.length > 0)
72
+ push(c.dim(refs.join(" ")));
73
+ if (finding.description) {
74
+ push();
75
+ for (const wrapped of wrapText(finding.description, body))
76
+ push(wrapped);
77
+ }
78
+ if (finding.vulnerableCode?.trim()) {
79
+ push();
80
+ push(c.dim("CODE"));
81
+ push();
82
+ const start = finding.startLine ?? 1;
83
+ finding.vulnerableCode
84
+ .split("\n")
85
+ .slice(0, 20)
86
+ .forEach((codeLine, index) => {
87
+ push(`${c.dim(String(start + index).padStart(5))} ${c.dim("|")} ${codeLine}`);
88
+ });
89
+ }
90
+ if (finding.dataflow) {
91
+ push();
92
+ push(c.dim("DATA FLOW"));
93
+ push();
94
+ push(`${c.dim("source")} ${finding.dataflow.sourceKind}`);
95
+ for (const step of finding.dataflow.steps ?? []) {
96
+ const where = step.location ? c.dim(`${step.location.file}:${step.location.startLine}`) : "";
97
+ push(` ${c.dim(glyph.arrow)} ${step.label} ${c.dim(step.role)} ${where}`);
98
+ }
99
+ push(`${c.dim("sink")} ${finding.dataflow.sinkKind}`);
100
+ if (finding.dataflow.ineffectiveSanitizers?.length) {
101
+ push();
102
+ push(c.yellow(`ineffective: ${finding.dataflow.ineffectiveSanitizers.join(", ")}`));
103
+ }
104
+ }
105
+ if (finding.intelligenceSources.length > 0) {
106
+ push();
107
+ push(c.dim("RESEARCH"));
108
+ push();
109
+ for (const source of finding.intelligenceSources) {
110
+ push(`${c.magenta(glyph.star)} ${c.bold(source.source)} ${source.title ?? "untitled"} ${c.dim(`${source.confidence}%`)}`);
111
+ for (const wrapped of wrapText(source.rationale, body - 2, " "))
112
+ push(c.dim(wrapped));
113
+ push(c.dim(` ${source.sourceUrl}`));
114
+ push();
115
+ }
116
+ }
117
+ if (finding.remediation?.summary || finding.remediation?.guidance) {
118
+ push();
119
+ push(c.dim("REMEDIATION"));
120
+ push();
121
+ for (const wrapped of wrapText(finding.remediation.summary ?? "", body))
122
+ push(wrapped);
123
+ if (finding.remediation.guidance && finding.remediation.guidance !== finding.remediation.summary) {
124
+ push();
125
+ for (const wrapped of wrapText(finding.remediation.guidance, body))
126
+ push(c.dim(wrapped));
127
+ }
128
+ }
129
+ for (const fixLine of renderFixSection(row.fix, width))
130
+ lines.push(fixLine);
131
+ const link = githubUrlFor(project, finding);
132
+ if (link) {
133
+ push(c.dim(link));
134
+ push();
135
+ }
136
+ return lines;
137
+ }
138
+ export async function observedCommand(globals, options) {
139
+ const session = await openSession(globals, { auth: true });
140
+ const { project } = await resolveLinkedProject(session, globals);
141
+ const query = {
142
+ limit: options.limit,
143
+ severity: options.severity,
144
+ category: options.category,
145
+ matched: options.onlyMatched ? true : options.matched,
146
+ };
147
+ const load = async () => {
148
+ const response = await session.client.findings(project.githubRepoId, query);
149
+ const fixes = await fixesFor(session, response.scanId);
150
+ return {
151
+ rows: sortRows(response.findings.map((finding) => ({ finding, fix: fixes.get(finding.id) ?? null }))),
152
+ scanId: response.scanId,
153
+ total: response.total,
154
+ hasMore: response.hasMore,
155
+ };
156
+ };
157
+ const first = await load();
158
+ const rows = first.rows;
159
+ const worst = rows.some((row) => row.finding.severity === "critical" || row.finding.severity === "high");
160
+ if (out.isJsonMode()) {
161
+ out.json({
162
+ repository: project.fullName,
163
+ scanId: first.scanId,
164
+ total: first.total,
165
+ hasMore: first.hasMore,
166
+ findings: rows.map((row) => ({ ...row.finding, fix: row.fix })),
167
+ });
168
+ return options.exitCode && worst ? 1 : 0;
169
+ }
170
+ if (out.isPiped()) {
171
+ for (const row of rows) {
172
+ out.line([
173
+ displaySeverity(row.finding.severity).toLowerCase(),
174
+ locationOf(row.finding),
175
+ row.finding.ruleId ?? "",
176
+ row.fix?.status ?? "no-fix",
177
+ row.finding.title,
178
+ ].join("\t"));
179
+ }
180
+ return options.exitCode && worst ? 1 : 0;
181
+ }
182
+ if (rows.length === 0) {
183
+ out.line();
184
+ if (!first.scanId) {
185
+ out.info(`${c.bold(project.fullName)} has not been scanned yet.`);
186
+ out.hint("Run cf scan.");
187
+ }
188
+ else if (options.onlyMatched) {
189
+ out.info(`No findings in ${c.bold(project.fullName)} are joined to research yet.`);
190
+ }
191
+ else {
192
+ out.success(`No findings in ${c.bold(project.fullName)}.`);
193
+ }
194
+ out.line();
195
+ return 0;
196
+ }
197
+ const counts = new Map();
198
+ for (const row of rows) {
199
+ const label = displaySeverity(row.finding.severity);
200
+ counts.set(label, (counts.get(label) ?? 0) + 1);
201
+ }
202
+ const matchedCount = rows.filter((row) => row.finding.intelligenceSources.length > 0).length;
203
+ await browse(rows, {
204
+ header: (visible) => {
205
+ const summary = [...counts.entries()]
206
+ .map(([label, count]) => severityColor(label.toLowerCase())(`${count} ${label.toLowerCase()}`))
207
+ .join(c.dim(" · "));
208
+ const scope = options.onlyMatched
209
+ ? `${matchedCount} of ${first.total} joined to research`
210
+ : `${visible.length} of ${first.total} ${first.total === 1 ? "finding" : "findings"}`;
211
+ return ["", ` ${c.bold(project.fullName)} ${c.dim(scope)}`, ` ${summary}`, ""];
212
+ },
213
+ renderRow,
214
+ renderDetail: (row, width) => renderDetail(project, row, width),
215
+ filterText: (row) => `${row.finding.title} ${row.finding.filePath} ${row.finding.ruleId ?? ""} ${row.finding.cwe ?? ""} ${row.finding.cveId ?? ""}`,
216
+ emptyMessage: "Nothing matches that filter.",
217
+ refresh: async () => (await load()).rows,
218
+ actions: [
219
+ ...fixActions(session, project, (row) => row ? { findingId: row.finding.id, fix: row.fix } : null),
220
+ {
221
+ key: "o",
222
+ label: "github",
223
+ run: (row) => {
224
+ if (!row)
225
+ return;
226
+ const url = githubUrlFor(project, row.finding);
227
+ if (url)
228
+ void open(url).catch(() => undefined);
229
+ },
230
+ },
231
+ {
232
+ key: "a",
233
+ label: (row) => {
234
+ const count = row?.finding.intelligenceSources.length ?? 0;
235
+ return count > 0 ? (count === 1 ? "research" : `research (${count})`) : null;
236
+ },
237
+ run: (row) => {
238
+ const source = row?.finding.intelligenceSources[0];
239
+ if (source)
240
+ void open(source.sourceUrl).catch(() => undefined);
241
+ },
242
+ },
243
+ ],
244
+ });
245
+ return options.exitCode && worst ? 1 : 0;
246
+ }
247
+ export function requireLimit(value) {
248
+ const parsed = Number.parseInt(value, 10);
249
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 1000) {
250
+ throw new UsageError("--limit must be a whole number between 1 and 1000.");
251
+ }
252
+ return parsed;
253
+ }
254
+ //# sourceMappingURL=observed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed.js","sourceRoot":"","sources":["../../src/commands/observed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Project } from "../core/types.js";
2
+ export declare function pickProject(projects: Project[], message: string): Promise<Project | null>;
3
+ //# sourceMappingURL=pick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../src/commands/pick.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAa/F"}
@@ -0,0 +1,18 @@
1
+ import { select } from "../ui/prompts.js";
2
+ import { relativeTime } from "../ui/format.js";
3
+ export async function pickProject(projects, message) {
4
+ if (projects.length === 0)
5
+ return null;
6
+ const chosen = await select({
7
+ message,
8
+ choices: projects.map((project) => ({
9
+ value: project.githubRepoId,
10
+ label: project.fullName,
11
+ hint: project.scan
12
+ ? `${project.scan.findingCount} findings, scanned ${relativeTime(project.scan.finishedAt ?? project.scan.createdAt)}`
13
+ : "never scanned",
14
+ })),
15
+ });
16
+ return projects.find((project) => project.githubRepoId === chosen) ?? null;
17
+ }
18
+ //# sourceMappingURL=pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/commands/pick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAmB,EAAE,OAAe;IACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO;QACP,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,YAAY;YAC3B,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAChB,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,sBAAsB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBACrH,CAAC,CAAC,eAAe;SACpB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type GlobalOptions } from "../core/session.js";
2
+ export declare function repoConnect(globals: GlobalOptions, target: string | undefined, options?: {
3
+ watch?: boolean;
4
+ }): Promise<number>;
5
+ export declare function repoList(globals: GlobalOptions): Promise<number>;
6
+ export declare function repoSetDefault(globals: GlobalOptions, target: string | undefined, options?: {
7
+ unset?: boolean;
8
+ }): Promise<number>;
9
+ export declare function repoDisconnect(globals: GlobalOptions, target: string | undefined, options?: {
10
+ account?: boolean;
11
+ }): Promise<number>;
12
+ //# sourceMappingURL=repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,aAAa,EAAgB,MAAM,oBAAoB,CAAC;AAgEnF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CA+GjB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDtE;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CA4DjB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,CAAC,CA6EjB"}