← SonarQubeCONTENT HISTORY

Update to SonarQube

Snapshot Oct 28, 2026 · 12:32 UTC · version 2.7.0

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save SonarQube and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 23:13 UTC

a09533cc2d4a5dbed884353591ab8b6d61d3fb583ca797331af45d1c9484484e

After

Oct 28, 2026 · 12:32 UTC

6cea80a8da9052596520df33466190172aaaa75d08b168a7cd871e790948b374

Package file

Before

Sep 30, 2026 · 23:13 UTC

373

After

Oct 28, 2026 · 12:32 UTC

390

Package file

Before

Sep 30, 2026 · 23:13 UTC

{"sha256":"8856b2020a808546e2251001df245c9ec1327078faab8d04e0d6bb716bfa0826","size":620}

After

Oct 28, 2026 · 12:32 UTC

Not present

Package file

Before

Sep 30, 2026 · 23:13 UTC

{"sha256":"a65858d032e7281e50a197eba2a8d180e066f2aa7264402e04577db6b2d4a71c","size":764}

After

Oct 28, 2026 · 12:32 UTC

Not present

Compare saved observations

Download comparison JSON

scripts/setup.js

− removed · + added

--- before
+++ after
@@ -1,165 +1,165 @@
-#!/usr/bin/env node
-"use strict";
-
-const fs = require("node:fs");
-const path = require("node:path");
-const os = require("node:os");
-
-const CLAUDE_INTEGRATION_ID = "claude-code";
-
-const HOOK_DISPLAY_NAMES = {
-  "sonar-secrets": "Secrets Detection",
-  "sonar-sqaa": "Vortex analysis",
-  "sonar-secrets-hooks": "Secrets Detection",
-  "sonar-sqaa-hook": "Vortex analysis",
-};
-
-const DECLARATIVE_HOOK_FEATURE_IDS = new Set([
-  "sonar-secrets-hooks",
-  "sonar-sqaa-hook",
-]);
-
-// sonarqube-cli merged the standalone `sonar-sqaa-hook` container into the
-// shared Vortex container for Claude; the analysis hook now shows up as this
-// subfeature nested under `vortex-claude` instead of its own top-level id.
-const CLAUDE_VORTEX_FEATURE_ID = "vortex-claude";
-const VORTEX_ANALYSIS_SUBFEATURE_ID = "sqaa-posttooluse";
-
-function hasMergedVortexAnalysisHook(feature) {
-  return (
-    feature?.featureId === CLAUDE_VORTEX_FEATURE_ID &&
-    Array.isArray(feature.subfeatures) &&
-    feature.subfeatures.some(
-      (subfeature) => subfeature?.featureId === VORTEX_ANALYSIS_SUBFEATURE_ID
-    )
-  );
-}
-
-function hasSonarCli() {
-  const envPath = process.env.PATH || "";
-  const dirs = envPath.split(path.delimiter);
-  const exts =
-    process.platform === "win32"
-      ? (process.env.PATHEXT || ".COM;.EXE;.BAT;.CMD").split(";")
-      : [""];
-
-  for (const dir of dirs) {
-    for (const ext of exts) {
-      try {
-        fs.accessSync(path.join(dir, "sonar" + ext), fs.constants.F_OK);
-        return true;
-      } catch {
-        // not in this directory
-      }
-    }
-  }
-  return false;
-}
-
-function readState() {
-  const statePath = path.join(
-    os.homedir(),
-    ".sonar",
-    "sonarqube-cli",
-    "state.json"
-  );
-  try {
-    return JSON.parse(fs.readFileSync(statePath, "utf8"));
-  } catch {
-    return null;
-  }
-}
-
-function canonicalPath(p) {
-  try {
-    return fs.realpathSync.native(p);
-  } catch {
-    return path.resolve(p);
-  }
-}
-
-function samePath(a, b) {
-  if (!a || !b) return false;
-  const caseInsensitive =
-    process.platform === "darwin" || process.platform === "win32";
-  const norm = (p) => {
-    const c = canonicalPath(p);
-    return caseInsensitive ? c.toLowerCase() : c;
-  };
-  return norm(a) === norm(b);
-}
-
-function featureAppliesToCwd(feature, cwd) {
-  if (feature?.scope === "global") {
-    return true;
-  }
-  if (feature?.scope === "project") {
-    return samePath(cwd, feature.targetRoot);
-  }
-  return false;
-}
-
-function collectLegacyHookNames(state, cwd) {
-  const claudeHooks = (state?.agentExtensions ?? []).filter(
-    (entry) =>
-      entry?.agentId === CLAUDE_INTEGRATION_ID &&
-      entry.kind === "hook" &&
-      typeof entry.name === "string"
-  );
-  const globalHooks = claudeHooks.filter((entry) => entry.global === true);
-  const localHooks = claudeHooks.filter((entry) =>
-    samePath(cwd, entry.projectRoot)
-  );
-  return [...globalHooks, ...localHooks].map((entry) => entry.name);
-}
-
-function collectDeclarativeHookNames(state, cwd) {
-  const claudeIntegration = (state?.integrations?.installed ?? []).find(
-    (entry) => entry?.integrationId === CLAUDE_INTEGRATION_ID
-  );
-  if (!claudeIntegration) {
-    return [];
-  }
-
-  return (claudeIntegration.features ?? [])
-    .filter((feature) => featureAppliesToCwd(feature, cwd))
-    .filter(
-      (feature) =>
-        (typeof feature?.featureId === "string" &&
-          DECLARATIVE_HOOK_FEATURE_IDS.has(feature.featureId)) ||
-        hasMergedVortexAnalysisHook(feature)
-    )
-    .map((feature) =>
-      hasMergedVortexAnalysisHook(feature) ? "sonar-sqaa-hook" : feature.featureId
-    );
-}
-
-function collectInstalledHookNames(state, cwd) {
-  const names = [
-    ...collectLegacyHookNames(state, cwd),
-    ...collectDeclarativeHookNames(state, cwd),
-  ];
-  return new Set(names);
-}
-
-const cwd = process.cwd();
-const state = readState();
-const sonarOk = hasSonarCli();
-const installed = collectInstalledHookNames(state, cwd);
-
-const hookList = Array.from(
-  new Set(Array.from(installed).map((name) => HOOK_DISPLAY_NAMES[name] || name))
-).join(", ");
-
-const lines = [
-  "SonarQube plugin initialised.",
-  "  sonarqube-cli: " +
-    (sonarOk ? "✓ found" : "✗ not found — run /sonarqube:sonar-integrate"),
-  "  SonarQube hooks: " +
-    (installed.size > 0
-      ? "✓ " + hookList
-      : "✗ no hooks installed — run /sonarqube:sonar-integrate"),
-];
-
-process.stdout.write(JSON.stringify({ systemMessage: lines.join("\n") }) + "\n");
-process.exit(0);
+#!/usr/bin/env node
+"use strict";
+
+const fs = require("node:fs");
+const path = require("node:path");
+const os = require("node:os");
+
+const CLAUDE_INTEGRATION_ID = "claude-code";
+
+const HOOK_DISPLAY_NAMES = {
+  "sonar-secrets": "Secrets Detection",
+  "sonar-sqaa": "Vortex analysis",
+  "sonar-secrets-hooks": "Secrets Detection",
+  "sonar-sqaa-hook": "Vortex analysis",
+};
+
+const DECLARATIVE_HOOK_FEATURE_IDS = new Set([
+  "sonar-secrets-hooks",
+  "sonar-sqaa-hook",
+]);
+
+// sonarqube-cli merged the standalone `sonar-sqaa-hook` container into the
+// shared Vortex container for Claude; the analysis hook now shows up as this
+// subfeature nested under `vortex-claude` instead of its own top-level id.
+const CLAUDE_VORTEX_FEATURE_ID = "vortex-claude";
+const VORTEX_ANALYSIS_SUBFEATURE_ID = "sqaa-posttooluse";
+
+function hasMergedVortexAnalysisHook(feature) {
+  return (
+    feature?.featureId === CLAUDE_VORTEX_FEATURE_ID &&
+    Array.isArray(feature.subfeatures) &&
+    feature.subfeatures.some(
+      (subfeature) => subfeature?.featureId === VORTEX_ANALYSIS_SUBFEATURE_ID
+    )
+  );
+}
+
+function hasSonarCli() {
+  const envPath = process.env.PATH || "";
+  const dirs = envPath.split(path.delimiter);
+  const exts =
+    process.platform === "win32"
+      ? (process.env.PATHEXT || ".COM;.EXE;.BAT;.CMD").split(";")
+      : [""];
+
+  for (const dir of dirs) {
+    for (const ext of exts) {
+      try {
+        fs.accessSync(path.join(dir, "sonar" + ext), fs.constants.F_OK);
+        return true;
+      } catch {
+        // not in this directory
+      }
+    }
+  }
+  return false;
+}
+
+function readState() {
+  const statePath = path.join(
+    os.homedir(),
+    ".sonar",
+    "sonarqube-cli",
+    "state.json"
+  );
+  try {
+    return JSON.parse(fs.readFileSync(statePath, "utf8"));
+  } catch {
+    return null;
+  }
+}
+
+function canonicalPath(p) {
+  try {
+    return fs.realpathSync.native(p);
+  } catch {
+    return path.resolve(p);
+  }
+}
+
+function samePath(a, b) {
+  if (!a || !b) return false;
+  const caseInsensitive =
+    process.platform === "darwin" || process.platform === "win32";
+  const norm = (p) => {
+    const c = canonicalPath(p);
+    return caseInsensitive ? c.toLowerCase() : c;
+  };
+  return norm(a) === norm(b);
+}
+
+function featureAppliesToCwd(feature, cwd) {
+  if (feature?.scope === "global") {
+    return true;
+  }
+  if (feature?.scope === "project") {
+    return samePath(cwd, feature.targetRoot);
+  }
+  return false;
+}
+
+function collectLegacyHookNames(state, cwd) {
+  const claudeHooks = (state?.agentExtensions ?? []).filter(
+    (entry) =>
+      entry?.agentId === CLAUDE_INTEGRATION_ID &&
+      entry.kind === "hook" &&
+      typeof entry.name === "string"
+  );
+  const globalHooks = claudeHooks.filter((entry) => entry.global === true);
+  const localHooks = claudeHooks.filter((entry) =>
+    samePath(cwd, entry.projectRoot)
+  );
+  return [...globalHooks, ...localHooks].map((entry) => entry.name);
+}
+
+function collectDeclarativeHookNames(state, cwd) {
+  const claudeIntegration = (state?.integrations?.installed ?? []).find(
+    (entry) => entry?.integrationId === CLAUDE_INTEGRATION_ID
+  );
+  if (!claudeIntegration) {
+    return [];
+  }
+
+  return (claudeIntegration.features ?? [])
+    .filter((feature) => featureAppliesToCwd(feature, cwd))
+    .filter(
+      (feature) =>
+        (typeof feature?.featureId === "string" &&
+          DECLARATIVE_HOOK_FEATURE_IDS.has(feature.featureId)) ||
+        hasMergedVortexAnalysisHook(feature)
+    )
+    .map((feature) =>
+      hasMergedVortexAnalysisHook(feature) ? "sonar-sqaa-hook" : feature.featureId
+    );
+}
+
+function collectInstalledHookNames(state, cwd) {
+  const names = [
+    ...collectLegacyHookNames(state, cwd),
+    ...collectDeclarativeHookNames(state, cwd),
+  ];
+  return new Set(names);
+}
+
+const cwd = process.cwd();
+const state = readState();
+const sonarOk = hasSonarCli();
+const installed = collectInstalledHookNames(state, cwd);
+
+const hookList = Array.from(
+  new Set(Array.from(installed).map((name) => HOOK_DISPLAY_NAMES[name] || name))
+).join(", ");
+
+const lines = [
+  "SonarQube plugin initialised.",
+  "  sonarqube-cli: " +
+    (sonarOk ? "✓ found" : "✗ not found — run /sonarqube:sonar-integrate"),
+  "  SonarQube hooks: " +
+    (installed.size > 0
+      ? "✓ " + hookList
+      : "✗ no hooks installed — run /sonarqube:sonar-integrate"),
+];
+
+process.stdout.write(JSON.stringify({ systemMessage: lines.join("\n") }) + "\n");
+process.exit(0);
Full technical diff · 76 changed fields

