veracarto 0.1.6 → 0.1.7

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 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.6");
45145
+ program2.name("veracarto").description("Security findings, down to what matters").version("0.1.7");
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);