veracarto 0.1.6 → 0.1.8
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/cli/index.js +15 -10
- package/dist/cli/index.js.map +2 -2
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -42963,7 +42963,7 @@ var init_build5 = __esm({
|
|
|
42963
42963
|
});
|
|
42964
42964
|
|
|
42965
42965
|
// src/cli/ui/Detail.tsx
|
|
42966
|
-
function getFixCommands(item) {
|
|
42966
|
+
function getFixCommands(item, gcpProjectId) {
|
|
42967
42967
|
const meta = typeof item.metadata === "string" ? (() => {
|
|
42968
42968
|
try {
|
|
42969
42969
|
return JSON.parse(item.metadata);
|
|
@@ -42972,7 +42972,7 @@ function getFixCommands(item) {
|
|
|
42972
42972
|
}
|
|
42973
42973
|
})() : item.metadata || {};
|
|
42974
42974
|
const resource = item.affected_resource || "";
|
|
42975
|
-
const projectId = meta.projectId || meta.gcp_project_id || "YOUR_PROJECT_ID";
|
|
42975
|
+
const projectId = gcpProjectId || meta.projectId || meta.gcp_project_id || "YOUR_PROJECT_ID";
|
|
42976
42976
|
switch (item.playbook_id) {
|
|
42977
42977
|
case "gcp-firewall-broad":
|
|
42978
42978
|
return {
|
|
@@ -43038,7 +43038,7 @@ function getFixCommands(item) {
|
|
|
43038
43038
|
return null;
|
|
43039
43039
|
}
|
|
43040
43040
|
}
|
|
43041
|
-
function Detail({ item, slackTeamId, onBack, onApprove, onDismiss, onTierChange, onNoise }) {
|
|
43041
|
+
function Detail({ item, slackTeamId, gcpProjectId, onBack, onApprove, onDismiss, onTierChange, onNoise }) {
|
|
43042
43042
|
const [loading, setLoading] = (0, import_react31.useState)(false);
|
|
43043
43043
|
const [dismissMode, setDismissMode] = (0, import_react31.useState)(false);
|
|
43044
43044
|
const [dismissReason, setDismissReason] = (0, import_react31.useState)("");
|
|
@@ -43050,6 +43050,8 @@ function Detail({ item, slackTeamId, onBack, onApprove, onDismiss, onTierChange,
|
|
|
43050
43050
|
const [noiseReason, setNoiseReason] = (0, import_react31.useState)("");
|
|
43051
43051
|
const confidencePct = Math.round((item.confidence || 0) * 100);
|
|
43052
43052
|
const tierColor = TIER_COLORS2[item.tier] || "#888888";
|
|
43053
|
+
const fixCommands = getFixCommands(item, gcpProjectId);
|
|
43054
|
+
const [copied, setCopied] = (0, import_react31.useState)(false);
|
|
43053
43055
|
function getSuggestedRule() {
|
|
43054
43056
|
const resource = item.affected_resource || "unknown";
|
|
43055
43057
|
const category = (item.affected_resource_type || "").toUpperCase();
|
|
@@ -43080,6 +43082,11 @@ function Detail({ item, slackTeamId, onBack, onApprove, onDismiss, onTierChange,
|
|
|
43080
43082
|
if (input === "d" && !loading) {
|
|
43081
43083
|
setDismissMode(true);
|
|
43082
43084
|
}
|
|
43085
|
+
if (input === "c" && !loading && fixCommands) {
|
|
43086
|
+
clipboardy_default.writeSync(fixCommands.fix.join("\n"));
|
|
43087
|
+
setCopied(true);
|
|
43088
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
43089
|
+
}
|
|
43083
43090
|
if (input === "t" && !loading) {
|
|
43084
43091
|
setTierSelectMode(true);
|
|
43085
43092
|
}
|
|
@@ -43140,11 +43147,7 @@ function Detail({ item, slackTeamId, onBack, onApprove, onDismiss, onTierChange,
|
|
|
43140
43147
|
setLoading(false);
|
|
43141
43148
|
}
|
|
43142
43149
|
}
|
|
43143
|
-
return /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react31.default.createElement(Box_default, { borderStyle: "single", borderBottom: false, paddingX: 1, justifyContent: "space-between" }, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "\u2190 back"), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: tierColor, bold: true }, "T", item.tier), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, " \xB7 ", confidencePct, "%"))), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", borderTop: false, borderBottom: false, paddingX: 2, paddingY: 1 }, /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "white" }, item.title), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "RESOURCE"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.affected_resource_type || "unknown", " \xB7 ", item.affected_resource), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, item.is_production ? /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#f59e0b" }, "production") : /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "non-production"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#444444" }, " \xB7 "), item.is_internet_facing ? /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#f59e0b" }, "internet-facing") : /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "internal")), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "AGENT REASONING"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.agent_reasoning || item.description || "No reasoning available."), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "RECOMMENDED ACTION"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.recommended_action || "No recommendation."), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "BLAST RADIUS"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.blast_radius || "Unknown"), (() => {
|
|
43144
|
-
const cmds = getFixCommands(item);
|
|
43145
|
-
if (!cmds) return null;
|
|
43146
|
-
return /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "FIX COMMAND"), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", paddingX: 1 }, cmds.fix.map((line, i) => /* @__PURE__ */ import_react31.default.createElement(Text, { key: i, color: "#22c55e" }, line))), cmds.rollback.length > 0 && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "ROLLBACK"), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", paddingX: 1 }, cmds.rollback.map((line, i) => /* @__PURE__ */ import_react31.default.createElement(Text, { key: i, color: "#888888" }, line)))));
|
|
43147
|
-
})(), loading && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#22c55e" }, /* @__PURE__ */ import_react31.default.createElement(build_default2, { type: "dots" })), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, " executing..."))), resultMessage && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { color: resultMessage.startsWith("\u2713") ? "#22c55e" : "#ef4444" }, resultMessage)), dismissMode && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "Dismiss reason: "), /* @__PURE__ */ import_react31.default.createElement(
|
|
43150
|
+
return /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react31.default.createElement(Box_default, { borderStyle: "single", borderBottom: false, paddingX: 1, justifyContent: "space-between" }, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "\u2190 back"), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: tierColor, bold: true }, "T", item.tier), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, " \xB7 ", confidencePct, "%"))), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", borderTop: false, borderBottom: false, paddingX: 2, paddingY: 1 }, /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "white" }, item.title), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "RESOURCE"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.affected_resource_type || "unknown", " \xB7 ", item.affected_resource), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, item.is_production ? /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#f59e0b" }, "production") : /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "non-production"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#444444" }, " \xB7 "), item.is_internet_facing ? /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#f59e0b" }, "internet-facing") : /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "internal")), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "AGENT REASONING"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.agent_reasoning || item.description || "No reasoning available."), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "RECOMMENDED ACTION"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.recommended_action || "No recommendation."), /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "BLAST RADIUS"), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#cccccc" }, item.blast_radius || "Unknown"), fixCommands && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "FIX COMMAND"), copied ? /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#22c55e" }, " copied") : /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#444444" }, " [c] copy")), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", paddingX: 1 }, fixCommands.fix.map((line, i) => /* @__PURE__ */ import_react31.default.createElement(Text, { key: `fix-${i}`, color: "#22c55e" }, line)))), fixCommands && fixCommands.rollback.length > 0 && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { bold: true, color: "#888888" }, "ROLLBACK"), /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", borderStyle: "single", paddingX: 1 }, fixCommands.rollback.map((line, i) => /* @__PURE__ */ import_react31.default.createElement(Text, { key: `rb-${i}`, color: "#888888" }, line)))), loading && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#22c55e" }, /* @__PURE__ */ import_react31.default.createElement(build_default2, { type: "dots" })), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, " executing..."))), resultMessage && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Text, { color: resultMessage.startsWith("\u2713") ? "#22c55e" : "#ef4444" }, resultMessage)), dismissMode && /* @__PURE__ */ import_react31.default.createElement(import_react31.default.Fragment, null, /* @__PURE__ */ import_react31.default.createElement(Text, null, " "), /* @__PURE__ */ import_react31.default.createElement(Box_default, null, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "Dismiss reason: "), /* @__PURE__ */ import_react31.default.createElement(
|
|
43148
43151
|
build_default,
|
|
43149
43152
|
{
|
|
43150
43153
|
value: dismissReason,
|
|
@@ -43194,7 +43197,7 @@ function Detail({ item, slackTeamId, onBack, onApprove, onDismiss, onTierChange,
|
|
|
43194
43197
|
}
|
|
43195
43198
|
}
|
|
43196
43199
|
}
|
|
43197
|
-
)), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#444444" }, "[enter] submit [esc] cancel"))), /* @__PURE__ */ import_react31.default.createElement(Box_default, { borderStyle: "single", borderTop: false, paddingX: 1 }, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "[a] mark fixed [d] dismiss [n] noise [e] exception [t] tier [esc] back")));
|
|
43200
|
+
)), /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#444444" }, "[enter] submit [esc] cancel"))), /* @__PURE__ */ import_react31.default.createElement(Box_default, { borderStyle: "single", borderTop: false, paddingX: 1 }, /* @__PURE__ */ import_react31.default.createElement(Text, { color: "#888888" }, "[a] mark fixed [c] copy fix [d] dismiss [n] noise [e] exception [t] tier [esc] back")));
|
|
43198
43201
|
}
|
|
43199
43202
|
var import_react31, TIER_COLORS2, TIER_ITEMS;
|
|
43200
43203
|
var init_Detail = __esm({
|
|
@@ -43206,6 +43209,7 @@ var init_Detail = __esm({
|
|
|
43206
43209
|
await init_build5();
|
|
43207
43210
|
await init_build4();
|
|
43208
43211
|
init_open();
|
|
43212
|
+
init_clipboardy();
|
|
43209
43213
|
init_api();
|
|
43210
43214
|
TIER_COLORS2 = {
|
|
43211
43215
|
1: "#888888",
|
|
@@ -44526,6 +44530,7 @@ function Dashboard() {
|
|
|
44526
44530
|
{
|
|
44527
44531
|
item: selectedItem,
|
|
44528
44532
|
slackTeamId,
|
|
44533
|
+
gcpProjectId: status?.gcpProjectId,
|
|
44529
44534
|
onBack: () => {
|
|
44530
44535
|
setView("dashboard");
|
|
44531
44536
|
setSelectedItem(null);
|
|
@@ -45137,7 +45142,7 @@ var {
|
|
|
45137
45142
|
// src/cli/index.ts
|
|
45138
45143
|
init_config();
|
|
45139
45144
|
var program2 = new Command();
|
|
45140
|
-
program2.name("veracarto").description("Security findings, down to what matters").version("0.1.
|
|
45145
|
+
program2.name("veracarto").description("Security findings, down to what matters").version("0.1.8");
|
|
45141
45146
|
program2.command("init").description("Interactive onboarding wizard").option("--step <step>", "Jump to a specific step (gcp, github, slack)").action(async (opts) => {
|
|
45142
45147
|
const { runInit: runInit2 } = await init_init().then(() => init_exports);
|
|
45143
45148
|
await runInit2(opts.step);
|