changed /files/.agents~1plugins~1marketplace.json/sha256

BEFORE
"a09533cc2d4a5dbed884353591ab8b6d61d3fb583ca797331af45d1c9484484e"
AFTER
"6cea80a8da9052596520df33466190172aaaa75d08b168a7cd871e790948b374"

changed /files/.agents~1plugins~1marketplace.json/size

BEFORE
373
AFTER
390

removed /files/.claude-plugin~1marketplace.json

BEFORE
{
  "sha256": "8856b2020a808546e2251001df245c9ec1327078faab8d04e0d6bb716bfa0826",
  "size": 620
}
AFTER
Field is absent

removed /files/.claude-plugin~1plugin.json

BEFORE
{
  "sha256": "a65858d032e7281e50a197eba2a8d180e066f2aa7264402e04577db6b2d4a71c",
  "size": 764
}
AFTER
Field is absent

removed /files/.codex-plugin~1assets~1composer-icon-dark.png

BEFORE
{
  "sha256": "fda3a22b9fa041ea7630ae6ac263da36a54ab5172d046102cd92693025338cb6",
  "size": 7705
}
AFTER
Field is absent

removed /files/.codex-plugin~1assets~1composer-icon.png

BEFORE
{
  "sha256": "89048de870cebf93c7d7660ff434259da48f029536840d6c3d533678047ad84d",
  "size": 8290
}
AFTER
Field is absent

