From e82c95aa4f8b1d0b064edf05af4b16830abbc16c Mon Sep 17 00:00:00 2001 From: Matan Eden <57892946+MatanEden1@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:27:17 +0300 Subject: [PATCH 1/4] AX-1941: add *.jfrog.io to workspace sandbox allowlist Cursor's Agents Window (CURSOR_SANDBOX=seatbelt) blocks *.jfrog.io by default. Add a workspace .cursor/sandbox.json to unblock it. Workspace allowlists are unioned with Cursor's defaults, so only the missing host needs to be listed. Co-authored-by: Cursor --- .cursor/sandbox.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .cursor/sandbox.json diff --git a/.cursor/sandbox.json b/.cursor/sandbox.json new file mode 100644 index 0000000..f896c2e --- /dev/null +++ b/.cursor/sandbox.json @@ -0,0 +1,8 @@ +{ + "networkPolicy": { + "default": "deny", + "allow": [ + "*.jfrog.io" + ] + } +} From e5b038da052e2c14ab5e561959ba25b1f0370b7b Mon Sep 17 00:00:00 2001 From: Matan Eden <57892946+MatanEden1@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:30:40 +0300 Subject: [PATCH 2/4] AX-1941: add *.jfrog.io to workspace sandbox allowlist Cursor's Agents Window (CURSOR_SANDBOX=seatbelt) blocks *.jfrog.io by default. Add a workspace .cursor/sandbox.json to unblock it. Workspace allowlists are unioned with Cursor's defaults, so only the missing host needs to be listed. Extend validate-template.mjs to assert sandbox.json exists, has default=deny, and includes *.jfrog.io. Co-authored-by: Cursor --- scripts/validate-template.mjs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/scripts/validate-template.mjs b/scripts/validate-template.mjs index 4674c0d..e1a57c5 100644 --- a/scripts/validate-template.mjs +++ b/scripts/validate-template.mjs @@ -251,7 +251,34 @@ function resolveMarketplaceSource(source, pluginRoot) { return `${normalizedRoot}/${normalizedSource}`; } +async function validateSandboxJson() { + const sandboxPath = path.join(repoRoot, ".cursor", "sandbox.json"); + const sandbox = await readJsonFile(sandboxPath, ".cursor/sandbox.json"); + if (!sandbox) return; + + const policy = sandbox.networkPolicy; + if (!policy || typeof policy !== "object") { + addError('.cursor/sandbox.json: missing "networkPolicy" object.'); + return; + } + + if (policy.default !== "deny") { + addError('.cursor/sandbox.json: "networkPolicy.default" must be "deny".'); + } + + if (!Array.isArray(policy.allow)) { + addError('.cursor/sandbox.json: "networkPolicy.allow" must be an array.'); + return; + } + + if (!policy.allow.includes("*.jfrog.io")) { + addError('.cursor/sandbox.json: "networkPolicy.allow" must include "*.jfrog.io".'); + } +} + async function main() { + await validateSandboxJson(); + const marketplacePath = path.join(repoRoot, ".cursor-plugin", "marketplace.json"); const marketplace = await readJsonFile(marketplacePath, "Marketplace manifest"); if (!marketplace) { From 3d170c65b33211b67dfbb4281c90f08ed6f9bec5 Mon Sep 17 00:00:00 2001 From: Matan Eden <57892946+MatanEden1@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:33:15 +0300 Subject: [PATCH 3/4] Revert "AX-1941: add *.jfrog.io to workspace sandbox allowlist" This reverts commit e5b038da052e2c14ab5e561959ba25b1f0370b7b. --- scripts/validate-template.mjs | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/scripts/validate-template.mjs b/scripts/validate-template.mjs index e1a57c5..4674c0d 100644 --- a/scripts/validate-template.mjs +++ b/scripts/validate-template.mjs @@ -251,34 +251,7 @@ function resolveMarketplaceSource(source, pluginRoot) { return `${normalizedRoot}/${normalizedSource}`; } -async function validateSandboxJson() { - const sandboxPath = path.join(repoRoot, ".cursor", "sandbox.json"); - const sandbox = await readJsonFile(sandboxPath, ".cursor/sandbox.json"); - if (!sandbox) return; - - const policy = sandbox.networkPolicy; - if (!policy || typeof policy !== "object") { - addError('.cursor/sandbox.json: missing "networkPolicy" object.'); - return; - } - - if (policy.default !== "deny") { - addError('.cursor/sandbox.json: "networkPolicy.default" must be "deny".'); - } - - if (!Array.isArray(policy.allow)) { - addError('.cursor/sandbox.json: "networkPolicy.allow" must be an array.'); - return; - } - - if (!policy.allow.includes("*.jfrog.io")) { - addError('.cursor/sandbox.json: "networkPolicy.allow" must include "*.jfrog.io".'); - } -} - async function main() { - await validateSandboxJson(); - const marketplacePath = path.join(repoRoot, ".cursor-plugin", "marketplace.json"); const marketplace = await readJsonFile(marketplacePath, "Marketplace manifest"); if (!marketplace) { From 921335f3b0379d8925e76f7feced6bbae3269369 Mon Sep 17 00:00:00 2001 From: Matan Eden <57892946+MatanEden1@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:34:37 +0300 Subject: [PATCH 4/4] AX-1941: add sandbox network probe script Probes *.jfrog.io hosts through the sandbox proxy the same way the ticket reporter did. Run from inside the Agents Window to confirm .cursor/sandbox.json is actually unblocking the hosts. Co-authored-by: Cursor --- scripts/test-sandbox-network.sh | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 scripts/test-sandbox-network.sh diff --git a/scripts/test-sandbox-network.sh b/scripts/test-sandbox-network.sh new file mode 100755 index 0000000..4c878dd --- /dev/null +++ b/scripts/test-sandbox-network.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# Verify that *.jfrog.io is reachable from inside Cursor's Agents Window sandbox. +# +# Run this script from inside the Agents Window after adding .cursor/sandbox.json. +# It probes the same hosts the ticket reporter tested via CONNECT through the +# injected sandbox proxy (HTTP_PROXY/HTTPS_PROXY). +# +# Exit 0 = all JFrog hosts reachable (sandbox.json is working) +# Exit 1 = one or more hosts blocked (sandbox.json not applied or wrong) + +set -euo pipefail + +HOSTS=( + "releases.jfrog.io" + "jfrogmldev.jfrog.io" +) + +pass=0 +fail=0 + +probe() { + local host="$1" + local code + code=$(curl -s -o /dev/null -w "%{http_code}" \ + --max-time 5 \ + "https://${host}/" 2>/dev/null || echo "000") + + if [[ "$code" == "000" ]]; then + echo "FAIL ${host} (no response / DNS failure)" + ((fail++)) || true + elif [[ "$code" == "403" ]]; then + echo "FAIL ${host} (403 — not on sandbox allowlist)" + ((fail++)) || true + else + echo "OK ${host} (HTTP ${code})" + ((pass++)) || true + fi +} + +echo "Sandbox env:" +echo " CURSOR_SANDBOX=${CURSOR_SANDBOX:-}" +echo " HTTP_PROXY=${HTTP_PROXY:-}" +echo "" + +for host in "${HOSTS[@]}"; do + probe "$host" +done + +echo "" +if [[ $fail -eq 0 ]]; then + echo "All hosts reachable — sandbox.json is working." + exit 0 +else + echo "${fail} host(s) blocked. Ensure .cursor/sandbox.json contains:" + echo ' {"networkPolicy":{"default":"deny","allow":["*.jfrog.io"]}}' + exit 1 +fi