removed /files/.codex-plugin~1assets~1logo-dark.png

BEFORE
{
  "sha256": "fda3a22b9fa041ea7630ae6ac263da36a54ab5172d046102cd92693025338cb6",
  "size": 7705
}
AFTER
Field is absent

removed /files/.codex-plugin~1assets~1logo.png

BEFORE
{
  "sha256": "89048de870cebf93c7d7660ff434259da48f029536840d6c3d533678047ad84d",
  "size": 8290
}
AFTER
Field is absent

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"5229a119fed64d116bdc406401095c68e28f2474c26cf14d2c794190328b3271"
AFTER
"0d619507086a4ceaf2c88a6f972e8424770643dc46110a146ab5b0610662beb6"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
1943
AFTER
1931

changed /files/.cursor-plugin~1marketplace.json/sha256

BEFORE
"3985ef713f5159cd69b3fb319326fab3ecf3d9a44e91d26dbe88b15ec5506b06"
AFTER
"3baad4f8b9c9f49d6861d951bbc2b3095ec57e05ce4a2f5986ae914f9c5cffff"

changed /files/.cursor-plugin~1marketplace.json/size

BEFORE
678
AFTER
696

changed /files/.cursor-plugin~1plugin.json/sha256

BEFORE
"d3b768d5ceb52b74dc660a0a342b1565d7ff66f060c548a844f200addf196854"
AFTER
"be6184aff85de47105afa9abb8f5473239d7a6ea0bda630ec4652c308043a7d4"

changed /files/.cursor-plugin~1plugin.json/size

BEFORE
785
AFTER
806

added /files/.factory-plugin~1marketplace.json

BEFORE
Field was absent
AFTER
{
  "sha256": "3baad4f8b9c9f49d6861d951bbc2b3095ec57e05ce4a2f5986ae914f9c5cffff",
  "size": 696
}

added /files/.factory-plugin~1plugin.json

BEFORE
Field was absent
AFTER
{
  "sha256": "7711e618ee18689b86f4498d5274e5cef9f7c94d764cd6e7d55cfee98c1a4667",
  "size": 743
}

added /files/.gitar~1review~1squad-specific.md

BEFORE
Field was absent
AFTER
{
  "sha256": "04a213f1720919e47d8204ba8674c46c21c96c247a5fa21c1ca800a7ac65429d",
  "size": 184
}

changed /files/.github~1CODEOWNERS/sha256

BEFORE
"3ecbd4a4c501695a25651bf18274da43715ed4f7581ef2d903ee96f6eeea5193"
AFTER
"b04fa2dd20bddfa5b9f12196a9160fee5e8cbfc2de8ddb641f69fc3bcf779258"

changed /files/.github~1CODEOWNERS/size

BEFORE
210
AFTER
212

changed /files/.github~1plugin~1marketplace.json/sha256

BEFORE
"8856b2020a808546e2251001df245c9ec1327078faab8d04e0d6bb716bfa0826"
AFTER
"f34769e79e1156d913c6649000c5abc989b295f67de0c41f4ae12d94e413bf9c"

changed /files/.github~1plugin~1marketplace.json/size

BEFORE
620
AFTER
638

removed /files/.github~1plugin~1plugin.json

BEFORE
{
  "sha256": "9cb2627036a4b8f288a6ef5c048cbc06c84c4536ebe5db76a30b8c17d8c88a04",
  "size": 724
}
AFTER
Field is absent

changed /files/.github~1renovate.json/sha256

BEFORE
"c049351f0cb07629effa5dcf2334668c4a901633d7d75ffc55f586863a2704ee"
AFTER
"538a39ffa211379ba2059e58e30a7fdc4d9819019cc69890e2d208bded2cf0e9"

changed /files/.github~1renovate.json/size

BEFORE
142
AFTER
148

changed /files/.gitignore/sha256

BEFORE
"3ceeb56b31ab247687626eb9530979e2d5e1249ee7120fd0018374f6fd0a1515"
AFTER
"fad4bf46906c363b47c7cb8bc60b8c2ded6935616fc444dea595e1232c082188"

changed /files/.gitignore/size

BEFORE
173
AFTER
193

changed /files/GEMINI.md/sha256

BEFORE
"b0497bcfd96bb530e3bed5fa44cb3b5d9d0717a724e3e7e6de65a9467cbad35b"
AFTER
"7d9ee879a2de3a5f89226db9b3bca17bb93118089debc79e5061284ad84d7cea"

changed /files/GEMINI.md/size

BEFORE
5446
AFTER
5964

changed /files/LICENSE/sha256

BEFORE
"5ed3eff27f4bbbc595e91b06981eb3eee50fc3f7e7ca04c3fdb2c20f03569bd1"
AFTER
"cea2f0445fc9b53f874731b9f0adc99bab422781060253831dccd263d4f525b7"

changed /files/LICENSE/size

BEFORE
9678
AFTER
9861

changed /files/README.md/sha256

BEFORE
"ecd60ee03bb8ac89ae20025f431f32f1e2f7edc8b9df3a6e75ba8dc70f3b5871"
AFTER
"2600bd74c4ab36236c3c26c50c23c3b7da068e8b5df9bfeb6f83c9ba892a8173"

changed /files/README.md/size

BEFORE
10219
AFTER
11589

changed /files/SECURITY.md/sha256

BEFORE
"ff94ac6750964ab542a0884019962bda31fee27450a356458e188d331fc18411"
AFTER
"1cf2f72f07aa7c2f25cff7d976b7369debfd28bec7d05e7a4c36aff7ffad8dae"

changed /files/SECURITY.md/size

BEFORE
1188
AFTER
1205

changed /files/agents~1sonarqube-reviewer.agent.md/sha256

BEFORE
"b34a4fe6a1717b180bcd09da293571af6d7b23afa83d8c3244de6b447ea30de8"
AFTER
"1f5bf9e76b8b1a12f3c9bd4f34dffd903cdf9033653a5b1d48f88f73d1cbbbff"

changed /files/agents~1sonarqube-reviewer.agent.md/size

BEFORE
4162
AFTER
4218

changed /files/assets~1logo.svg/sha256

BEFORE
"f229ce40967152b9f6ec6bab2b4989cf65bb3d723c044fd3a9945db58a686028"
AFTER
"93de9248234e5a66dae098c96a2fdec382d9f92a50521c02ab600d10e2220d24"

changed /files/assets~1logo.svg/size

BEFORE
19688
AFTER
19694

changed /files/claude-hooks~1hooks.json/sha256

BEFORE
"ca69a9b5a1f3f0b5bc07b29490743c66ce69ed022e0717700743cc2084946fdf"
AFTER
"7ff6f51b4ae187fa29929e7974c33b0e13f81509318ec2ad315188cd2a6f98f4"

changed /files/claude-hooks~1hooks.json/size

BEFORE
272
AFTER
288

added /files/droids~1sonarqube-reviewer.md

BEFORE
Field was absent
AFTER
{
  "sha256": "5e2d13df670ae174e54fd7236e9b043ba75cf16629cabd85253e7e796c0122d1",
  "size": 4145
}

changed /files/gemini-extension.json/sha256

BEFORE
"2c3cf2ab933033957dec14f07bb3e69c9a53bafc907a95aa7819f90e1e8def75"
AFTER
"80f2b6d706161088ac08418110a6dad12830438fd553706b88a18a9dfa675ca1"

changed /files/gemini-extension.json/size

BEFORE
506
AFTER
519

changed /files/kiro-power~1POWER.md/sha256

BEFORE
"7152e9aee8174f2295a801ad906b26c6b30fd3de7a4266b611c79576e5b1979e"
AFTER
"c79c774cbf61cb4d32ad8ba92bc203cd090691512baa63c68c6b5e6fc45e9a04"

changed /files/kiro-power~1POWER.md/size

BEFORE
13913
AFTER
17228

changed /files/kiro-power~1mcp.json/sha256

BEFORE
"9fc1ce60f5774b42ee805b390a43405536e51401e3e33a19dce204fe6c71497e"
AFTER
"70a721057c9fc3c0f471d2b78da0ebea3a1e7b3efe507807daa2d7f1fb361256"

changed /files/kiro-power~1mcp.json/size

BEFORE
123
AFTER
134

changed /files/mcp.json/sha256

BEFORE
"2b3827a30692ba8d188040e90f4d51bf10c0de900ab3889a7fe2fce4ee66ef0d"
AFTER
"7d8ad6f6b19ec913068766078ae641e244f652007763f14692b5da0d0f79e983"

changed /files/mcp.json/size

BEFORE
106
AFTER
114

changed /files/mcp_config.json/sha256

BEFORE
"2b3827a30692ba8d188040e90f4d51bf10c0de900ab3889a7fe2fce4ee66ef0d"
AFTER
"7d8ad6f6b19ec913068766078ae641e244f652007763f14692b5da0d0f79e983"

changed /files/mcp_config.json/size

BEFORE
106
AFTER
114

changed /files/plugin.json/sha256

BEFORE
"9cb2627036a4b8f288a6ef5c048cbc06c84c4536ebe5db76a30b8c17d8c88a04"
AFTER
"c265b20d5a2ac208735463446d1dbbe21f14fb784496a2cb83b4f52a20545455"

changed /files/plugin.json/size

BEFORE
724
AFTER
819

changed /files/rules~1sonarqube.md/sha256

BEFORE
"78b75a99020ce403ea3d4b43d569d4e224f745a9ca1a94d76d11fe03538da870"
AFTER
"2d76d7ae03d0497a3cb1dba072d3fc3d831b763840bac24eb3fd773b7d89384d"

changed /files/rules~1sonarqube.md/size

BEFORE
5698
AFTER
6217

changed /files/scripts~1setup.js/sha256

BEFORE
"b96ca90e1ee30db9b629224418c9345abe5a56f1496f026dcca321a641bd49d0"
AFTER
"e825ba6bc55ff85ca3d2ff5aec9dd09060d8c0d94a583600d89fdf0ea28c0aed"

changed /files/scripts~1setup.js/size

BEFORE
4445
AFTER
4610

changed /files/skills~1sonar-analyze~1SKILL.md/sha256

BEFORE
"575142711c38ff1d50b2b74c5de9a1be19cb050bd58c0a562716ac2779e0c87b"
AFTER
"a66cf0e93a6a91de2e2e25bec9c7d7cd75a9278963be03f4ba46efa04d5d698c"

changed /files/skills~1sonar-analyze~1SKILL.md/size

BEFORE
7380
AFTER
7507

changed /files/skills~1sonar-coverage~1SKILL.md/sha256

BEFORE
"cffca8cab282592be0c786566e7ca9828d5fa3d68e658717a9734591a58814a1"
AFTER
"5efc9211a9e636a4fd5b9e810566e7c92e0cd6047a1ab1cb3f641553504fbf39"

changed /files/skills~1sonar-coverage~1SKILL.md/size

BEFORE
8252
AFTER
8405

changed /files/skills~1sonar-dependency-risks~1SKILL.md/sha256

BEFORE
"c793c038e36df5f3a4342a79c6e486d797a0873cac22ca54a289df1222a0e4d0"
AFTER
"4e349db17550cfef5034bd4d0276c9abbfc560d36946f3cce0829f064bbe8b80"

changed /files/skills~1sonar-dependency-risks~1SKILL.md/size

BEFORE
7594
AFTER
7805

changed /files/skills~1sonar-duplication~1SKILL.md/sha256

BEFORE
"a73546e05609daf1d47068e2852590c7ae8527e454443c61dc25ffcc5dec46a3"
AFTER
"aebbc10006aff2ef5f35930d3f32895648e7467da88b82831df176fdce077f9e"

changed /files/skills~1sonar-duplication~1SKILL.md/size

BEFORE
9779
AFTER
9943

changed /files/skills~1sonar-fix-issue~1SKILL.md/sha256

BEFORE
"6b57ea6a2b6348b53dc20c0bbe79e27e4fd8520d67c30f1139d919f285bced74"
AFTER
"77e094ac73581cd51db70d01f879fceb0a52fddcd9f56448845f23f831e08a53"

changed /files/skills~1sonar-fix-issue~1SKILL.md/size

BEFORE
2210
AFTER
2269

changed /files/skills~1sonar-integrate~1SKILL.md/sha256

BEFORE
"a094f03868d5601f21e462612241cfd23a01a63a0e25dfdc9a9e830a8d1ace5d"
AFTER
"4e3a0104ad2db6334a7f5bfe9ce84ea7acee5f6951ffe00012f3dfb2ba39078a"

changed /files/skills~1sonar-integrate~1SKILL.md/size

BEFORE
15018
AFTER
13390

changed /files/skills~1sonar-list-issues~1SKILL.md/sha256

BEFORE
"5dfc6cc08df66a4a0ca5f25c1f3b5a3e89266daca5acea33493341fedcd92a9e"
AFTER
"f1457b41208c0a2659c48762df19eccc62fd286fb29aa7b351c68d43430f5a8d"

changed /files/skills~1sonar-list-issues~1SKILL.md/size

BEFORE
6325
AFTER
6441

changed /files/skills~1sonar-list-projects~1SKILL.md/sha256

BEFORE
"b13d7d8a62db78098d7a0577cee3952031ce791f496ce348436f5dd9de3685a3"
AFTER
"7a331be7cce7b216f04081807e60d3887598babed47ab3ad404b12fd14801a91"

changed /files/skills~1sonar-list-projects~1SKILL.md/size

BEFORE
2977
AFTER
3058

changed /files/skills~1sonar-quality-gate~1SKILL.md/sha256

BEFORE
"a10642dbea25b0c4fa724581af91bf80e7b84d61f8db470e8ef99bda03e418df"
AFTER
"956081643e82f3c669baf6bde464ab5b47ac55706f2201c63e9e76ba8df9f5fa"

changed /files/skills~1sonar-quality-gate~1SKILL.md/size

BEFORE
16412
AFTER
16644

added /files/skills~1sonar-triage-dependency-risks~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "14a68c0cad806bdac98710a2ba199c05f21918a2036a4449ff47a8b5d31b72ba",
  "size": 11804
}
Full snapshot data
{
  "files": {
    ".agents/plugins/marketplace.json": {
      "sha256": "6cea80a8da9052596520df33466190172aaaa75d08b168a7cd871e790948b374",
      "size": 390
    },
    ".codex-plugin/plugin.json": {
      "sha256": "0d619507086a4ceaf2c88a6f972e8424770643dc46110a146ab5b0610662beb6",
      "size": 1931
    },
    ".cursor-plugin/marketplace.json": {
      "sha256": "3baad4f8b9c9f49d6861d951bbc2b3095ec57e05ce4a2f5986ae914f9c5cffff",
      "size": 696
    },
    ".cursor-plugin/plugin.json": {
      "sha256": "be6184aff85de47105afa9abb8f5473239d7a6ea0bda630ec4652c308043a7d4",
      "size": 806
    },
    ".factory-plugin/marketplace.json": {
      "sha256": "3baad4f8b9c9f49d6861d951bbc2b3095ec57e05ce4a2f5986ae914f9c5cffff",
      "size": 696
    },
    ".factory-plugin/plugin.json": {
      "sha256": "7711e618ee18689b86f4498d5274e5cef9f7c94d764cd6e7d55cfee98c1a4667",
      "size": 743
    },
    ".gitar/review/squad-specific.md": {
      "sha256": "04a213f1720919e47d8204ba8674c46c21c96c247a5fa21c1ca800a7ac65429d",
      "size": 184
    },
    ".github/CODEOWNERS": {
      "sha256": "b04fa2dd20bddfa5b9f12196a9160fee5e8cbfc2de8ddb641f69fc3bcf779258",
      "size": 212
    },
    ".github/plugin/marketplace.json": {
      "sha256": "f34769e79e1156d913c6649000c5abc989b295f67de0c41f4ae12d94e413bf9c",
      "size": 638
    },
    ".github/renovate.json": {
      "sha256": "538a39ffa211379ba2059e58e30a7fdc4d9819019cc69890e2d208bded2cf0e9",
      "size": 148
    },
    ".gitignore": {
      "sha256": "fad4bf46906c363b47c7cb8bc60b8c2ded6935616fc444dea595e1232c082188",
      "size": 193
    },
    "GEMINI.md": {
      "sha256": "7d9ee879a2de3a5f89226db9b3bca17bb93118089debc79e5061284ad84d7cea",
      "size": 5964
    },
    "LICENSE": {
      "sha256": "cea2f0445fc9b53f874731b9f0adc99bab422781060253831dccd263d4f525b7",
      "size": 9861
    },
    "README.md": {
      "sha256": "2600bd74c4ab36236c3c26c50c23c3b7da068e8b5df9bfeb6f83c9ba892a8173",
      "size": 11589
    },
    "SECURITY.md": {
      "sha256": "1cf2f72f07aa7c2f25cff7d976b7369debfd28bec7d05e7a4c36aff7ffad8dae",
      "size": 1205
    },
    "agents/sonarqube-reviewer.agent.md": {
      "sha256": "1f5bf9e76b8b1a12f3c9bd4f34dffd903cdf9033653a5b1d48f88f73d1cbbbff",
      "size": 4218
    },
    "assets/logo-dark.png": {
      "sha256": "fda3a22b9fa041ea7630ae6ac263da36a54ab5172d046102cd92693025338cb6",
      "size": 7705
    },
    "assets/logo.png": {
      "sha256": "89048de870cebf93c7d7660ff434259da48f029536840d6c3d533678047ad84d",
      "size": 8290
    },
    "assets/logo.svg": {
      "sha256": "93de9248234e5a66dae098c96a2fdec382d9f92a50521c02ab600d10e2220d24",
      "size": 19694
    },
    "claude-hooks/hooks.json": {
      "sha256": "7ff6f51b4ae187fa29929e7974c33b0e13f81509318ec2ad315188cd2a6f98f4",
      "size": 288
    },
    "droids/sonarqube-reviewer.md": {
      "sha256": "5e2d13df670ae174e54fd7236e9b043ba75cf16629cabd85253e7e796c0122d1",
      "size": 4145
    },
    "gemini-extension.json": {
      "sha256": "80f2b6d706161088ac08418110a6dad12830438fd553706b88a18a9dfa675ca1",
      "size": 519
    },
    "kiro-power/POWER.md": {
      "sha256": "c79c774cbf61cb4d32ad8ba92bc203cd090691512baa63c68c6b5e6fc45e9a04",
      "size": 17228
    },
    "kiro-power/mcp.json": {
      "sha256": "70a721057c9fc3c0f471d2b78da0ebea3a1e7b3efe507807daa2d7f1fb361256",
      "size": 134
    },
    "mcp.json": {
      "sha256": "7d8ad6f6b19ec913068766078ae641e244f652007763f14692b5da0d0f79e983",
      "size": 114
    },
    "mcp_config.json": {
      "sha256": "7d8ad6f6b19ec913068766078ae641e244f652007763f14692b5da0d0f79e983",
      "size": 114
    },
    "plugin.json": {
      "sha256": "c265b20d5a2ac208735463446d1dbbe21f14fb784496a2cb83b4f52a20545455",
      "size": 819
    },
    "rules/sonarqube.md": {
      "sha256": "2d76d7ae03d0497a3cb1dba072d3fc3d831b763840bac24eb3fd773b7d89384d",
      "size": 6217
    },
    "scripts/setup.js": {
      "sha256": "e825ba6bc55ff85ca3d2ff5aec9dd09060d8c0d94a583600d89fdf0ea28c0aed",
      "size": 4610
    },
    "skills/sonar-analyze/SKILL.md": {
      "sha256": "a66cf0e93a6a91de2e2e25bec9c7d7cd75a9278963be03f4ba46efa04d5d698c",
      "size": 7507
    },
    "skills/sonar-coverage/SKILL.md": {
      "sha256": "5efc9211a9e636a4fd5b9e810566e7c92e0cd6047a1ab1cb3f641553504fbf39",
      "size": 8405
    },
    "skills/sonar-dependency-risks/SKILL.md": {
      "sha256": "4e349db17550cfef5034bd4d0276c9abbfc560d36946f3cce0829f064bbe8b80",
      "size": 7805
    },
    "skills/sonar-duplication/SKILL.md": {
      "sha256": "aebbc10006aff2ef5f35930d3f32895648e7467da88b82831df176fdce077f9e",
      "size": 9943
    },
    "skills/sonar-fix-issue/SKILL.md": {
      "sha256": "77e094ac73581cd51db70d01f879fceb0a52fddcd9f56448845f23f831e08a53",
      "size": 2269
    },
    "skills/sonar-integrate/SKILL.md": {
      "sha256": "4e3a0104ad2db6334a7f5bfe9ce84ea7acee5f6951ffe00012f3dfb2ba39078a",
      "size": 13390
    },
    "skills/sonar-list-issues/SKILL.md": {
      "sha256": "f1457b41208c0a2659c48762df19eccc62fd286fb29aa7b351c68d43430f5a8d",
      "size": 6441
    },
    "skills/sonar-list-projects/SKILL.md": {
      "sha256": "7a331be7cce7b216f04081807e60d3887598babed47ab3ad404b12fd14801a91",
      "size": 3058
    },
    "skills/sonar-quality-gate/SKILL.md": {
      "sha256": "956081643e82f3c669baf6bde464ab5b47ac55706f2201c63e9e76ba8df9f5fa",
      "size": 16644
    },
    "skills/sonar-triage-dependency-risks/SKILL.md": {
      "sha256": "14a68c0cad806bdac98710a2ba199c05f21918a2036a4449ff47a8b5d31b72ba",
      "size": 11804
    }
  }
}

SHA-256 of public snapshot: c8df6e64b4ca376ac26bcdd7d228113093660962f5d0f11c8096e7fc4191d5d9