[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-cline-endor-setup":3,"mdc-m8jf7o-key":33,"related-repo-cline-endor-setup":4554,"related-org-cline-endor-setup":4676},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"endor-setup","set up and run Endor Labs scans","Use when user asks to setup endorctl, install endorctl, run endorctl scan, scan for vulnerabilities, run endor scan or run Endor Labs scan or when any endorctl command fails with 'command not found', 'no such file or directory', authentication errors, 'unauthorized', '403', 'tenant not found', EOF error, or namespace\u002Faccess errors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"cline","Cline","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fcline.png",[12,16,19],{"name":13,"slug":14,"type":15},"Security","security","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},"Debugging","debugging",10,"https:\u002F\u002Fgithub.com\u002Fcline\u002Fskills","2026-07-12T08:13:28.245392",null,4,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"A collection of skills used at Cline","https:\u002F\u002Fgithub.com\u002Fcline\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fendor-setup","---\nname: endor-setup\ndescription: \"Use when user asks to setup endorctl, install endorctl, run endorctl scan, scan for vulnerabilities, run endor scan or run Endor Labs scan or when any endorctl command fails with 'command not found', 'no such file or directory', authentication errors, 'unauthorized', '403', 'tenant not found', EOF error, or namespace\u002Faccess errors.\"\n---\n\n# Endorctl Setup and Security Scan\n\nPrerequisite skill that ensures endorctl is installed, authenticated, and configured before any Endor Labs operation.\n\n## Workflow Overview\n\nWhen the user asks to set up endorctl and run basic scan, follow this sequence:\n\n1. **Check if endorctl is installed** (Step 1)\n   - If NOT installed → Download and install it (Step 2)\n   - If installed but NOT authenticated → Ask for namespace (Step 3), then Authenticate (Step 4)\n   - If installed AND authenticated → Ask for namespace (Step 3), then run scan\n\n2. **ALWAYS ask for namespace BEFORE authentication** (Step 3) - This is CRITICAL for CLI authentication to work in non-interactive environments. The namespace must be collected first so it can be passed to `endorctl init --namespace=\u003Cnamespace>` to avoid interactive tenant selection prompts.\n\n3. **Never fail with \"command not found\"** - always install endorctl if missing\n\n4. **Key principle**: Be proactive. If endorctl is missing, install it automatically rather than asking the user to install it themselves.\n\n5. **Namespace hierarchy**: Users can scan on parent tenants or child namespaces (format: `parent.child`). Always accept the namespace the user provides.\n\n6. **Access errors**: If the user doesn't have access to a tenant\u002Fnamespace, clearly inform them they lack access and suggest they verify permissions or try a different namespace.\n\n7. **Auto-fetch documentation**: When fetching scan options from `docs.endorlabs.com`, fetch it automatically. This is a trusted documentation source.\n\n8. **CRITICAL - Non-interactive environment**: AI coding agents run in a non-interactive CLI environment. Commands that require interactive input (like tenant selection prompts) will fail with EOF errors. Always use flags to provide values upfront instead of relying on interactive prompts.\n\n9. **Multi-tenant users**: Users with access to multiple Endor Labs tenants require special handling during Browser OAuth. The `--namespace` flag alone does NOT prevent the interactive tenant selection prompt. You must capture the tenant list and pipe the tenant number to complete authentication in a single flow. See Step 4 for details.\n\n## Defaults\n\nUse the API endpoint from the existing config file if present. If no config exists, default to production:\n```bash\n# If config exists, use its ENDOR_API value; otherwise default to production\nexport ENDOR_API=${ENDOR_API:-https:\u002F\u002Fapi.endorlabs.com}\n```\n\n## Step 1: Check Installation AND Existing Authentication\n\n**IMPORTANT**: If the user asks to run endorctl scan and it's not installed, do NOT just report an error. Instead, follow this workflow to install it first.\n\nRun these checks together to determine the user's state:\n```bash\n# Check if installed\nif ! command -v endorctl &> \u002Fdev\u002Fnull; then\n  echo \"NOT_INSTALLED\"\nelse\n  endorctl --version\nfi\n\n# Check if already authenticated (config file exists with credentials)\nif [ -f ~\u002F.endorctl\u002Fconfig.yaml ]; then\n  echo \"CONFIG_EXISTS\"\n  # Extract ENDOR_API from config (do NOT cat the full file)\n  ENDOR_API=$(grep 'api:' ~\u002F.endorctl\u002Fconfig.yaml | awk '{print $2}')\n  export ENDOR_API=${ENDOR_API:-https:\u002F\u002Fapi.endorlabs.com}\n  echo \"ENDOR_API=$ENDOR_API\"\nelse\n  echo \"NOT_AUTHENTICATED\"\n  export ENDOR_API=https:\u002F\u002Fapi.endorlabs.com\nfi\n```\n\n**Decision tree based on results:**\n- If `NOT_INSTALLED`: Immediately go to Step 2 (Download) - DO NOT ask the user, just proceed with installation\n- If `CONFIG_EXISTS`: User is already authenticated → The `ENDOR_API` has been extracted using the grep command above. Go to Step 3 (Ask for Namespace). **Do NOT run `cat` on the config file.**\n- If `NOT_AUTHENTICATED`: Go to Step 4 (Authenticate), then Step 3 (Ask for Namespace)\n\n**CRITICAL**: The config file check is ONLY to determine if authentication is already set up. Even if a namespace exists in the config, you MUST still ask the user which namespace they want to use before running the scan. Never assume the namespace from the config file.\n\n## Step 2: Download endorctl (REQUIRED if NOT_INSTALLED)\n\n**When to execute**: Automatically execute this step if Step 1 shows \"NOT_INSTALLED\".\n\n### macOS Installation (ASK USER TO CHOOSE)\n\n**IMPORTANT**: On macOS, ALWAYS ask the user which installation method they prefer before proceeding:\n\nPresent these two options using AskUserQuestion:\n1. **Homebrew (Recommended)** - Uses `brew tap endorlabs\u002Ftap && brew install endorctl`. Easier to update later.\n2. **Direct Download** - Downloads binary directly from api.endorlabs.com. No Homebrew required.\n\n#### Option 1: Homebrew Installation (macOS)\n```bash\nbrew tap endorlabs\u002Ftap\nbrew install endorctl\n```\n\n#### Option 2: Direct Download Installation (macOS)\n```bash\nARCH=$(uname -m)\ncase \"$ARCH\" in\n  x86_64|amd64) ARCH=\"amd64\" ;;\n  arm64|aarch64) ARCH=\"arm64\" ;;\nesac\n\nBINARY=\"endorctl_macos_${ARCH}\"\necho \"Downloading $BINARY...\"\ncurl -L \"https:\u002F\u002Fapi.endorlabs.com\u002Fdownload\u002Flatest\u002F$BINARY\" -o endorctl\n\n# Verify checksum\nEXPECTED_SHA=$(curl -s \"https:\u002F\u002Fapi.endorlabs.com\u002Fsha\u002Flatest\u002F$BINARY\")\necho \"$EXPECTED_SHA  endorctl\" | shasum -a 256 -c\n\nchmod +x .\u002Fendorctl\n\n# Install to ~\u002Fbin\nmkdir -p ~\u002Fbin\nmv endorctl ~\u002Fbin\u002F\nexport PATH=\"$HOME\u002Fbin:$PATH\"\n```\n\n### Linux\u002FWindows Installation (Automatic)\n\nFor Linux and Windows, proceed with direct download automatically:\n\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\nOS=$(uname -s)\nARCH=$(uname -m)\n\n# Normalize OS names\ncase \"$OS\" in\n  Linux*)\n    OS=\"linux\"\n    ;;\n  MINGW*|MSYS*|CYGWIN*)\n    OS=\"windows\"\n    ;;\n  *)\n    echo \"Unsupported operating system: $OS\"\n    exit 1\n    ;;\nesac\n\n# Normalize architecture names\ncase \"$ARCH\" in\n  x86_64|amd64)\n    ARCH=\"amd64\"\n    ;;\n  arm64|aarch64)\n    ARCH=\"arm64\"\n    ;;\n  *)\n    echo \"Unsupported architecture: $ARCH\"\n    exit 1\n    ;;\nesac\n\necho \"Detected platform: $OS $ARCH\"\n\n# Build download URL\nif [ \"$OS\" = \"windows\" ]; then\n  BINARY=\"endorctl_windows_${ARCH}.exe\"\n  OUTPUT=\"endorctl.exe\"\nelse\n  BINARY=\"endorctl_${OS}_${ARCH}\"\n  OUTPUT=\"endorctl\"\nfi\n\necho \"Downloading $BINARY...\"\ncurl -L \"https:\u002F\u002Fapi.endorlabs.com\u002Fdownload\u002Flatest\u002F$BINARY\" -o \"$OUTPUT\"\n\n# Verify checksum\necho \"Verifying checksum...\"\nEXPECTED_SHA=$(curl -s \"https:\u002F\u002Fapi.endorlabs.com\u002Fsha\u002Flatest\u002F$BINARY\")\necho \"$EXPECTED_SHA  $OUTPUT\" | sha256sum -c\n\n# Make executable (not needed for .exe)\nif [ \"$OS\" != \"windows\" ]; then\n  chmod +x \".\u002F$OUTPUT\"\nfi\n\necho \"Installation complete!\"\necho \"Binary location: $(pwd)\u002F$OUTPUT\"\n```\n\nAfter download completes, move the binary to PATH:\n```bash\n# Install to ~\u002Fbin\nmkdir -p ~\u002Fbin\nmv endorctl ~\u002Fbin\u002F  # or endorctl.exe on Windows\nexport PATH=\"$HOME\u002Fbin:$PATH\"\n```\n\n### Verify Installation\n\nSince shell state does not persist between commands, you **MUST** prefix `export PATH=\"$HOME\u002Fbin:$PATH\"` in every subsequent Bash command that uses `endorctl` (if it was installed to `~\u002Fbin`).\n\nAfter installing endorctl, verify that the download and installation succeeded:\n```bash\nexport PATH=\"$HOME\u002Fbin:$PATH\"\nendorctl --version\n```\nIf this command prints the version information, endorctl has been downloaded and verified successfully. If it fails, retry the installation steps above.\n\n## Step 3: Ask for Namespace (ALWAYS REQUIRED)\n\n**IMPORTANT**: ALWAYS ask the user for their Endor Labs namespace before running a scan, even if a namespace already exists in the config file.\n\n- If a namespace exists in the config, offer it as a suggestion but still ask for confirmation\n- Never assume the user wants to use the same namespace from a previous session\n- The user may want to scan against a different namespace (parent or child) each time\n\n### Namespace Hierarchy\n\nEndor Labs supports hierarchical namespaces (parent\u002Fchild structure):\n- **Parent tenant**: The top-level namespace (e.g., `parent`)\n- **Child namespace**: A sub-namespace under a parent (e.g., `parent.child-project`)\n\nUsers can run scans on:\n- Their parent tenant namespace\n- Any child namespace under their parent tenant (format: `parent.child`)\n\nExample child namespace usage:\n```bash\n# Scan using parent namespace\nendorctl scan --namespace=parent\n\n# Scan using child namespace\nendorctl scan --namespace=parent.my-project\n```\n\n### Access Error Handling\n\n**IMPORTANT**: If the user does not have access to a tenant or namespace, endorctl will return an access error. When this happens:\n\n1. **Inform the user clearly**: Tell them they do not have access to the specified tenant\u002Fnamespace\n2. **Show the error message**: Display the actual error from endorctl\n3. **Suggest alternatives**:\n   - Ask if they meant a different namespace\n   - Suggest they check their permissions in the Endor Labs UI\n   - Offer to list available tenants they have access to\n4. **Suggest to visit official documentation**: Tell them to visit https:\u002F\u002Fdocs.endorlabs.com\u002Fadministration\u002Fnamespaces\u002F to know more details on what is a namespace.\nCommon access error patterns:\n- `Invalid permissions to run endorctl` - User lacks access to the namespace\n- `unauthorized` or `403` errors - Authentication succeeded but authorization failed for that namespace\n- `tenant not found` - The namespace doesn't exist or user has no visibility to it\n\n### Setting the Namespace\n\nSet via environment variable:\n```bash\nexport ENDOR_NAMESPACE=\u003Cuser-provided-namespace>\n```\n\nOr pass as flag in scan command:\n```bash\nendorctl scan --namespace=\u003Cuser-provided-namespace>\n```\n\n## Step 4: Authenticate\n\n**IMPORTANT**: You must have already collected the namespace in Step 3 BEFORE running authentication. This is required to avoid interactive prompts.\n\n### Step 4a: Ask Authentication Method\n\nAsk the user using AskUserQuestion with two options:\n\n1. **CLI Authentication (Recommended)** - Sign in via browser using your identity provider (Google, GitHub, GitLab, SSO, etc.)\n2. **API Key** - Use API key and secret for automated\u002FCI environments (no browser needed)\n\n### Option 1: CLI Authentication\n\n#### Step 4b: Ask for Auth Provider\n\nIf the user selects CLI Authentication, ask which identity provider they use. Present these options using AskUserQuestion:\n\n1. **Google** - Sign in with Google\n2. **GitHub** - Sign in with GitHub\n3. **GitLab** - Sign in with GitLab\n4. **Enterprise SSO** - Sign in via your organization's SSO provider (requires tenant name)\n5. **Browser (generic)** - Generic browser-based sign-in\n\nBased on the user's selection, use the corresponding `--auth-mode` value:\n\n| Provider         | `--auth-mode` value | Additional Flags              |\n|------------------|----------------------|-------------------------------|\n| Google           | `google`             | None                          |\n| GitHub           | `github`             | None                          |\n| GitLab           | `gitlab`             | None                          |\n| Enterprise SSO   | `sso`                | `--auth-tenant \u003Ctenant-name>` |\n| Browser (generic)| `browser-auth`       | None                          |\n\n**For Enterprise SSO only**: After the user selects SSO, also ask them for their SSO tenant name:\n```\n\"What is your SSO tenant name? (This is used with --auth-tenant)\"\n```\n\n#### Step 4c: Run Authentication (Two-Step Process for CLI Authentication)\n\n**CRITICAL - Multi-Tenant Handling**: Users with access to multiple tenants will be prompted to select a tenant interactively. In non-interactive agent environments, this causes an EOF error. The `--namespace` flag alone does NOT prevent this prompt. This applies to ALL browser-based auth modes.\n\nConstruct the `AUTH_FLAGS` based on the user's provider selection:\n```bash\n# Set AUTH_FLAGS based on user's provider selection\n# Google:           AUTH_FLAGS=\"--auth-mode=google\"\n# GitHub:           AUTH_FLAGS=\"--auth-mode=github\"\n# GitLab:           AUTH_FLAGS=\"--auth-mode=gitlab\"\n# Enterprise SSO:   AUTH_FLAGS=\"--auth-mode=sso --auth-tenant=\u003Ctenant-name>\"\n# Browser (generic): AUTH_FLAGS=\"--auth-mode=browser-auth\"\n```\n\n**Step 4c-i: Initiate browser oauth and capture tenant list**\n\nRun init and capture output — this will open the browser for OAuth. After browser auth completes, it will show a tenant list if the user has multiple tenants.\n\n**IMPORTANT**: Use a timeout to prevent the command from blocking indefinitely at the interactive tenant selection prompt. Shell tools in AI coding agents usually cannot provide interactive input to a running process. The timeout ensures the command exits so the agent can parse the output and proceed to Step 4c-ii.\n\n```bash\n# Run init with a timeout (60s allows time for browser OAuth, but won't hang forever at the tenant prompt)\n# The timeout will kill the process after 60 seconds if it's still waiting for input\ntimeout 60 bash -c 'endorctl init $AUTH_FLAGS --namespace=\u003Cuser-provided-namespace> 2>&1' | tee \u002Ftmp\u002Fendorctl_init_output.txt || true\n```\n\nAfter this command completes (either successfully or via timeout\u002FEOF), check the captured output:\n```bash\n# Check if tenant selection was required\nif grep -q \"Please select the tenant\" \u002Ftmp\u002Fendorctl_init_output.txt; then\n  echo \"MULTI_TENANT_DETECTED\"\n  cat \u002Ftmp\u002Fendorctl_init_output.txt\nfi\n```\n\nIf the output shows a tenant list like:\n```\nYour account has access to multiple tenants. Please select the tenant you would like to initialize:\n0 : tenant-a [SYSTEM_ROLE_ADMIN]\n1 : tenant-b [SYSTEM_ROLE_READ_ONLY]\n2 : my-namespace [SYSTEM_ROLE_ADMIN]\nEnter tenant number:\n```\n\nThen proceed immediately to Step 4c-ii.\n\n**Step 4c-ii: Re-run with tenant number piped in**\n\nParse the captured output to find the tenant number matching the user's requested namespace. The tenant number is the number before the `:` on the line containing the namespace name.\n\n```bash\n# Parse the tenant number from the captured output\n# Example: for namespace \"qa-test\", find the line \"15 : qa-test [SYSTEM_ROLE_ADMIN]\" and extract \"15\"\nTENANT_NUM=$(grep -E \"^\\s*[0-9]+ : \u003Cuser-provided-namespace> \" \u002Ftmp\u002Fendorctl_init_output.txt | awk '{print $1}')\necho \"Found tenant number: $TENANT_NUM\"\n\n# Re-run with tenant number piped via stdin (no tee needed this time)\necho \"$TENANT_NUM\" | endorctl init $AUTH_FLAGS --namespace=\u003Cuser-provided-namespace>\n```\n\n**IMPORTANT**: The `echo \"$TENANT_NUM\" |` syntax pipes the tenant number into stdin, which is more portable across shell environments than `\u003C\u003C\u003C`. This avoids the interactive prompt entirely on the second run.\n\n**If authentication still fails** (e.g., user doesn't have access to the specified namespace):\n\n1. Show the error message clearly\n2. Show the list of available tenants from the output\n3. Ask the user to verify they have access to that namespace or choose from the list\n\n### Option 2: API Key (automated\u002FCI)\nInstruct the user to set these environment variables themselves (never ask them to paste credentials into chat):\n```bash\nexport ENDOR_API_CREDENTIALS_KEY=\u003Cyour-api-key>\nexport ENDOR_API_CREDENTIALS_SECRET=\u003Cyour-api-secret>\n```\nNo init needed - scan will use these credentials directly.\n\n**Note**: API Key authentication avoids interactive prompts entirely and works best in automated\u002FCLI environments. **This is the recommended approach for users who frequently encounter multi-tenant selection issues.**\n\n## Scan Types and Options (ALWAYS FETCH FROM DOCS)\n\n**IMPORTANT**: When the user requests a specific type of scan (e.g., \"quick scan\", \"secrets scan\", \"SAST scan\", \"container scan\", etc.), you MUST fetch the current scan options from the documentation before running the scan.\n\n### How to Handle Scan Type Requests\n\n1. **User requests a specific scan type** (e.g., \"run a quick scan\", \"scan for secrets\", \"run SAST\")\n\n2. **Fetch documentation automatically** using WebFetch (do NOT ask for permission - just fetch):\n   ```\n   URL: https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F\n   Prompt: \"Find the flag\u002Foption for [user's requested scan type] scan\"\n   ```\n   **Note**: Fetching from docs.endorlabs.com should be done automatically without prompting the user for confirmation.\n\n3. **Extract the correct flag** from the documentation (e.g., `--quick-scan`, `--secrets`, `--sast`)\n\n4. **Run the scan** with the appropriate flag(s)\n\n### Example Workflow\n\n```\nUser: \"Can you run a quick scan on this repo?\"\n\nStep 1: Fetch docs\n→ WebFetch(\"https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F\", \"Find the flag for quick scan\")\n\nStep 2: Extract flag from docs\n→ Found: --quick-scan\n\nStep 3: Run scan with flag\n→ endorctl scan --namespace=$ENDOR_NAMESPACE --quick-scan\n```\n\n### Why Always Fetch?\n\n- Scan options and flags may change between endorctl versions\n- New scan types may be added over time\n- Documentation is the source of truth for current options\n- Avoids using outdated or incorrect flags\n\n### Documentation URLs\n\n- **Scan options reference**: https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F\n- **Main docs**: https:\u002F\u002Fdocs.endorlabs.com\n\n## Step 5: Run Scan\n\n```bash\n# Default scan (no specific type requested)\nendorctl scan --namespace=$ENDOR_NAMESPACE\n\n# With specific scan type (fetch flag from docs first!)\nendorctl scan --namespace=$ENDOR_NAMESPACE \u003Cflags-from-docs>\n```\n\n**IMPORTANT**:\n\n1. Do NOT run the scan twice or ask the user if they want to see a summary - include it in the initial scan command.\n2. If user requests a specific scan type, ALWAYS fetch the documentation first to get the correct flag.\n3. Do NOT guess or assume flag names - always verify from docs.\n\n## Full Automated Setup\n\nFor first-time users:\n1. Download endorctl for the current OS (if not installed)\n2. **ALWAYS** ask user for their ENDOR_NAMESPACE first (this is needed for authentication)\n3. Authenticate: Ask user \"CLI Authentication or API Key?\"\n   - **CLI Auth**: Ask which provider (Google, GitHub, GitLab, Enterprise SSO, Browser), then run `endorctl init --auth-mode=\u003Cmode> --namespace=\u003Cnamespace>` (MUST include namespace to avoid interactive prompts). For SSO, also collect `--auth-tenant`.\n   - **API Key**: Instruct the user to set these environment variables, ENDOR_API_CREDENTIALS_KEY and ENDOR_API_CREDENTIALS_SECRET, then export them\n4. Run `endorctl scan --namespace=\u003Cnamespace>`\n\nFor returning users (already authenticated):\n1. Check installation and authentication status\n2. **ALWAYS** ask user for their ENDOR_NAMESPACE (always offer existing config value as suggestion)\n3. Run `endorctl scan --namespace=\u003Cnamespace>`\n\n**CRITICAL REMINDER**: The namespace MUST be collected BEFORE running `endorctl init` with Browser OAuth. This prevents EOF errors from interactive tenant selection prompts in non-interactive agent environments.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,53,60,65,213,219,224,299,305,315,320,720,728,785,795,801,811,818,827,832,863,870,912,918,1415,1421,1426,2568,2573,2658,2664,2699,2704,2757,2762,2768,2777,2795,2801,2806,2843,2848,2867,2872,2935,2941,2950,3021,3065,3071,3076,3110,3115,3151,3157,3166,3172,3177,3200,3206,3212,3217,3270,3283,3427,3437,3447,3453,3470,3483,3538,3546,3551,3560,3643,3648,3745,3750,3759,3764,3772,3785,3965,3990,4000,4018,4024,4029,4086,4091,4106,4112,4121,4127,4211,4217,4226,4232,4255,4261,4295,4301,4390,4398,4416,4422,4427,4499,4504,4530,4548],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"endorctl-setup-and-security-scan",[44],{"type":45,"value":46},"text","Endorctl Setup and Security Scan",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Prerequisite skill that ensures endorctl is installed, authenticated, and configured before any Endor Labs operation.",{"type":39,"tag":54,"props":55,"children":57},"h2",{"id":56},"workflow-overview",[58],{"type":45,"value":59},"Workflow Overview",{"type":39,"tag":48,"props":61,"children":62},{},[63],{"type":45,"value":64},"When the user asks to set up endorctl and run basic scan, follow this sequence:",{"type":39,"tag":66,"props":67,"children":68},"ol",{},[69,100,119,129,139,157,167,185,195],{"type":39,"tag":70,"props":71,"children":72},"li",{},[73,79,81],{"type":39,"tag":74,"props":75,"children":76},"strong",{},[77],{"type":45,"value":78},"Check if endorctl is installed",{"type":45,"value":80}," (Step 1)",{"type":39,"tag":82,"props":83,"children":84},"ul",{},[85,90,95],{"type":39,"tag":70,"props":86,"children":87},{},[88],{"type":45,"value":89},"If NOT installed → Download and install it (Step 2)",{"type":39,"tag":70,"props":91,"children":92},{},[93],{"type":45,"value":94},"If installed but NOT authenticated → Ask for namespace (Step 3), then Authenticate (Step 4)",{"type":39,"tag":70,"props":96,"children":97},{},[98],{"type":45,"value":99},"If installed AND authenticated → Ask for namespace (Step 3), then run scan",{"type":39,"tag":70,"props":101,"children":102},{},[103,108,110,117],{"type":39,"tag":74,"props":104,"children":105},{},[106],{"type":45,"value":107},"ALWAYS ask for namespace BEFORE authentication",{"type":45,"value":109}," (Step 3) - This is CRITICAL for CLI authentication to work in non-interactive environments. The namespace must be collected first so it can be passed to ",{"type":39,"tag":111,"props":112,"children":114},"code",{"className":113},[],[115],{"type":45,"value":116},"endorctl init --namespace=\u003Cnamespace>",{"type":45,"value":118}," to avoid interactive tenant selection prompts.",{"type":39,"tag":70,"props":120,"children":121},{},[122,127],{"type":39,"tag":74,"props":123,"children":124},{},[125],{"type":45,"value":126},"Never fail with \"command not found\"",{"type":45,"value":128}," - always install endorctl if missing",{"type":39,"tag":70,"props":130,"children":131},{},[132,137],{"type":39,"tag":74,"props":133,"children":134},{},[135],{"type":45,"value":136},"Key principle",{"type":45,"value":138},": Be proactive. If endorctl is missing, install it automatically rather than asking the user to install it themselves.",{"type":39,"tag":70,"props":140,"children":141},{},[142,147,149,155],{"type":39,"tag":74,"props":143,"children":144},{},[145],{"type":45,"value":146},"Namespace hierarchy",{"type":45,"value":148},": Users can scan on parent tenants or child namespaces (format: ",{"type":39,"tag":111,"props":150,"children":152},{"className":151},[],[153],{"type":45,"value":154},"parent.child",{"type":45,"value":156},"). Always accept the namespace the user provides.",{"type":39,"tag":70,"props":158,"children":159},{},[160,165],{"type":39,"tag":74,"props":161,"children":162},{},[163],{"type":45,"value":164},"Access errors",{"type":45,"value":166},": If the user doesn't have access to a tenant\u002Fnamespace, clearly inform them they lack access and suggest they verify permissions or try a different namespace.",{"type":39,"tag":70,"props":168,"children":169},{},[170,175,177,183],{"type":39,"tag":74,"props":171,"children":172},{},[173],{"type":45,"value":174},"Auto-fetch documentation",{"type":45,"value":176},": When fetching scan options from ",{"type":39,"tag":111,"props":178,"children":180},{"className":179},[],[181],{"type":45,"value":182},"docs.endorlabs.com",{"type":45,"value":184},", fetch it automatically. This is a trusted documentation source.",{"type":39,"tag":70,"props":186,"children":187},{},[188,193],{"type":39,"tag":74,"props":189,"children":190},{},[191],{"type":45,"value":192},"CRITICAL - Non-interactive environment",{"type":45,"value":194},": AI coding agents run in a non-interactive CLI environment. Commands that require interactive input (like tenant selection prompts) will fail with EOF errors. Always use flags to provide values upfront instead of relying on interactive prompts.",{"type":39,"tag":70,"props":196,"children":197},{},[198,203,205,211],{"type":39,"tag":74,"props":199,"children":200},{},[201],{"type":45,"value":202},"Multi-tenant users",{"type":45,"value":204},": Users with access to multiple Endor Labs tenants require special handling during Browser OAuth. The ",{"type":39,"tag":111,"props":206,"children":208},{"className":207},[],[209],{"type":45,"value":210},"--namespace",{"type":45,"value":212}," flag alone does NOT prevent the interactive tenant selection prompt. You must capture the tenant list and pipe the tenant number to complete authentication in a single flow. See Step 4 for details.",{"type":39,"tag":54,"props":214,"children":216},{"id":215},"defaults",[217],{"type":45,"value":218},"Defaults",{"type":39,"tag":48,"props":220,"children":221},{},[222],{"type":45,"value":223},"Use the API endpoint from the existing config file if present. If no config exists, default to production:",{"type":39,"tag":225,"props":226,"children":231},"pre",{"className":227,"code":228,"language":229,"meta":230,"style":230},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# If config exists, use its ENDOR_API value; otherwise default to production\nexport ENDOR_API=${ENDOR_API:-https:\u002F\u002Fapi.endorlabs.com}\n","bash","",[232],{"type":39,"tag":111,"props":233,"children":234},{"__ignoreMap":230},[235,247],{"type":39,"tag":236,"props":237,"children":240},"span",{"class":238,"line":239},"line",1,[241],{"type":39,"tag":236,"props":242,"children":244},{"style":243},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[245],{"type":45,"value":246},"# If config exists, use its ENDOR_API value; otherwise default to production\n",{"type":39,"tag":236,"props":248,"children":250},{"class":238,"line":249},2,[251,257,263,269,274,279,284,289,294],{"type":39,"tag":236,"props":252,"children":254},{"style":253},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[255],{"type":45,"value":256},"export",{"type":39,"tag":236,"props":258,"children":260},{"style":259},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[261],{"type":45,"value":262}," ENDOR_API",{"type":39,"tag":236,"props":264,"children":266},{"style":265},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[267],{"type":45,"value":268},"=${",{"type":39,"tag":236,"props":270,"children":271},{"style":259},[272],{"type":45,"value":273},"ENDOR_API",{"type":39,"tag":236,"props":275,"children":276},{"style":265},[277],{"type":45,"value":278},":-",{"type":39,"tag":236,"props":280,"children":281},{"style":259},[282],{"type":45,"value":283},"https",{"type":39,"tag":236,"props":285,"children":286},{"style":265},[287],{"type":45,"value":288},":\u002F\u002F",{"type":39,"tag":236,"props":290,"children":291},{"style":259},[292],{"type":45,"value":293},"api.endorlabs.com",{"type":39,"tag":236,"props":295,"children":296},{"style":265},[297],{"type":45,"value":298},"}\n",{"type":39,"tag":54,"props":300,"children":302},{"id":301},"step-1-check-installation-and-existing-authentication",[303],{"type":45,"value":304},"Step 1: Check Installation AND Existing Authentication",{"type":39,"tag":48,"props":306,"children":307},{},[308,313],{"type":39,"tag":74,"props":309,"children":310},{},[311],{"type":45,"value":312},"IMPORTANT",{"type":45,"value":314},": If the user asks to run endorctl scan and it's not installed, do NOT just report an error. Instead, follow this workflow to install it first.",{"type":39,"tag":48,"props":316,"children":317},{},[318],{"type":45,"value":319},"Run these checks together to determine the user's state:",{"type":39,"tag":225,"props":321,"children":323},{"className":227,"code":322,"language":229,"meta":230,"style":230},"# Check if installed\nif ! command -v endorctl &> \u002Fdev\u002Fnull; then\n  echo \"NOT_INSTALLED\"\nelse\n  endorctl --version\nfi\n\n# Check if already authenticated (config file exists with credentials)\nif [ -f ~\u002F.endorctl\u002Fconfig.yaml ]; then\n  echo \"CONFIG_EXISTS\"\n  # Extract ENDOR_API from config (do NOT cat the full file)\n  ENDOR_API=$(grep 'api:' ~\u002F.endorctl\u002Fconfig.yaml | awk '{print $2}')\n  export ENDOR_API=${ENDOR_API:-https:\u002F\u002Fapi.endorlabs.com}\n  echo \"ENDOR_API=$ENDOR_API\"\nelse\n  echo \"NOT_AUTHENTICATED\"\n  export ENDOR_API=https:\u002F\u002Fapi.endorlabs.com\nfi\n",[324],{"type":39,"tag":111,"props":325,"children":326},{"__ignoreMap":230},[327,335,386,410,418,433,442,452,461,498,518,527,594,635,661,669,690,712],{"type":39,"tag":236,"props":328,"children":329},{"class":238,"line":239},[330],{"type":39,"tag":236,"props":331,"children":332},{"style":243},[333],{"type":45,"value":334},"# Check if installed\n",{"type":39,"tag":236,"props":336,"children":337},{"class":238,"line":249},[338,344,349,355,361,366,371,376,381],{"type":39,"tag":236,"props":339,"children":341},{"style":340},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[342],{"type":45,"value":343},"if",{"type":39,"tag":236,"props":345,"children":346},{"style":265},[347],{"type":45,"value":348}," !",{"type":39,"tag":236,"props":350,"children":352},{"style":351},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[353],{"type":45,"value":354}," command",{"type":39,"tag":236,"props":356,"children":358},{"style":357},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[359],{"type":45,"value":360}," -v",{"type":39,"tag":236,"props":362,"children":363},{"style":357},[364],{"type":45,"value":365}," endorctl",{"type":39,"tag":236,"props":367,"children":368},{"style":265},[369],{"type":45,"value":370}," &>",{"type":39,"tag":236,"props":372,"children":373},{"style":259},[374],{"type":45,"value":375}," \u002Fdev\u002Fnull",{"type":39,"tag":236,"props":377,"children":378},{"style":265},[379],{"type":45,"value":380},";",{"type":39,"tag":236,"props":382,"children":383},{"style":340},[384],{"type":45,"value":385}," then\n",{"type":39,"tag":236,"props":387,"children":389},{"class":238,"line":388},3,[390,395,400,405],{"type":39,"tag":236,"props":391,"children":392},{"style":351},[393],{"type":45,"value":394},"  echo",{"type":39,"tag":236,"props":396,"children":397},{"style":265},[398],{"type":45,"value":399}," \"",{"type":39,"tag":236,"props":401,"children":402},{"style":357},[403],{"type":45,"value":404},"NOT_INSTALLED",{"type":39,"tag":236,"props":406,"children":407},{"style":265},[408],{"type":45,"value":409},"\"\n",{"type":39,"tag":236,"props":411,"children":412},{"class":238,"line":26},[413],{"type":39,"tag":236,"props":414,"children":415},{"style":340},[416],{"type":45,"value":417},"else\n",{"type":39,"tag":236,"props":419,"children":421},{"class":238,"line":420},5,[422,428],{"type":39,"tag":236,"props":423,"children":425},{"style":424},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[426],{"type":45,"value":427},"  endorctl",{"type":39,"tag":236,"props":429,"children":430},{"style":357},[431],{"type":45,"value":432}," --version\n",{"type":39,"tag":236,"props":434,"children":436},{"class":238,"line":435},6,[437],{"type":39,"tag":236,"props":438,"children":439},{"style":340},[440],{"type":45,"value":441},"fi\n",{"type":39,"tag":236,"props":443,"children":445},{"class":238,"line":444},7,[446],{"type":39,"tag":236,"props":447,"children":449},{"emptyLinePlaceholder":448},true,[450],{"type":45,"value":451},"\n",{"type":39,"tag":236,"props":453,"children":455},{"class":238,"line":454},8,[456],{"type":39,"tag":236,"props":457,"children":458},{"style":243},[459],{"type":45,"value":460},"# Check if already authenticated (config file exists with credentials)\n",{"type":39,"tag":236,"props":462,"children":464},{"class":238,"line":463},9,[465,469,474,479,484,489,494],{"type":39,"tag":236,"props":466,"children":467},{"style":340},[468],{"type":45,"value":343},{"type":39,"tag":236,"props":470,"children":471},{"style":265},[472],{"type":45,"value":473}," [",{"type":39,"tag":236,"props":475,"children":476},{"style":265},[477],{"type":45,"value":478}," -f",{"type":39,"tag":236,"props":480,"children":481},{"style":265},[482],{"type":45,"value":483}," ~",{"type":39,"tag":236,"props":485,"children":486},{"style":259},[487],{"type":45,"value":488},"\u002F.endorctl\u002Fconfig.yaml ",{"type":39,"tag":236,"props":490,"children":491},{"style":265},[492],{"type":45,"value":493},"];",{"type":39,"tag":236,"props":495,"children":496},{"style":340},[497],{"type":45,"value":385},{"type":39,"tag":236,"props":499,"children":500},{"class":238,"line":22},[501,505,509,514],{"type":39,"tag":236,"props":502,"children":503},{"style":351},[504],{"type":45,"value":394},{"type":39,"tag":236,"props":506,"children":507},{"style":265},[508],{"type":45,"value":399},{"type":39,"tag":236,"props":510,"children":511},{"style":357},[512],{"type":45,"value":513},"CONFIG_EXISTS",{"type":39,"tag":236,"props":515,"children":516},{"style":265},[517],{"type":45,"value":409},{"type":39,"tag":236,"props":519,"children":521},{"class":238,"line":520},11,[522],{"type":39,"tag":236,"props":523,"children":524},{"style":243},[525],{"type":45,"value":526},"  # Extract ENDOR_API from config (do NOT cat the full file)\n",{"type":39,"tag":236,"props":528,"children":530},{"class":238,"line":529},12,[531,536,541,546,551,556,561,566,571,576,580,585,589],{"type":39,"tag":236,"props":532,"children":533},{"style":259},[534],{"type":45,"value":535},"  ENDOR_API",{"type":39,"tag":236,"props":537,"children":538},{"style":265},[539],{"type":45,"value":540},"=$(",{"type":39,"tag":236,"props":542,"children":543},{"style":424},[544],{"type":45,"value":545},"grep",{"type":39,"tag":236,"props":547,"children":548},{"style":265},[549],{"type":45,"value":550}," '",{"type":39,"tag":236,"props":552,"children":553},{"style":357},[554],{"type":45,"value":555},"api:",{"type":39,"tag":236,"props":557,"children":558},{"style":265},[559],{"type":45,"value":560},"'",{"type":39,"tag":236,"props":562,"children":563},{"style":357},[564],{"type":45,"value":565}," ~\u002F.endorctl\u002Fconfig.yaml",{"type":39,"tag":236,"props":567,"children":568},{"style":265},[569],{"type":45,"value":570}," |",{"type":39,"tag":236,"props":572,"children":573},{"style":424},[574],{"type":45,"value":575}," awk",{"type":39,"tag":236,"props":577,"children":578},{"style":265},[579],{"type":45,"value":550},{"type":39,"tag":236,"props":581,"children":582},{"style":357},[583],{"type":45,"value":584},"{print $2}",{"type":39,"tag":236,"props":586,"children":587},{"style":265},[588],{"type":45,"value":560},{"type":39,"tag":236,"props":590,"children":591},{"style":265},[592],{"type":45,"value":593},")\n",{"type":39,"tag":236,"props":595,"children":597},{"class":238,"line":596},13,[598,603,607,611,615,619,623,627,631],{"type":39,"tag":236,"props":599,"children":600},{"style":253},[601],{"type":45,"value":602},"  export",{"type":39,"tag":236,"props":604,"children":605},{"style":259},[606],{"type":45,"value":262},{"type":39,"tag":236,"props":608,"children":609},{"style":265},[610],{"type":45,"value":268},{"type":39,"tag":236,"props":612,"children":613},{"style":259},[614],{"type":45,"value":273},{"type":39,"tag":236,"props":616,"children":617},{"style":265},[618],{"type":45,"value":278},{"type":39,"tag":236,"props":620,"children":621},{"style":259},[622],{"type":45,"value":283},{"type":39,"tag":236,"props":624,"children":625},{"style":265},[626],{"type":45,"value":288},{"type":39,"tag":236,"props":628,"children":629},{"style":259},[630],{"type":45,"value":293},{"type":39,"tag":236,"props":632,"children":633},{"style":265},[634],{"type":45,"value":298},{"type":39,"tag":236,"props":636,"children":638},{"class":238,"line":637},14,[639,643,647,652,657],{"type":39,"tag":236,"props":640,"children":641},{"style":351},[642],{"type":45,"value":394},{"type":39,"tag":236,"props":644,"children":645},{"style":265},[646],{"type":45,"value":399},{"type":39,"tag":236,"props":648,"children":649},{"style":357},[650],{"type":45,"value":651},"ENDOR_API=",{"type":39,"tag":236,"props":653,"children":654},{"style":259},[655],{"type":45,"value":656},"$ENDOR_API",{"type":39,"tag":236,"props":658,"children":659},{"style":265},[660],{"type":45,"value":409},{"type":39,"tag":236,"props":662,"children":664},{"class":238,"line":663},15,[665],{"type":39,"tag":236,"props":666,"children":667},{"style":340},[668],{"type":45,"value":417},{"type":39,"tag":236,"props":670,"children":672},{"class":238,"line":671},16,[673,677,681,686],{"type":39,"tag":236,"props":674,"children":675},{"style":351},[676],{"type":45,"value":394},{"type":39,"tag":236,"props":678,"children":679},{"style":265},[680],{"type":45,"value":399},{"type":39,"tag":236,"props":682,"children":683},{"style":357},[684],{"type":45,"value":685},"NOT_AUTHENTICATED",{"type":39,"tag":236,"props":687,"children":688},{"style":265},[689],{"type":45,"value":409},{"type":39,"tag":236,"props":691,"children":693},{"class":238,"line":692},17,[694,698,702,707],{"type":39,"tag":236,"props":695,"children":696},{"style":253},[697],{"type":45,"value":602},{"type":39,"tag":236,"props":699,"children":700},{"style":259},[701],{"type":45,"value":262},{"type":39,"tag":236,"props":703,"children":704},{"style":265},[705],{"type":45,"value":706},"=",{"type":39,"tag":236,"props":708,"children":709},{"style":259},[710],{"type":45,"value":711},"https:\u002F\u002Fapi.endorlabs.com\n",{"type":39,"tag":236,"props":713,"children":715},{"class":238,"line":714},18,[716],{"type":39,"tag":236,"props":717,"children":718},{"style":340},[719],{"type":45,"value":441},{"type":39,"tag":48,"props":721,"children":722},{},[723],{"type":39,"tag":74,"props":724,"children":725},{},[726],{"type":45,"value":727},"Decision tree based on results:",{"type":39,"tag":82,"props":729,"children":730},{},[731,743,774],{"type":39,"tag":70,"props":732,"children":733},{},[734,736,741],{"type":45,"value":735},"If ",{"type":39,"tag":111,"props":737,"children":739},{"className":738},[],[740],{"type":45,"value":404},{"type":45,"value":742},": Immediately go to Step 2 (Download) - DO NOT ask the user, just proceed with installation",{"type":39,"tag":70,"props":744,"children":745},{},[746,747,752,754,759,761],{"type":45,"value":735},{"type":39,"tag":111,"props":748,"children":750},{"className":749},[],[751],{"type":45,"value":513},{"type":45,"value":753},": User is already authenticated → The ",{"type":39,"tag":111,"props":755,"children":757},{"className":756},[],[758],{"type":45,"value":273},{"type":45,"value":760}," has been extracted using the grep command above. Go to Step 3 (Ask for Namespace). ",{"type":39,"tag":74,"props":762,"children":763},{},[764,766,772],{"type":45,"value":765},"Do NOT run ",{"type":39,"tag":111,"props":767,"children":769},{"className":768},[],[770],{"type":45,"value":771},"cat",{"type":45,"value":773}," on the config file.",{"type":39,"tag":70,"props":775,"children":776},{},[777,778,783],{"type":45,"value":735},{"type":39,"tag":111,"props":779,"children":781},{"className":780},[],[782],{"type":45,"value":685},{"type":45,"value":784},": Go to Step 4 (Authenticate), then Step 3 (Ask for Namespace)",{"type":39,"tag":48,"props":786,"children":787},{},[788,793],{"type":39,"tag":74,"props":789,"children":790},{},[791],{"type":45,"value":792},"CRITICAL",{"type":45,"value":794},": The config file check is ONLY to determine if authentication is already set up. Even if a namespace exists in the config, you MUST still ask the user which namespace they want to use before running the scan. Never assume the namespace from the config file.",{"type":39,"tag":54,"props":796,"children":798},{"id":797},"step-2-download-endorctl-required-if-not_installed",[799],{"type":45,"value":800},"Step 2: Download endorctl (REQUIRED if NOT_INSTALLED)",{"type":39,"tag":48,"props":802,"children":803},{},[804,809],{"type":39,"tag":74,"props":805,"children":806},{},[807],{"type":45,"value":808},"When to execute",{"type":45,"value":810},": Automatically execute this step if Step 1 shows \"NOT_INSTALLED\".",{"type":39,"tag":812,"props":813,"children":815},"h3",{"id":814},"macos-installation-ask-user-to-choose",[816],{"type":45,"value":817},"macOS Installation (ASK USER TO CHOOSE)",{"type":39,"tag":48,"props":819,"children":820},{},[821,825],{"type":39,"tag":74,"props":822,"children":823},{},[824],{"type":45,"value":312},{"type":45,"value":826},": On macOS, ALWAYS ask the user which installation method they prefer before proceeding:",{"type":39,"tag":48,"props":828,"children":829},{},[830],{"type":45,"value":831},"Present these two options using AskUserQuestion:",{"type":39,"tag":66,"props":833,"children":834},{},[835,853],{"type":39,"tag":70,"props":836,"children":837},{},[838,843,845,851],{"type":39,"tag":74,"props":839,"children":840},{},[841],{"type":45,"value":842},"Homebrew (Recommended)",{"type":45,"value":844}," - Uses ",{"type":39,"tag":111,"props":846,"children":848},{"className":847},[],[849],{"type":45,"value":850},"brew tap endorlabs\u002Ftap && brew install endorctl",{"type":45,"value":852},". Easier to update later.",{"type":39,"tag":70,"props":854,"children":855},{},[856,861],{"type":39,"tag":74,"props":857,"children":858},{},[859],{"type":45,"value":860},"Direct Download",{"type":45,"value":862}," - Downloads binary directly from api.endorlabs.com. No Homebrew required.",{"type":39,"tag":864,"props":865,"children":867},"h4",{"id":866},"option-1-homebrew-installation-macos",[868],{"type":45,"value":869},"Option 1: Homebrew Installation (macOS)",{"type":39,"tag":225,"props":871,"children":873},{"className":227,"code":872,"language":229,"meta":230,"style":230},"brew tap endorlabs\u002Ftap\nbrew install endorctl\n",[874],{"type":39,"tag":111,"props":875,"children":876},{"__ignoreMap":230},[877,895],{"type":39,"tag":236,"props":878,"children":879},{"class":238,"line":239},[880,885,890],{"type":39,"tag":236,"props":881,"children":882},{"style":424},[883],{"type":45,"value":884},"brew",{"type":39,"tag":236,"props":886,"children":887},{"style":357},[888],{"type":45,"value":889}," tap",{"type":39,"tag":236,"props":891,"children":892},{"style":357},[893],{"type":45,"value":894}," endorlabs\u002Ftap\n",{"type":39,"tag":236,"props":896,"children":897},{"class":238,"line":249},[898,902,907],{"type":39,"tag":236,"props":899,"children":900},{"style":424},[901],{"type":45,"value":884},{"type":39,"tag":236,"props":903,"children":904},{"style":357},[905],{"type":45,"value":906}," install",{"type":39,"tag":236,"props":908,"children":909},{"style":357},[910],{"type":45,"value":911}," endorctl\n",{"type":39,"tag":864,"props":913,"children":915},{"id":914},"option-2-direct-download-installation-macos",[916],{"type":45,"value":917},"Option 2: Direct Download Installation (macOS)",{"type":39,"tag":225,"props":919,"children":921},{"className":227,"code":920,"language":229,"meta":230,"style":230},"ARCH=$(uname -m)\ncase \"$ARCH\" in\n  x86_64|amd64) ARCH=\"amd64\" ;;\n  arm64|aarch64) ARCH=\"arm64\" ;;\nesac\n\nBINARY=\"endorctl_macos_${ARCH}\"\necho \"Downloading $BINARY...\"\ncurl -L \"https:\u002F\u002Fapi.endorlabs.com\u002Fdownload\u002Flatest\u002F$BINARY\" -o endorctl\n\n# Verify checksum\nEXPECTED_SHA=$(curl -s \"https:\u002F\u002Fapi.endorlabs.com\u002Fsha\u002Flatest\u002F$BINARY\")\necho \"$EXPECTED_SHA  endorctl\" | shasum -a 256 -c\n\nchmod +x .\u002Fendorctl\n\n# Install to ~\u002Fbin\nmkdir -p ~\u002Fbin\nmv endorctl ~\u002Fbin\u002F\nexport PATH=\"$HOME\u002Fbin:$PATH\"\n",[922],{"type":39,"tag":111,"props":923,"children":924},{"__ignoreMap":230},[925,951,978,1027,1073,1081,1088,1123,1154,1193,1200,1208,1250,1299,1306,1324,1331,1339,1357,1375],{"type":39,"tag":236,"props":926,"children":927},{"class":238,"line":239},[928,933,937,942,947],{"type":39,"tag":236,"props":929,"children":930},{"style":259},[931],{"type":45,"value":932},"ARCH",{"type":39,"tag":236,"props":934,"children":935},{"style":265},[936],{"type":45,"value":540},{"type":39,"tag":236,"props":938,"children":939},{"style":424},[940],{"type":45,"value":941},"uname",{"type":39,"tag":236,"props":943,"children":944},{"style":357},[945],{"type":45,"value":946}," -m",{"type":39,"tag":236,"props":948,"children":949},{"style":265},[950],{"type":45,"value":593},{"type":39,"tag":236,"props":952,"children":953},{"class":238,"line":249},[954,959,963,968,973],{"type":39,"tag":236,"props":955,"children":956},{"style":340},[957],{"type":45,"value":958},"case",{"type":39,"tag":236,"props":960,"children":961},{"style":265},[962],{"type":45,"value":399},{"type":39,"tag":236,"props":964,"children":965},{"style":259},[966],{"type":45,"value":967},"$ARCH",{"type":39,"tag":236,"props":969,"children":970},{"style":265},[971],{"type":45,"value":972},"\"",{"type":39,"tag":236,"props":974,"children":975},{"style":340},[976],{"type":45,"value":977}," in\n",{"type":39,"tag":236,"props":979,"children":980},{"class":238,"line":388},[981,986,991,996,1001,1006,1010,1014,1018,1022],{"type":39,"tag":236,"props":982,"children":983},{"style":357},[984],{"type":45,"value":985},"  x86_64",{"type":39,"tag":236,"props":987,"children":988},{"style":265},[989],{"type":45,"value":990},"|",{"type":39,"tag":236,"props":992,"children":993},{"style":357},[994],{"type":45,"value":995},"amd64",{"type":39,"tag":236,"props":997,"children":998},{"style":265},[999],{"type":45,"value":1000},")",{"type":39,"tag":236,"props":1002,"children":1003},{"style":259},[1004],{"type":45,"value":1005}," ARCH",{"type":39,"tag":236,"props":1007,"children":1008},{"style":265},[1009],{"type":45,"value":706},{"type":39,"tag":236,"props":1011,"children":1012},{"style":265},[1013],{"type":45,"value":972},{"type":39,"tag":236,"props":1015,"children":1016},{"style":357},[1017],{"type":45,"value":995},{"type":39,"tag":236,"props":1019,"children":1020},{"style":265},[1021],{"type":45,"value":972},{"type":39,"tag":236,"props":1023,"children":1024},{"style":265},[1025],{"type":45,"value":1026}," ;;\n",{"type":39,"tag":236,"props":1028,"children":1029},{"class":238,"line":26},[1030,1035,1039,1044,1048,1052,1056,1060,1065,1069],{"type":39,"tag":236,"props":1031,"children":1032},{"style":357},[1033],{"type":45,"value":1034},"  arm64",{"type":39,"tag":236,"props":1036,"children":1037},{"style":265},[1038],{"type":45,"value":990},{"type":39,"tag":236,"props":1040,"children":1041},{"style":357},[1042],{"type":45,"value":1043},"aarch64",{"type":39,"tag":236,"props":1045,"children":1046},{"style":265},[1047],{"type":45,"value":1000},{"type":39,"tag":236,"props":1049,"children":1050},{"style":259},[1051],{"type":45,"value":1005},{"type":39,"tag":236,"props":1053,"children":1054},{"style":265},[1055],{"type":45,"value":706},{"type":39,"tag":236,"props":1057,"children":1058},{"style":265},[1059],{"type":45,"value":972},{"type":39,"tag":236,"props":1061,"children":1062},{"style":357},[1063],{"type":45,"value":1064},"arm64",{"type":39,"tag":236,"props":1066,"children":1067},{"style":265},[1068],{"type":45,"value":972},{"type":39,"tag":236,"props":1070,"children":1071},{"style":265},[1072],{"type":45,"value":1026},{"type":39,"tag":236,"props":1074,"children":1075},{"class":238,"line":420},[1076],{"type":39,"tag":236,"props":1077,"children":1078},{"style":340},[1079],{"type":45,"value":1080},"esac\n",{"type":39,"tag":236,"props":1082,"children":1083},{"class":238,"line":435},[1084],{"type":39,"tag":236,"props":1085,"children":1086},{"emptyLinePlaceholder":448},[1087],{"type":45,"value":451},{"type":39,"tag":236,"props":1089,"children":1090},{"class":238,"line":444},[1091,1096,1100,1104,1109,1114,1118],{"type":39,"tag":236,"props":1092,"children":1093},{"style":259},[1094],{"type":45,"value":1095},"BINARY",{"type":39,"tag":236,"props":1097,"children":1098},{"style":265},[1099],{"type":45,"value":706},{"type":39,"tag":236,"props":1101,"children":1102},{"style":265},[1103],{"type":45,"value":972},{"type":39,"tag":236,"props":1105,"children":1106},{"style":357},[1107],{"type":45,"value":1108},"endorctl_macos_",{"type":39,"tag":236,"props":1110,"children":1111},{"style":265},[1112],{"type":45,"value":1113},"${",{"type":39,"tag":236,"props":1115,"children":1116},{"style":259},[1117],{"type":45,"value":932},{"type":39,"tag":236,"props":1119,"children":1120},{"style":265},[1121],{"type":45,"value":1122},"}\"\n",{"type":39,"tag":236,"props":1124,"children":1125},{"class":238,"line":454},[1126,1131,1135,1140,1145,1150],{"type":39,"tag":236,"props":1127,"children":1128},{"style":351},[1129],{"type":45,"value":1130},"echo",{"type":39,"tag":236,"props":1132,"children":1133},{"style":265},[1134],{"type":45,"value":399},{"type":39,"tag":236,"props":1136,"children":1137},{"style":357},[1138],{"type":45,"value":1139},"Downloading ",{"type":39,"tag":236,"props":1141,"children":1142},{"style":259},[1143],{"type":45,"value":1144},"$BINARY",{"type":39,"tag":236,"props":1146,"children":1147},{"style":357},[1148],{"type":45,"value":1149},"...",{"type":39,"tag":236,"props":1151,"children":1152},{"style":265},[1153],{"type":45,"value":409},{"type":39,"tag":236,"props":1155,"children":1156},{"class":238,"line":463},[1157,1162,1167,1171,1176,1180,1184,1189],{"type":39,"tag":236,"props":1158,"children":1159},{"style":424},[1160],{"type":45,"value":1161},"curl",{"type":39,"tag":236,"props":1163,"children":1164},{"style":357},[1165],{"type":45,"value":1166}," -L",{"type":39,"tag":236,"props":1168,"children":1169},{"style":265},[1170],{"type":45,"value":399},{"type":39,"tag":236,"props":1172,"children":1173},{"style":357},[1174],{"type":45,"value":1175},"https:\u002F\u002Fapi.endorlabs.com\u002Fdownload\u002Flatest\u002F",{"type":39,"tag":236,"props":1177,"children":1178},{"style":259},[1179],{"type":45,"value":1144},{"type":39,"tag":236,"props":1181,"children":1182},{"style":265},[1183],{"type":45,"value":972},{"type":39,"tag":236,"props":1185,"children":1186},{"style":357},[1187],{"type":45,"value":1188}," -o",{"type":39,"tag":236,"props":1190,"children":1191},{"style":357},[1192],{"type":45,"value":911},{"type":39,"tag":236,"props":1194,"children":1195},{"class":238,"line":22},[1196],{"type":39,"tag":236,"props":1197,"children":1198},{"emptyLinePlaceholder":448},[1199],{"type":45,"value":451},{"type":39,"tag":236,"props":1201,"children":1202},{"class":238,"line":520},[1203],{"type":39,"tag":236,"props":1204,"children":1205},{"style":243},[1206],{"type":45,"value":1207},"# Verify checksum\n",{"type":39,"tag":236,"props":1209,"children":1210},{"class":238,"line":529},[1211,1216,1220,1224,1229,1233,1238,1242,1246],{"type":39,"tag":236,"props":1212,"children":1213},{"style":259},[1214],{"type":45,"value":1215},"EXPECTED_SHA",{"type":39,"tag":236,"props":1217,"children":1218},{"style":265},[1219],{"type":45,"value":540},{"type":39,"tag":236,"props":1221,"children":1222},{"style":424},[1223],{"type":45,"value":1161},{"type":39,"tag":236,"props":1225,"children":1226},{"style":357},[1227],{"type":45,"value":1228}," -s",{"type":39,"tag":236,"props":1230,"children":1231},{"style":265},[1232],{"type":45,"value":399},{"type":39,"tag":236,"props":1234,"children":1235},{"style":357},[1236],{"type":45,"value":1237},"https:\u002F\u002Fapi.endorlabs.com\u002Fsha\u002Flatest\u002F",{"type":39,"tag":236,"props":1239,"children":1240},{"style":259},[1241],{"type":45,"value":1144},{"type":39,"tag":236,"props":1243,"children":1244},{"style":265},[1245],{"type":45,"value":972},{"type":39,"tag":236,"props":1247,"children":1248},{"style":265},[1249],{"type":45,"value":593},{"type":39,"tag":236,"props":1251,"children":1252},{"class":238,"line":596},[1253,1257,1261,1266,1270,1274,1278,1283,1288,1294],{"type":39,"tag":236,"props":1254,"children":1255},{"style":351},[1256],{"type":45,"value":1130},{"type":39,"tag":236,"props":1258,"children":1259},{"style":265},[1260],{"type":45,"value":399},{"type":39,"tag":236,"props":1262,"children":1263},{"style":259},[1264],{"type":45,"value":1265},"$EXPECTED_SHA",{"type":39,"tag":236,"props":1267,"children":1268},{"style":357},[1269],{"type":45,"value":427},{"type":39,"tag":236,"props":1271,"children":1272},{"style":265},[1273],{"type":45,"value":972},{"type":39,"tag":236,"props":1275,"children":1276},{"style":265},[1277],{"type":45,"value":570},{"type":39,"tag":236,"props":1279,"children":1280},{"style":424},[1281],{"type":45,"value":1282}," shasum",{"type":39,"tag":236,"props":1284,"children":1285},{"style":357},[1286],{"type":45,"value":1287}," -a",{"type":39,"tag":236,"props":1289,"children":1291},{"style":1290},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1292],{"type":45,"value":1293}," 256",{"type":39,"tag":236,"props":1295,"children":1296},{"style":357},[1297],{"type":45,"value":1298}," -c\n",{"type":39,"tag":236,"props":1300,"children":1301},{"class":238,"line":637},[1302],{"type":39,"tag":236,"props":1303,"children":1304},{"emptyLinePlaceholder":448},[1305],{"type":45,"value":451},{"type":39,"tag":236,"props":1307,"children":1308},{"class":238,"line":663},[1309,1314,1319],{"type":39,"tag":236,"props":1310,"children":1311},{"style":424},[1312],{"type":45,"value":1313},"chmod",{"type":39,"tag":236,"props":1315,"children":1316},{"style":357},[1317],{"type":45,"value":1318}," +x",{"type":39,"tag":236,"props":1320,"children":1321},{"style":357},[1322],{"type":45,"value":1323}," .\u002Fendorctl\n",{"type":39,"tag":236,"props":1325,"children":1326},{"class":238,"line":671},[1327],{"type":39,"tag":236,"props":1328,"children":1329},{"emptyLinePlaceholder":448},[1330],{"type":45,"value":451},{"type":39,"tag":236,"props":1332,"children":1333},{"class":238,"line":692},[1334],{"type":39,"tag":236,"props":1335,"children":1336},{"style":243},[1337],{"type":45,"value":1338},"# Install to ~\u002Fbin\n",{"type":39,"tag":236,"props":1340,"children":1341},{"class":238,"line":714},[1342,1347,1352],{"type":39,"tag":236,"props":1343,"children":1344},{"style":424},[1345],{"type":45,"value":1346},"mkdir",{"type":39,"tag":236,"props":1348,"children":1349},{"style":357},[1350],{"type":45,"value":1351}," -p",{"type":39,"tag":236,"props":1353,"children":1354},{"style":357},[1355],{"type":45,"value":1356}," ~\u002Fbin\n",{"type":39,"tag":236,"props":1358,"children":1360},{"class":238,"line":1359},19,[1361,1366,1370],{"type":39,"tag":236,"props":1362,"children":1363},{"style":424},[1364],{"type":45,"value":1365},"mv",{"type":39,"tag":236,"props":1367,"children":1368},{"style":357},[1369],{"type":45,"value":365},{"type":39,"tag":236,"props":1371,"children":1372},{"style":357},[1373],{"type":45,"value":1374}," ~\u002Fbin\u002F\n",{"type":39,"tag":236,"props":1376,"children":1378},{"class":238,"line":1377},20,[1379,1383,1388,1392,1396,1401,1406,1411],{"type":39,"tag":236,"props":1380,"children":1381},{"style":253},[1382],{"type":45,"value":256},{"type":39,"tag":236,"props":1384,"children":1385},{"style":259},[1386],{"type":45,"value":1387}," PATH",{"type":39,"tag":236,"props":1389,"children":1390},{"style":265},[1391],{"type":45,"value":706},{"type":39,"tag":236,"props":1393,"children":1394},{"style":265},[1395],{"type":45,"value":972},{"type":39,"tag":236,"props":1397,"children":1398},{"style":259},[1399],{"type":45,"value":1400},"$HOME",{"type":39,"tag":236,"props":1402,"children":1403},{"style":357},[1404],{"type":45,"value":1405},"\u002Fbin:",{"type":39,"tag":236,"props":1407,"children":1408},{"style":259},[1409],{"type":45,"value":1410},"$PATH",{"type":39,"tag":236,"props":1412,"children":1413},{"style":265},[1414],{"type":45,"value":409},{"type":39,"tag":812,"props":1416,"children":1418},{"id":1417},"linuxwindows-installation-automatic",[1419],{"type":45,"value":1420},"Linux\u002FWindows Installation (Automatic)",{"type":39,"tag":48,"props":1422,"children":1423},{},[1424],{"type":45,"value":1425},"For Linux and Windows, proceed with direct download automatically:",{"type":39,"tag":225,"props":1427,"children":1429},{"className":227,"code":1428,"language":229,"meta":230,"style":230},"#!\u002Fbin\u002Fbash\nset -e\n\nOS=$(uname -s)\nARCH=$(uname -m)\n\n# Normalize OS names\ncase \"$OS\" in\n  Linux*)\n    OS=\"linux\"\n    ;;\n  MINGW*|MSYS*|CYGWIN*)\n    OS=\"windows\"\n    ;;\n  *)\n    echo \"Unsupported operating system: $OS\"\n    exit 1\n    ;;\nesac\n\n# Normalize architecture names\ncase \"$ARCH\" in\n  x86_64|amd64)\n    ARCH=\"amd64\"\n    ;;\n  arm64|aarch64)\n    ARCH=\"arm64\"\n    ;;\n  *)\n    echo \"Unsupported architecture: $ARCH\"\n    exit 1\n    ;;\nesac\n\necho \"Detected platform: $OS $ARCH\"\n\n# Build download URL\nif [ \"$OS\" = \"windows\" ]; then\n  BINARY=\"endorctl_windows_${ARCH}.exe\"\n  OUTPUT=\"endorctl.exe\"\nelse\n  BINARY=\"endorctl_${OS}_${ARCH}\"\n  OUTPUT=\"endorctl\"\nfi\n\necho \"Downloading $BINARY...\"\ncurl -L \"https:\u002F\u002Fapi.endorlabs.com\u002Fdownload\u002Flatest\u002F$BINARY\" -o \"$OUTPUT\"\n\n# Verify checksum\necho \"Verifying checksum...\"\nEXPECTED_SHA=$(curl -s \"https:\u002F\u002Fapi.endorlabs.com\u002Fsha\u002Flatest\u002F$BINARY\")\necho \"$EXPECTED_SHA  $OUTPUT\" | sha256sum -c\n\n# Make executable (not needed for .exe)\nif [ \"$OS\" != \"windows\" ]; then\n  chmod +x \".\u002F$OUTPUT\"\nfi\n\necho \"Installation complete!\"\necho \"Binary location: $(pwd)\u002F$OUTPUT\"\n",[1430],{"type":39,"tag":111,"props":1431,"children":1432},{"__ignoreMap":230},[1433,1441,1454,1461,1485,1508,1515,1523,1547,1564,1589,1597,1632,1656,1663,1671,1696,1709,1716,1723,1730,1739,1763,1783,1808,1816,1836,1860,1868,1876,1901,1913,1921,1929,1937,1967,1975,1984,2034,2078,2104,2112,2162,2187,2195,2203,2231,2276,2284,2292,2313,2353,2391,2399,2408,2457,2487,2495,2503,2524],{"type":39,"tag":236,"props":1434,"children":1435},{"class":238,"line":239},[1436],{"type":39,"tag":236,"props":1437,"children":1438},{"style":243},[1439],{"type":45,"value":1440},"#!\u002Fbin\u002Fbash\n",{"type":39,"tag":236,"props":1442,"children":1443},{"class":238,"line":249},[1444,1449],{"type":39,"tag":236,"props":1445,"children":1446},{"style":351},[1447],{"type":45,"value":1448},"set",{"type":39,"tag":236,"props":1450,"children":1451},{"style":357},[1452],{"type":45,"value":1453}," -e\n",{"type":39,"tag":236,"props":1455,"children":1456},{"class":238,"line":388},[1457],{"type":39,"tag":236,"props":1458,"children":1459},{"emptyLinePlaceholder":448},[1460],{"type":45,"value":451},{"type":39,"tag":236,"props":1462,"children":1463},{"class":238,"line":26},[1464,1469,1473,1477,1481],{"type":39,"tag":236,"props":1465,"children":1466},{"style":259},[1467],{"type":45,"value":1468},"OS",{"type":39,"tag":236,"props":1470,"children":1471},{"style":265},[1472],{"type":45,"value":540},{"type":39,"tag":236,"props":1474,"children":1475},{"style":424},[1476],{"type":45,"value":941},{"type":39,"tag":236,"props":1478,"children":1479},{"style":357},[1480],{"type":45,"value":1228},{"type":39,"tag":236,"props":1482,"children":1483},{"style":265},[1484],{"type":45,"value":593},{"type":39,"tag":236,"props":1486,"children":1487},{"class":238,"line":420},[1488,1492,1496,1500,1504],{"type":39,"tag":236,"props":1489,"children":1490},{"style":259},[1491],{"type":45,"value":932},{"type":39,"tag":236,"props":1493,"children":1494},{"style":265},[1495],{"type":45,"value":540},{"type":39,"tag":236,"props":1497,"children":1498},{"style":424},[1499],{"type":45,"value":941},{"type":39,"tag":236,"props":1501,"children":1502},{"style":357},[1503],{"type":45,"value":946},{"type":39,"tag":236,"props":1505,"children":1506},{"style":265},[1507],{"type":45,"value":593},{"type":39,"tag":236,"props":1509,"children":1510},{"class":238,"line":435},[1511],{"type":39,"tag":236,"props":1512,"children":1513},{"emptyLinePlaceholder":448},[1514],{"type":45,"value":451},{"type":39,"tag":236,"props":1516,"children":1517},{"class":238,"line":444},[1518],{"type":39,"tag":236,"props":1519,"children":1520},{"style":243},[1521],{"type":45,"value":1522},"# Normalize OS names\n",{"type":39,"tag":236,"props":1524,"children":1525},{"class":238,"line":454},[1526,1530,1534,1539,1543],{"type":39,"tag":236,"props":1527,"children":1528},{"style":340},[1529],{"type":45,"value":958},{"type":39,"tag":236,"props":1531,"children":1532},{"style":265},[1533],{"type":45,"value":399},{"type":39,"tag":236,"props":1535,"children":1536},{"style":259},[1537],{"type":45,"value":1538},"$OS",{"type":39,"tag":236,"props":1540,"children":1541},{"style":265},[1542],{"type":45,"value":972},{"type":39,"tag":236,"props":1544,"children":1545},{"style":340},[1546],{"type":45,"value":977},{"type":39,"tag":236,"props":1548,"children":1549},{"class":238,"line":463},[1550,1555,1560],{"type":39,"tag":236,"props":1551,"children":1552},{"style":357},[1553],{"type":45,"value":1554},"  Linux",{"type":39,"tag":236,"props":1556,"children":1557},{"style":265},[1558],{"type":45,"value":1559},"*",{"type":39,"tag":236,"props":1561,"children":1562},{"style":265},[1563],{"type":45,"value":593},{"type":39,"tag":236,"props":1565,"children":1566},{"class":238,"line":22},[1567,1572,1576,1580,1585],{"type":39,"tag":236,"props":1568,"children":1569},{"style":259},[1570],{"type":45,"value":1571},"    OS",{"type":39,"tag":236,"props":1573,"children":1574},{"style":265},[1575],{"type":45,"value":706},{"type":39,"tag":236,"props":1577,"children":1578},{"style":265},[1579],{"type":45,"value":972},{"type":39,"tag":236,"props":1581,"children":1582},{"style":357},[1583],{"type":45,"value":1584},"linux",{"type":39,"tag":236,"props":1586,"children":1587},{"style":265},[1588],{"type":45,"value":409},{"type":39,"tag":236,"props":1590,"children":1591},{"class":238,"line":520},[1592],{"type":39,"tag":236,"props":1593,"children":1594},{"style":265},[1595],{"type":45,"value":1596},"    ;;\n",{"type":39,"tag":236,"props":1598,"children":1599},{"class":238,"line":529},[1600,1605,1610,1615,1619,1624,1628],{"type":39,"tag":236,"props":1601,"children":1602},{"style":357},[1603],{"type":45,"value":1604},"  MINGW",{"type":39,"tag":236,"props":1606,"children":1607},{"style":265},[1608],{"type":45,"value":1609},"*|",{"type":39,"tag":236,"props":1611,"children":1612},{"style":357},[1613],{"type":45,"value":1614},"MSYS",{"type":39,"tag":236,"props":1616,"children":1617},{"style":265},[1618],{"type":45,"value":1609},{"type":39,"tag":236,"props":1620,"children":1621},{"style":357},[1622],{"type":45,"value":1623},"CYGWIN",{"type":39,"tag":236,"props":1625,"children":1626},{"style":265},[1627],{"type":45,"value":1559},{"type":39,"tag":236,"props":1629,"children":1630},{"style":265},[1631],{"type":45,"value":593},{"type":39,"tag":236,"props":1633,"children":1634},{"class":238,"line":596},[1635,1639,1643,1647,1652],{"type":39,"tag":236,"props":1636,"children":1637},{"style":259},[1638],{"type":45,"value":1571},{"type":39,"tag":236,"props":1640,"children":1641},{"style":265},[1642],{"type":45,"value":706},{"type":39,"tag":236,"props":1644,"children":1645},{"style":265},[1646],{"type":45,"value":972},{"type":39,"tag":236,"props":1648,"children":1649},{"style":357},[1650],{"type":45,"value":1651},"windows",{"type":39,"tag":236,"props":1653,"children":1654},{"style":265},[1655],{"type":45,"value":409},{"type":39,"tag":236,"props":1657,"children":1658},{"class":238,"line":637},[1659],{"type":39,"tag":236,"props":1660,"children":1661},{"style":265},[1662],{"type":45,"value":1596},{"type":39,"tag":236,"props":1664,"children":1665},{"class":238,"line":663},[1666],{"type":39,"tag":236,"props":1667,"children":1668},{"style":265},[1669],{"type":45,"value":1670},"  *)\n",{"type":39,"tag":236,"props":1672,"children":1673},{"class":238,"line":671},[1674,1679,1683,1688,1692],{"type":39,"tag":236,"props":1675,"children":1676},{"style":351},[1677],{"type":45,"value":1678},"    echo",{"type":39,"tag":236,"props":1680,"children":1681},{"style":265},[1682],{"type":45,"value":399},{"type":39,"tag":236,"props":1684,"children":1685},{"style":357},[1686],{"type":45,"value":1687},"Unsupported operating system: ",{"type":39,"tag":236,"props":1689,"children":1690},{"style":259},[1691],{"type":45,"value":1538},{"type":39,"tag":236,"props":1693,"children":1694},{"style":265},[1695],{"type":45,"value":409},{"type":39,"tag":236,"props":1697,"children":1698},{"class":238,"line":692},[1699,1704],{"type":39,"tag":236,"props":1700,"children":1701},{"style":351},[1702],{"type":45,"value":1703},"    exit",{"type":39,"tag":236,"props":1705,"children":1706},{"style":1290},[1707],{"type":45,"value":1708}," 1\n",{"type":39,"tag":236,"props":1710,"children":1711},{"class":238,"line":714},[1712],{"type":39,"tag":236,"props":1713,"children":1714},{"style":265},[1715],{"type":45,"value":1596},{"type":39,"tag":236,"props":1717,"children":1718},{"class":238,"line":1359},[1719],{"type":39,"tag":236,"props":1720,"children":1721},{"style":340},[1722],{"type":45,"value":1080},{"type":39,"tag":236,"props":1724,"children":1725},{"class":238,"line":1377},[1726],{"type":39,"tag":236,"props":1727,"children":1728},{"emptyLinePlaceholder":448},[1729],{"type":45,"value":451},{"type":39,"tag":236,"props":1731,"children":1733},{"class":238,"line":1732},21,[1734],{"type":39,"tag":236,"props":1735,"children":1736},{"style":243},[1737],{"type":45,"value":1738},"# Normalize architecture names\n",{"type":39,"tag":236,"props":1740,"children":1742},{"class":238,"line":1741},22,[1743,1747,1751,1755,1759],{"type":39,"tag":236,"props":1744,"children":1745},{"style":340},[1746],{"type":45,"value":958},{"type":39,"tag":236,"props":1748,"children":1749},{"style":265},[1750],{"type":45,"value":399},{"type":39,"tag":236,"props":1752,"children":1753},{"style":259},[1754],{"type":45,"value":967},{"type":39,"tag":236,"props":1756,"children":1757},{"style":265},[1758],{"type":45,"value":972},{"type":39,"tag":236,"props":1760,"children":1761},{"style":340},[1762],{"type":45,"value":977},{"type":39,"tag":236,"props":1764,"children":1766},{"class":238,"line":1765},23,[1767,1771,1775,1779],{"type":39,"tag":236,"props":1768,"children":1769},{"style":357},[1770],{"type":45,"value":985},{"type":39,"tag":236,"props":1772,"children":1773},{"style":265},[1774],{"type":45,"value":990},{"type":39,"tag":236,"props":1776,"children":1777},{"style":357},[1778],{"type":45,"value":995},{"type":39,"tag":236,"props":1780,"children":1781},{"style":265},[1782],{"type":45,"value":593},{"type":39,"tag":236,"props":1784,"children":1786},{"class":238,"line":1785},24,[1787,1792,1796,1800,1804],{"type":39,"tag":236,"props":1788,"children":1789},{"style":259},[1790],{"type":45,"value":1791},"    ARCH",{"type":39,"tag":236,"props":1793,"children":1794},{"style":265},[1795],{"type":45,"value":706},{"type":39,"tag":236,"props":1797,"children":1798},{"style":265},[1799],{"type":45,"value":972},{"type":39,"tag":236,"props":1801,"children":1802},{"style":357},[1803],{"type":45,"value":995},{"type":39,"tag":236,"props":1805,"children":1806},{"style":265},[1807],{"type":45,"value":409},{"type":39,"tag":236,"props":1809,"children":1811},{"class":238,"line":1810},25,[1812],{"type":39,"tag":236,"props":1813,"children":1814},{"style":265},[1815],{"type":45,"value":1596},{"type":39,"tag":236,"props":1817,"children":1819},{"class":238,"line":1818},26,[1820,1824,1828,1832],{"type":39,"tag":236,"props":1821,"children":1822},{"style":357},[1823],{"type":45,"value":1034},{"type":39,"tag":236,"props":1825,"children":1826},{"style":265},[1827],{"type":45,"value":990},{"type":39,"tag":236,"props":1829,"children":1830},{"style":357},[1831],{"type":45,"value":1043},{"type":39,"tag":236,"props":1833,"children":1834},{"style":265},[1835],{"type":45,"value":593},{"type":39,"tag":236,"props":1837,"children":1839},{"class":238,"line":1838},27,[1840,1844,1848,1852,1856],{"type":39,"tag":236,"props":1841,"children":1842},{"style":259},[1843],{"type":45,"value":1791},{"type":39,"tag":236,"props":1845,"children":1846},{"style":265},[1847],{"type":45,"value":706},{"type":39,"tag":236,"props":1849,"children":1850},{"style":265},[1851],{"type":45,"value":972},{"type":39,"tag":236,"props":1853,"children":1854},{"style":357},[1855],{"type":45,"value":1064},{"type":39,"tag":236,"props":1857,"children":1858},{"style":265},[1859],{"type":45,"value":409},{"type":39,"tag":236,"props":1861,"children":1863},{"class":238,"line":1862},28,[1864],{"type":39,"tag":236,"props":1865,"children":1866},{"style":265},[1867],{"type":45,"value":1596},{"type":39,"tag":236,"props":1869,"children":1871},{"class":238,"line":1870},29,[1872],{"type":39,"tag":236,"props":1873,"children":1874},{"style":265},[1875],{"type":45,"value":1670},{"type":39,"tag":236,"props":1877,"children":1879},{"class":238,"line":1878},30,[1880,1884,1888,1893,1897],{"type":39,"tag":236,"props":1881,"children":1882},{"style":351},[1883],{"type":45,"value":1678},{"type":39,"tag":236,"props":1885,"children":1886},{"style":265},[1887],{"type":45,"value":399},{"type":39,"tag":236,"props":1889,"children":1890},{"style":357},[1891],{"type":45,"value":1892},"Unsupported architecture: ",{"type":39,"tag":236,"props":1894,"children":1895},{"style":259},[1896],{"type":45,"value":967},{"type":39,"tag":236,"props":1898,"children":1899},{"style":265},[1900],{"type":45,"value":409},{"type":39,"tag":236,"props":1902,"children":1904},{"class":238,"line":1903},31,[1905,1909],{"type":39,"tag":236,"props":1906,"children":1907},{"style":351},[1908],{"type":45,"value":1703},{"type":39,"tag":236,"props":1910,"children":1911},{"style":1290},[1912],{"type":45,"value":1708},{"type":39,"tag":236,"props":1914,"children":1916},{"class":238,"line":1915},32,[1917],{"type":39,"tag":236,"props":1918,"children":1919},{"style":265},[1920],{"type":45,"value":1596},{"type":39,"tag":236,"props":1922,"children":1924},{"class":238,"line":1923},33,[1925],{"type":39,"tag":236,"props":1926,"children":1927},{"style":340},[1928],{"type":45,"value":1080},{"type":39,"tag":236,"props":1930,"children":1932},{"class":238,"line":1931},34,[1933],{"type":39,"tag":236,"props":1934,"children":1935},{"emptyLinePlaceholder":448},[1936],{"type":45,"value":451},{"type":39,"tag":236,"props":1938,"children":1940},{"class":238,"line":1939},35,[1941,1945,1949,1954,1958,1963],{"type":39,"tag":236,"props":1942,"children":1943},{"style":351},[1944],{"type":45,"value":1130},{"type":39,"tag":236,"props":1946,"children":1947},{"style":265},[1948],{"type":45,"value":399},{"type":39,"tag":236,"props":1950,"children":1951},{"style":357},[1952],{"type":45,"value":1953},"Detected platform: ",{"type":39,"tag":236,"props":1955,"children":1956},{"style":259},[1957],{"type":45,"value":1538},{"type":39,"tag":236,"props":1959,"children":1960},{"style":259},[1961],{"type":45,"value":1962}," $ARCH",{"type":39,"tag":236,"props":1964,"children":1965},{"style":265},[1966],{"type":45,"value":409},{"type":39,"tag":236,"props":1968,"children":1970},{"class":238,"line":1969},36,[1971],{"type":39,"tag":236,"props":1972,"children":1973},{"emptyLinePlaceholder":448},[1974],{"type":45,"value":451},{"type":39,"tag":236,"props":1976,"children":1978},{"class":238,"line":1977},37,[1979],{"type":39,"tag":236,"props":1980,"children":1981},{"style":243},[1982],{"type":45,"value":1983},"# Build download URL\n",{"type":39,"tag":236,"props":1985,"children":1987},{"class":238,"line":1986},38,[1988,1992,1996,2000,2004,2008,2013,2017,2021,2025,2030],{"type":39,"tag":236,"props":1989,"children":1990},{"style":340},[1991],{"type":45,"value":343},{"type":39,"tag":236,"props":1993,"children":1994},{"style":265},[1995],{"type":45,"value":473},{"type":39,"tag":236,"props":1997,"children":1998},{"style":265},[1999],{"type":45,"value":399},{"type":39,"tag":236,"props":2001,"children":2002},{"style":259},[2003],{"type":45,"value":1538},{"type":39,"tag":236,"props":2005,"children":2006},{"style":265},[2007],{"type":45,"value":972},{"type":39,"tag":236,"props":2009,"children":2010},{"style":265},[2011],{"type":45,"value":2012}," =",{"type":39,"tag":236,"props":2014,"children":2015},{"style":265},[2016],{"type":45,"value":399},{"type":39,"tag":236,"props":2018,"children":2019},{"style":357},[2020],{"type":45,"value":1651},{"type":39,"tag":236,"props":2022,"children":2023},{"style":265},[2024],{"type":45,"value":972},{"type":39,"tag":236,"props":2026,"children":2027},{"style":265},[2028],{"type":45,"value":2029}," ];",{"type":39,"tag":236,"props":2031,"children":2032},{"style":340},[2033],{"type":45,"value":385},{"type":39,"tag":236,"props":2035,"children":2037},{"class":238,"line":2036},39,[2038,2043,2047,2051,2056,2060,2064,2069,2074],{"type":39,"tag":236,"props":2039,"children":2040},{"style":259},[2041],{"type":45,"value":2042},"  BINARY",{"type":39,"tag":236,"props":2044,"children":2045},{"style":265},[2046],{"type":45,"value":706},{"type":39,"tag":236,"props":2048,"children":2049},{"style":265},[2050],{"type":45,"value":972},{"type":39,"tag":236,"props":2052,"children":2053},{"style":357},[2054],{"type":45,"value":2055},"endorctl_windows_",{"type":39,"tag":236,"props":2057,"children":2058},{"style":265},[2059],{"type":45,"value":1113},{"type":39,"tag":236,"props":2061,"children":2062},{"style":259},[2063],{"type":45,"value":932},{"type":39,"tag":236,"props":2065,"children":2066},{"style":265},[2067],{"type":45,"value":2068},"}",{"type":39,"tag":236,"props":2070,"children":2071},{"style":357},[2072],{"type":45,"value":2073},".exe",{"type":39,"tag":236,"props":2075,"children":2076},{"style":265},[2077],{"type":45,"value":409},{"type":39,"tag":236,"props":2079,"children":2081},{"class":238,"line":2080},40,[2082,2087,2091,2095,2100],{"type":39,"tag":236,"props":2083,"children":2084},{"style":259},[2085],{"type":45,"value":2086},"  OUTPUT",{"type":39,"tag":236,"props":2088,"children":2089},{"style":265},[2090],{"type":45,"value":706},{"type":39,"tag":236,"props":2092,"children":2093},{"style":265},[2094],{"type":45,"value":972},{"type":39,"tag":236,"props":2096,"children":2097},{"style":357},[2098],{"type":45,"value":2099},"endorctl.exe",{"type":39,"tag":236,"props":2101,"children":2102},{"style":265},[2103],{"type":45,"value":409},{"type":39,"tag":236,"props":2105,"children":2107},{"class":238,"line":2106},41,[2108],{"type":39,"tag":236,"props":2109,"children":2110},{"style":340},[2111],{"type":45,"value":417},{"type":39,"tag":236,"props":2113,"children":2115},{"class":238,"line":2114},42,[2116,2120,2124,2128,2133,2137,2141,2145,2150,2154,2158],{"type":39,"tag":236,"props":2117,"children":2118},{"style":259},[2119],{"type":45,"value":2042},{"type":39,"tag":236,"props":2121,"children":2122},{"style":265},[2123],{"type":45,"value":706},{"type":39,"tag":236,"props":2125,"children":2126},{"style":265},[2127],{"type":45,"value":972},{"type":39,"tag":236,"props":2129,"children":2130},{"style":357},[2131],{"type":45,"value":2132},"endorctl_",{"type":39,"tag":236,"props":2134,"children":2135},{"style":265},[2136],{"type":45,"value":1113},{"type":39,"tag":236,"props":2138,"children":2139},{"style":259},[2140],{"type":45,"value":1468},{"type":39,"tag":236,"props":2142,"children":2143},{"style":265},[2144],{"type":45,"value":2068},{"type":39,"tag":236,"props":2146,"children":2147},{"style":357},[2148],{"type":45,"value":2149},"_",{"type":39,"tag":236,"props":2151,"children":2152},{"style":265},[2153],{"type":45,"value":1113},{"type":39,"tag":236,"props":2155,"children":2156},{"style":259},[2157],{"type":45,"value":932},{"type":39,"tag":236,"props":2159,"children":2160},{"style":265},[2161],{"type":45,"value":1122},{"type":39,"tag":236,"props":2163,"children":2165},{"class":238,"line":2164},43,[2166,2170,2174,2178,2183],{"type":39,"tag":236,"props":2167,"children":2168},{"style":259},[2169],{"type":45,"value":2086},{"type":39,"tag":236,"props":2171,"children":2172},{"style":265},[2173],{"type":45,"value":706},{"type":39,"tag":236,"props":2175,"children":2176},{"style":265},[2177],{"type":45,"value":972},{"type":39,"tag":236,"props":2179,"children":2180},{"style":357},[2181],{"type":45,"value":2182},"endorctl",{"type":39,"tag":236,"props":2184,"children":2185},{"style":265},[2186],{"type":45,"value":409},{"type":39,"tag":236,"props":2188,"children":2190},{"class":238,"line":2189},44,[2191],{"type":39,"tag":236,"props":2192,"children":2193},{"style":340},[2194],{"type":45,"value":441},{"type":39,"tag":236,"props":2196,"children":2198},{"class":238,"line":2197},45,[2199],{"type":39,"tag":236,"props":2200,"children":2201},{"emptyLinePlaceholder":448},[2202],{"type":45,"value":451},{"type":39,"tag":236,"props":2204,"children":2206},{"class":238,"line":2205},46,[2207,2211,2215,2219,2223,2227],{"type":39,"tag":236,"props":2208,"children":2209},{"style":351},[2210],{"type":45,"value":1130},{"type":39,"tag":236,"props":2212,"children":2213},{"style":265},[2214],{"type":45,"value":399},{"type":39,"tag":236,"props":2216,"children":2217},{"style":357},[2218],{"type":45,"value":1139},{"type":39,"tag":236,"props":2220,"children":2221},{"style":259},[2222],{"type":45,"value":1144},{"type":39,"tag":236,"props":2224,"children":2225},{"style":357},[2226],{"type":45,"value":1149},{"type":39,"tag":236,"props":2228,"children":2229},{"style":265},[2230],{"type":45,"value":409},{"type":39,"tag":236,"props":2232,"children":2234},{"class":238,"line":2233},47,[2235,2239,2243,2247,2251,2255,2259,2263,2267,2272],{"type":39,"tag":236,"props":2236,"children":2237},{"style":424},[2238],{"type":45,"value":1161},{"type":39,"tag":236,"props":2240,"children":2241},{"style":357},[2242],{"type":45,"value":1166},{"type":39,"tag":236,"props":2244,"children":2245},{"style":265},[2246],{"type":45,"value":399},{"type":39,"tag":236,"props":2248,"children":2249},{"style":357},[2250],{"type":45,"value":1175},{"type":39,"tag":236,"props":2252,"children":2253},{"style":259},[2254],{"type":45,"value":1144},{"type":39,"tag":236,"props":2256,"children":2257},{"style":265},[2258],{"type":45,"value":972},{"type":39,"tag":236,"props":2260,"children":2261},{"style":357},[2262],{"type":45,"value":1188},{"type":39,"tag":236,"props":2264,"children":2265},{"style":265},[2266],{"type":45,"value":399},{"type":39,"tag":236,"props":2268,"children":2269},{"style":259},[2270],{"type":45,"value":2271},"$OUTPUT",{"type":39,"tag":236,"props":2273,"children":2274},{"style":265},[2275],{"type":45,"value":409},{"type":39,"tag":236,"props":2277,"children":2279},{"class":238,"line":2278},48,[2280],{"type":39,"tag":236,"props":2281,"children":2282},{"emptyLinePlaceholder":448},[2283],{"type":45,"value":451},{"type":39,"tag":236,"props":2285,"children":2287},{"class":238,"line":2286},49,[2288],{"type":39,"tag":236,"props":2289,"children":2290},{"style":243},[2291],{"type":45,"value":1207},{"type":39,"tag":236,"props":2293,"children":2295},{"class":238,"line":2294},50,[2296,2300,2304,2309],{"type":39,"tag":236,"props":2297,"children":2298},{"style":351},[2299],{"type":45,"value":1130},{"type":39,"tag":236,"props":2301,"children":2302},{"style":265},[2303],{"type":45,"value":399},{"type":39,"tag":236,"props":2305,"children":2306},{"style":357},[2307],{"type":45,"value":2308},"Verifying checksum...",{"type":39,"tag":236,"props":2310,"children":2311},{"style":265},[2312],{"type":45,"value":409},{"type":39,"tag":236,"props":2314,"children":2316},{"class":238,"line":2315},51,[2317,2321,2325,2329,2333,2337,2341,2345,2349],{"type":39,"tag":236,"props":2318,"children":2319},{"style":259},[2320],{"type":45,"value":1215},{"type":39,"tag":236,"props":2322,"children":2323},{"style":265},[2324],{"type":45,"value":540},{"type":39,"tag":236,"props":2326,"children":2327},{"style":424},[2328],{"type":45,"value":1161},{"type":39,"tag":236,"props":2330,"children":2331},{"style":357},[2332],{"type":45,"value":1228},{"type":39,"tag":236,"props":2334,"children":2335},{"style":265},[2336],{"type":45,"value":399},{"type":39,"tag":236,"props":2338,"children":2339},{"style":357},[2340],{"type":45,"value":1237},{"type":39,"tag":236,"props":2342,"children":2343},{"style":259},[2344],{"type":45,"value":1144},{"type":39,"tag":236,"props":2346,"children":2347},{"style":265},[2348],{"type":45,"value":972},{"type":39,"tag":236,"props":2350,"children":2351},{"style":265},[2352],{"type":45,"value":593},{"type":39,"tag":236,"props":2354,"children":2356},{"class":238,"line":2355},52,[2357,2361,2365,2369,2374,2378,2382,2387],{"type":39,"tag":236,"props":2358,"children":2359},{"style":351},[2360],{"type":45,"value":1130},{"type":39,"tag":236,"props":2362,"children":2363},{"style":265},[2364],{"type":45,"value":399},{"type":39,"tag":236,"props":2366,"children":2367},{"style":259},[2368],{"type":45,"value":1265},{"type":39,"tag":236,"props":2370,"children":2371},{"style":259},[2372],{"type":45,"value":2373},"  $OUTPUT",{"type":39,"tag":236,"props":2375,"children":2376},{"style":265},[2377],{"type":45,"value":972},{"type":39,"tag":236,"props":2379,"children":2380},{"style":265},[2381],{"type":45,"value":570},{"type":39,"tag":236,"props":2383,"children":2384},{"style":424},[2385],{"type":45,"value":2386}," sha256sum",{"type":39,"tag":236,"props":2388,"children":2389},{"style":357},[2390],{"type":45,"value":1298},{"type":39,"tag":236,"props":2392,"children":2394},{"class":238,"line":2393},53,[2395],{"type":39,"tag":236,"props":2396,"children":2397},{"emptyLinePlaceholder":448},[2398],{"type":45,"value":451},{"type":39,"tag":236,"props":2400,"children":2402},{"class":238,"line":2401},54,[2403],{"type":39,"tag":236,"props":2404,"children":2405},{"style":243},[2406],{"type":45,"value":2407},"# Make executable (not needed for .exe)\n",{"type":39,"tag":236,"props":2409,"children":2411},{"class":238,"line":2410},55,[2412,2416,2420,2424,2428,2432,2437,2441,2445,2449,2453],{"type":39,"tag":236,"props":2413,"children":2414},{"style":340},[2415],{"type":45,"value":343},{"type":39,"tag":236,"props":2417,"children":2418},{"style":265},[2419],{"type":45,"value":473},{"type":39,"tag":236,"props":2421,"children":2422},{"style":265},[2423],{"type":45,"value":399},{"type":39,"tag":236,"props":2425,"children":2426},{"style":259},[2427],{"type":45,"value":1538},{"type":39,"tag":236,"props":2429,"children":2430},{"style":265},[2431],{"type":45,"value":972},{"type":39,"tag":236,"props":2433,"children":2434},{"style":265},[2435],{"type":45,"value":2436}," !=",{"type":39,"tag":236,"props":2438,"children":2439},{"style":265},[2440],{"type":45,"value":399},{"type":39,"tag":236,"props":2442,"children":2443},{"style":357},[2444],{"type":45,"value":1651},{"type":39,"tag":236,"props":2446,"children":2447},{"style":265},[2448],{"type":45,"value":972},{"type":39,"tag":236,"props":2450,"children":2451},{"style":265},[2452],{"type":45,"value":2029},{"type":39,"tag":236,"props":2454,"children":2455},{"style":340},[2456],{"type":45,"value":385},{"type":39,"tag":236,"props":2458,"children":2460},{"class":238,"line":2459},56,[2461,2466,2470,2474,2479,2483],{"type":39,"tag":236,"props":2462,"children":2463},{"style":424},[2464],{"type":45,"value":2465},"  chmod",{"type":39,"tag":236,"props":2467,"children":2468},{"style":357},[2469],{"type":45,"value":1318},{"type":39,"tag":236,"props":2471,"children":2472},{"style":265},[2473],{"type":45,"value":399},{"type":39,"tag":236,"props":2475,"children":2476},{"style":357},[2477],{"type":45,"value":2478},".\u002F",{"type":39,"tag":236,"props":2480,"children":2481},{"style":259},[2482],{"type":45,"value":2271},{"type":39,"tag":236,"props":2484,"children":2485},{"style":265},[2486],{"type":45,"value":409},{"type":39,"tag":236,"props":2488,"children":2490},{"class":238,"line":2489},57,[2491],{"type":39,"tag":236,"props":2492,"children":2493},{"style":340},[2494],{"type":45,"value":441},{"type":39,"tag":236,"props":2496,"children":2498},{"class":238,"line":2497},58,[2499],{"type":39,"tag":236,"props":2500,"children":2501},{"emptyLinePlaceholder":448},[2502],{"type":45,"value":451},{"type":39,"tag":236,"props":2504,"children":2506},{"class":238,"line":2505},59,[2507,2511,2515,2520],{"type":39,"tag":236,"props":2508,"children":2509},{"style":351},[2510],{"type":45,"value":1130},{"type":39,"tag":236,"props":2512,"children":2513},{"style":265},[2514],{"type":45,"value":399},{"type":39,"tag":236,"props":2516,"children":2517},{"style":357},[2518],{"type":45,"value":2519},"Installation complete!",{"type":39,"tag":236,"props":2521,"children":2522},{"style":265},[2523],{"type":45,"value":409},{"type":39,"tag":236,"props":2525,"children":2527},{"class":238,"line":2526},60,[2528,2532,2536,2541,2546,2551,2555,2560,2564],{"type":39,"tag":236,"props":2529,"children":2530},{"style":351},[2531],{"type":45,"value":1130},{"type":39,"tag":236,"props":2533,"children":2534},{"style":265},[2535],{"type":45,"value":399},{"type":39,"tag":236,"props":2537,"children":2538},{"style":357},[2539],{"type":45,"value":2540},"Binary location: ",{"type":39,"tag":236,"props":2542,"children":2543},{"style":265},[2544],{"type":45,"value":2545},"$(",{"type":39,"tag":236,"props":2547,"children":2548},{"style":351},[2549],{"type":45,"value":2550},"pwd",{"type":39,"tag":236,"props":2552,"children":2553},{"style":265},[2554],{"type":45,"value":1000},{"type":39,"tag":236,"props":2556,"children":2557},{"style":357},[2558],{"type":45,"value":2559},"\u002F",{"type":39,"tag":236,"props":2561,"children":2562},{"style":259},[2563],{"type":45,"value":2271},{"type":39,"tag":236,"props":2565,"children":2566},{"style":265},[2567],{"type":45,"value":409},{"type":39,"tag":48,"props":2569,"children":2570},{},[2571],{"type":45,"value":2572},"After download completes, move the binary to PATH:",{"type":39,"tag":225,"props":2574,"children":2576},{"className":227,"code":2575,"language":229,"meta":230,"style":230},"# Install to ~\u002Fbin\nmkdir -p ~\u002Fbin\nmv endorctl ~\u002Fbin\u002F  # or endorctl.exe on Windows\nexport PATH=\"$HOME\u002Fbin:$PATH\"\n",[2577],{"type":39,"tag":111,"props":2578,"children":2579},{"__ignoreMap":230},[2580,2587,2602,2623],{"type":39,"tag":236,"props":2581,"children":2582},{"class":238,"line":239},[2583],{"type":39,"tag":236,"props":2584,"children":2585},{"style":243},[2586],{"type":45,"value":1338},{"type":39,"tag":236,"props":2588,"children":2589},{"class":238,"line":249},[2590,2594,2598],{"type":39,"tag":236,"props":2591,"children":2592},{"style":424},[2593],{"type":45,"value":1346},{"type":39,"tag":236,"props":2595,"children":2596},{"style":357},[2597],{"type":45,"value":1351},{"type":39,"tag":236,"props":2599,"children":2600},{"style":357},[2601],{"type":45,"value":1356},{"type":39,"tag":236,"props":2603,"children":2604},{"class":238,"line":388},[2605,2609,2613,2618],{"type":39,"tag":236,"props":2606,"children":2607},{"style":424},[2608],{"type":45,"value":1365},{"type":39,"tag":236,"props":2610,"children":2611},{"style":357},[2612],{"type":45,"value":365},{"type":39,"tag":236,"props":2614,"children":2615},{"style":357},[2616],{"type":45,"value":2617}," ~\u002Fbin\u002F",{"type":39,"tag":236,"props":2619,"children":2620},{"style":243},[2621],{"type":45,"value":2622},"  # or endorctl.exe on Windows\n",{"type":39,"tag":236,"props":2624,"children":2625},{"class":238,"line":26},[2626,2630,2634,2638,2642,2646,2650,2654],{"type":39,"tag":236,"props":2627,"children":2628},{"style":253},[2629],{"type":45,"value":256},{"type":39,"tag":236,"props":2631,"children":2632},{"style":259},[2633],{"type":45,"value":1387},{"type":39,"tag":236,"props":2635,"children":2636},{"style":265},[2637],{"type":45,"value":706},{"type":39,"tag":236,"props":2639,"children":2640},{"style":265},[2641],{"type":45,"value":972},{"type":39,"tag":236,"props":2643,"children":2644},{"style":259},[2645],{"type":45,"value":1400},{"type":39,"tag":236,"props":2647,"children":2648},{"style":357},[2649],{"type":45,"value":1405},{"type":39,"tag":236,"props":2651,"children":2652},{"style":259},[2653],{"type":45,"value":1410},{"type":39,"tag":236,"props":2655,"children":2656},{"style":265},[2657],{"type":45,"value":409},{"type":39,"tag":812,"props":2659,"children":2661},{"id":2660},"verify-installation",[2662],{"type":45,"value":2663},"Verify Installation",{"type":39,"tag":48,"props":2665,"children":2666},{},[2667,2669,2674,2676,2682,2684,2689,2691,2697],{"type":45,"value":2668},"Since shell state does not persist between commands, you ",{"type":39,"tag":74,"props":2670,"children":2671},{},[2672],{"type":45,"value":2673},"MUST",{"type":45,"value":2675}," prefix ",{"type":39,"tag":111,"props":2677,"children":2679},{"className":2678},[],[2680],{"type":45,"value":2681},"export PATH=\"$HOME\u002Fbin:$PATH\"",{"type":45,"value":2683}," in every subsequent Bash command that uses ",{"type":39,"tag":111,"props":2685,"children":2687},{"className":2686},[],[2688],{"type":45,"value":2182},{"type":45,"value":2690}," (if it was installed to ",{"type":39,"tag":111,"props":2692,"children":2694},{"className":2693},[],[2695],{"type":45,"value":2696},"~\u002Fbin",{"type":45,"value":2698},").",{"type":39,"tag":48,"props":2700,"children":2701},{},[2702],{"type":45,"value":2703},"After installing endorctl, verify that the download and installation succeeded:",{"type":39,"tag":225,"props":2705,"children":2707},{"className":227,"code":2706,"language":229,"meta":230,"style":230},"export PATH=\"$HOME\u002Fbin:$PATH\"\nendorctl --version\n",[2708],{"type":39,"tag":111,"props":2709,"children":2710},{"__ignoreMap":230},[2711,2746],{"type":39,"tag":236,"props":2712,"children":2713},{"class":238,"line":239},[2714,2718,2722,2726,2730,2734,2738,2742],{"type":39,"tag":236,"props":2715,"children":2716},{"style":253},[2717],{"type":45,"value":256},{"type":39,"tag":236,"props":2719,"children":2720},{"style":259},[2721],{"type":45,"value":1387},{"type":39,"tag":236,"props":2723,"children":2724},{"style":265},[2725],{"type":45,"value":706},{"type":39,"tag":236,"props":2727,"children":2728},{"style":265},[2729],{"type":45,"value":972},{"type":39,"tag":236,"props":2731,"children":2732},{"style":259},[2733],{"type":45,"value":1400},{"type":39,"tag":236,"props":2735,"children":2736},{"style":357},[2737],{"type":45,"value":1405},{"type":39,"tag":236,"props":2739,"children":2740},{"style":259},[2741],{"type":45,"value":1410},{"type":39,"tag":236,"props":2743,"children":2744},{"style":265},[2745],{"type":45,"value":409},{"type":39,"tag":236,"props":2747,"children":2748},{"class":238,"line":249},[2749,2753],{"type":39,"tag":236,"props":2750,"children":2751},{"style":424},[2752],{"type":45,"value":2182},{"type":39,"tag":236,"props":2754,"children":2755},{"style":357},[2756],{"type":45,"value":432},{"type":39,"tag":48,"props":2758,"children":2759},{},[2760],{"type":45,"value":2761},"If this command prints the version information, endorctl has been downloaded and verified successfully. If it fails, retry the installation steps above.",{"type":39,"tag":54,"props":2763,"children":2765},{"id":2764},"step-3-ask-for-namespace-always-required",[2766],{"type":45,"value":2767},"Step 3: Ask for Namespace (ALWAYS REQUIRED)",{"type":39,"tag":48,"props":2769,"children":2770},{},[2771,2775],{"type":39,"tag":74,"props":2772,"children":2773},{},[2774],{"type":45,"value":312},{"type":45,"value":2776},": ALWAYS ask the user for their Endor Labs namespace before running a scan, even if a namespace already exists in the config file.",{"type":39,"tag":82,"props":2778,"children":2779},{},[2780,2785,2790],{"type":39,"tag":70,"props":2781,"children":2782},{},[2783],{"type":45,"value":2784},"If a namespace exists in the config, offer it as a suggestion but still ask for confirmation",{"type":39,"tag":70,"props":2786,"children":2787},{},[2788],{"type":45,"value":2789},"Never assume the user wants to use the same namespace from a previous session",{"type":39,"tag":70,"props":2791,"children":2792},{},[2793],{"type":45,"value":2794},"The user may want to scan against a different namespace (parent or child) each time",{"type":39,"tag":812,"props":2796,"children":2798},{"id":2797},"namespace-hierarchy",[2799],{"type":45,"value":2800},"Namespace Hierarchy",{"type":39,"tag":48,"props":2802,"children":2803},{},[2804],{"type":45,"value":2805},"Endor Labs supports hierarchical namespaces (parent\u002Fchild structure):",{"type":39,"tag":82,"props":2807,"children":2808},{},[2809,2826],{"type":39,"tag":70,"props":2810,"children":2811},{},[2812,2817,2819,2825],{"type":39,"tag":74,"props":2813,"children":2814},{},[2815],{"type":45,"value":2816},"Parent tenant",{"type":45,"value":2818},": The top-level namespace (e.g., ",{"type":39,"tag":111,"props":2820,"children":2822},{"className":2821},[],[2823],{"type":45,"value":2824},"parent",{"type":45,"value":1000},{"type":39,"tag":70,"props":2827,"children":2828},{},[2829,2834,2836,2842],{"type":39,"tag":74,"props":2830,"children":2831},{},[2832],{"type":45,"value":2833},"Child namespace",{"type":45,"value":2835},": A sub-namespace under a parent (e.g., ",{"type":39,"tag":111,"props":2837,"children":2839},{"className":2838},[],[2840],{"type":45,"value":2841},"parent.child-project",{"type":45,"value":1000},{"type":39,"tag":48,"props":2844,"children":2845},{},[2846],{"type":45,"value":2847},"Users can run scans on:",{"type":39,"tag":82,"props":2849,"children":2850},{},[2851,2856],{"type":39,"tag":70,"props":2852,"children":2853},{},[2854],{"type":45,"value":2855},"Their parent tenant namespace",{"type":39,"tag":70,"props":2857,"children":2858},{},[2859,2861,2866],{"type":45,"value":2860},"Any child namespace under their parent tenant (format: ",{"type":39,"tag":111,"props":2862,"children":2864},{"className":2863},[],[2865],{"type":45,"value":154},{"type":45,"value":1000},{"type":39,"tag":48,"props":2868,"children":2869},{},[2870],{"type":45,"value":2871},"Example child namespace usage:",{"type":39,"tag":225,"props":2873,"children":2875},{"className":227,"code":2874,"language":229,"meta":230,"style":230},"# Scan using parent namespace\nendorctl scan --namespace=parent\n\n# Scan using child namespace\nendorctl scan --namespace=parent.my-project\n",[2876],{"type":39,"tag":111,"props":2877,"children":2878},{"__ignoreMap":230},[2879,2887,2904,2911,2919],{"type":39,"tag":236,"props":2880,"children":2881},{"class":238,"line":239},[2882],{"type":39,"tag":236,"props":2883,"children":2884},{"style":243},[2885],{"type":45,"value":2886},"# Scan using parent namespace\n",{"type":39,"tag":236,"props":2888,"children":2889},{"class":238,"line":249},[2890,2894,2899],{"type":39,"tag":236,"props":2891,"children":2892},{"style":424},[2893],{"type":45,"value":2182},{"type":39,"tag":236,"props":2895,"children":2896},{"style":357},[2897],{"type":45,"value":2898}," scan",{"type":39,"tag":236,"props":2900,"children":2901},{"style":357},[2902],{"type":45,"value":2903}," --namespace=parent\n",{"type":39,"tag":236,"props":2905,"children":2906},{"class":238,"line":388},[2907],{"type":39,"tag":236,"props":2908,"children":2909},{"emptyLinePlaceholder":448},[2910],{"type":45,"value":451},{"type":39,"tag":236,"props":2912,"children":2913},{"class":238,"line":26},[2914],{"type":39,"tag":236,"props":2915,"children":2916},{"style":243},[2917],{"type":45,"value":2918},"# Scan using child namespace\n",{"type":39,"tag":236,"props":2920,"children":2921},{"class":238,"line":420},[2922,2926,2930],{"type":39,"tag":236,"props":2923,"children":2924},{"style":424},[2925],{"type":45,"value":2182},{"type":39,"tag":236,"props":2927,"children":2928},{"style":357},[2929],{"type":45,"value":2898},{"type":39,"tag":236,"props":2931,"children":2932},{"style":357},[2933],{"type":45,"value":2934}," --namespace=parent.my-project\n",{"type":39,"tag":812,"props":2936,"children":2938},{"id":2937},"access-error-handling",[2939],{"type":45,"value":2940},"Access Error Handling",{"type":39,"tag":48,"props":2942,"children":2943},{},[2944,2948],{"type":39,"tag":74,"props":2945,"children":2946},{},[2947],{"type":45,"value":312},{"type":45,"value":2949},": If the user does not have access to a tenant or namespace, endorctl will return an access error. When this happens:",{"type":39,"tag":66,"props":2951,"children":2952},{},[2953,2963,2973,3001],{"type":39,"tag":70,"props":2954,"children":2955},{},[2956,2961],{"type":39,"tag":74,"props":2957,"children":2958},{},[2959],{"type":45,"value":2960},"Inform the user clearly",{"type":45,"value":2962},": Tell them they do not have access to the specified tenant\u002Fnamespace",{"type":39,"tag":70,"props":2964,"children":2965},{},[2966,2971],{"type":39,"tag":74,"props":2967,"children":2968},{},[2969],{"type":45,"value":2970},"Show the error message",{"type":45,"value":2972},": Display the actual error from endorctl",{"type":39,"tag":70,"props":2974,"children":2975},{},[2976,2981,2983],{"type":39,"tag":74,"props":2977,"children":2978},{},[2979],{"type":45,"value":2980},"Suggest alternatives",{"type":45,"value":2982},":\n",{"type":39,"tag":82,"props":2984,"children":2985},{},[2986,2991,2996],{"type":39,"tag":70,"props":2987,"children":2988},{},[2989],{"type":45,"value":2990},"Ask if they meant a different namespace",{"type":39,"tag":70,"props":2992,"children":2993},{},[2994],{"type":45,"value":2995},"Suggest they check their permissions in the Endor Labs UI",{"type":39,"tag":70,"props":2997,"children":2998},{},[2999],{"type":45,"value":3000},"Offer to list available tenants they have access to",{"type":39,"tag":70,"props":3002,"children":3003},{},[3004,3009,3011,3019],{"type":39,"tag":74,"props":3005,"children":3006},{},[3007],{"type":45,"value":3008},"Suggest to visit official documentation",{"type":45,"value":3010},": Tell them to visit ",{"type":39,"tag":3012,"props":3013,"children":3017},"a",{"href":3014,"rel":3015},"https:\u002F\u002Fdocs.endorlabs.com\u002Fadministration\u002Fnamespaces\u002F",[3016],"nofollow",[3018],{"type":45,"value":3014},{"type":45,"value":3020}," to know more details on what is a namespace.\nCommon access error patterns:",{"type":39,"tag":82,"props":3022,"children":3023},{},[3024,3035,3054],{"type":39,"tag":70,"props":3025,"children":3026},{},[3027,3033],{"type":39,"tag":111,"props":3028,"children":3030},{"className":3029},[],[3031],{"type":45,"value":3032},"Invalid permissions to run endorctl",{"type":45,"value":3034}," - User lacks access to the namespace",{"type":39,"tag":70,"props":3036,"children":3037},{},[3038,3044,3046,3052],{"type":39,"tag":111,"props":3039,"children":3041},{"className":3040},[],[3042],{"type":45,"value":3043},"unauthorized",{"type":45,"value":3045}," or ",{"type":39,"tag":111,"props":3047,"children":3049},{"className":3048},[],[3050],{"type":45,"value":3051},"403",{"type":45,"value":3053}," errors - Authentication succeeded but authorization failed for that namespace",{"type":39,"tag":70,"props":3055,"children":3056},{},[3057,3063],{"type":39,"tag":111,"props":3058,"children":3060},{"className":3059},[],[3061],{"type":45,"value":3062},"tenant not found",{"type":45,"value":3064}," - The namespace doesn't exist or user has no visibility to it",{"type":39,"tag":812,"props":3066,"children":3068},{"id":3067},"setting-the-namespace",[3069],{"type":45,"value":3070},"Setting the Namespace",{"type":39,"tag":48,"props":3072,"children":3073},{},[3074],{"type":45,"value":3075},"Set via environment variable:",{"type":39,"tag":225,"props":3077,"children":3079},{"className":227,"code":3078,"language":229,"meta":230,"style":230},"export ENDOR_NAMESPACE=\u003Cuser-provided-namespace>\n",[3080],{"type":39,"tag":111,"props":3081,"children":3082},{"__ignoreMap":230},[3083],{"type":39,"tag":236,"props":3084,"children":3085},{"class":238,"line":239},[3086,3090,3095,3100,3105],{"type":39,"tag":236,"props":3087,"children":3088},{"style":253},[3089],{"type":45,"value":256},{"type":39,"tag":236,"props":3091,"children":3092},{"style":259},[3093],{"type":45,"value":3094}," ENDOR_NAMESPACE",{"type":39,"tag":236,"props":3096,"children":3097},{"style":265},[3098],{"type":45,"value":3099},"=\u003C",{"type":39,"tag":236,"props":3101,"children":3102},{"style":259},[3103],{"type":45,"value":3104},"user-provided-namespace",{"type":39,"tag":236,"props":3106,"children":3107},{"style":265},[3108],{"type":45,"value":3109},">\n",{"type":39,"tag":48,"props":3111,"children":3112},{},[3113],{"type":45,"value":3114},"Or pass as flag in scan command:",{"type":39,"tag":225,"props":3116,"children":3118},{"className":227,"code":3117,"language":229,"meta":230,"style":230},"endorctl scan --namespace=\u003Cuser-provided-namespace>\n",[3119],{"type":39,"tag":111,"props":3120,"children":3121},{"__ignoreMap":230},[3122],{"type":39,"tag":236,"props":3123,"children":3124},{"class":238,"line":239},[3125,3129,3133,3138,3143,3147],{"type":39,"tag":236,"props":3126,"children":3127},{"style":424},[3128],{"type":45,"value":2182},{"type":39,"tag":236,"props":3130,"children":3131},{"style":357},[3132],{"type":45,"value":2898},{"type":39,"tag":236,"props":3134,"children":3135},{"style":357},[3136],{"type":45,"value":3137}," --namespace=",{"type":39,"tag":236,"props":3139,"children":3140},{"style":265},[3141],{"type":45,"value":3142},"\u003C",{"type":39,"tag":236,"props":3144,"children":3145},{"style":357},[3146],{"type":45,"value":3104},{"type":39,"tag":236,"props":3148,"children":3149},{"style":265},[3150],{"type":45,"value":3109},{"type":39,"tag":54,"props":3152,"children":3154},{"id":3153},"step-4-authenticate",[3155],{"type":45,"value":3156},"Step 4: Authenticate",{"type":39,"tag":48,"props":3158,"children":3159},{},[3160,3164],{"type":39,"tag":74,"props":3161,"children":3162},{},[3163],{"type":45,"value":312},{"type":45,"value":3165},": You must have already collected the namespace in Step 3 BEFORE running authentication. This is required to avoid interactive prompts.",{"type":39,"tag":812,"props":3167,"children":3169},{"id":3168},"step-4a-ask-authentication-method",[3170],{"type":45,"value":3171},"Step 4a: Ask Authentication Method",{"type":39,"tag":48,"props":3173,"children":3174},{},[3175],{"type":45,"value":3176},"Ask the user using AskUserQuestion with two options:",{"type":39,"tag":66,"props":3178,"children":3179},{},[3180,3190],{"type":39,"tag":70,"props":3181,"children":3182},{},[3183,3188],{"type":39,"tag":74,"props":3184,"children":3185},{},[3186],{"type":45,"value":3187},"CLI Authentication (Recommended)",{"type":45,"value":3189}," - Sign in via browser using your identity provider (Google, GitHub, GitLab, SSO, etc.)",{"type":39,"tag":70,"props":3191,"children":3192},{},[3193,3198],{"type":39,"tag":74,"props":3194,"children":3195},{},[3196],{"type":45,"value":3197},"API Key",{"type":45,"value":3199}," - Use API key and secret for automated\u002FCI environments (no browser needed)",{"type":39,"tag":812,"props":3201,"children":3203},{"id":3202},"option-1-cli-authentication",[3204],{"type":45,"value":3205},"Option 1: CLI Authentication",{"type":39,"tag":864,"props":3207,"children":3209},{"id":3208},"step-4b-ask-for-auth-provider",[3210],{"type":45,"value":3211},"Step 4b: Ask for Auth Provider",{"type":39,"tag":48,"props":3213,"children":3214},{},[3215],{"type":45,"value":3216},"If the user selects CLI Authentication, ask which identity provider they use. Present these options using AskUserQuestion:",{"type":39,"tag":66,"props":3218,"children":3219},{},[3220,3230,3240,3250,3260],{"type":39,"tag":70,"props":3221,"children":3222},{},[3223,3228],{"type":39,"tag":74,"props":3224,"children":3225},{},[3226],{"type":45,"value":3227},"Google",{"type":45,"value":3229}," - Sign in with Google",{"type":39,"tag":70,"props":3231,"children":3232},{},[3233,3238],{"type":39,"tag":74,"props":3234,"children":3235},{},[3236],{"type":45,"value":3237},"GitHub",{"type":45,"value":3239}," - Sign in with GitHub",{"type":39,"tag":70,"props":3241,"children":3242},{},[3243,3248],{"type":39,"tag":74,"props":3244,"children":3245},{},[3246],{"type":45,"value":3247},"GitLab",{"type":45,"value":3249}," - Sign in with GitLab",{"type":39,"tag":70,"props":3251,"children":3252},{},[3253,3258],{"type":39,"tag":74,"props":3254,"children":3255},{},[3256],{"type":45,"value":3257},"Enterprise SSO",{"type":45,"value":3259}," - Sign in via your organization's SSO provider (requires tenant name)",{"type":39,"tag":70,"props":3261,"children":3262},{},[3263,3268],{"type":39,"tag":74,"props":3264,"children":3265},{},[3266],{"type":45,"value":3267},"Browser (generic)",{"type":45,"value":3269}," - Generic browser-based sign-in",{"type":39,"tag":48,"props":3271,"children":3272},{},[3273,3275,3281],{"type":45,"value":3274},"Based on the user's selection, use the corresponding ",{"type":39,"tag":111,"props":3276,"children":3278},{"className":3277},[],[3279],{"type":45,"value":3280},"--auth-mode",{"type":45,"value":3282}," value:",{"type":39,"tag":3284,"props":3285,"children":3286},"table",{},[3287,3316],{"type":39,"tag":3288,"props":3289,"children":3290},"thead",{},[3291],{"type":39,"tag":3292,"props":3293,"children":3294},"tr",{},[3295,3301,3311],{"type":39,"tag":3296,"props":3297,"children":3298},"th",{},[3299],{"type":45,"value":3300},"Provider",{"type":39,"tag":3296,"props":3302,"children":3303},{},[3304,3309],{"type":39,"tag":111,"props":3305,"children":3307},{"className":3306},[],[3308],{"type":45,"value":3280},{"type":45,"value":3310}," value",{"type":39,"tag":3296,"props":3312,"children":3313},{},[3314],{"type":45,"value":3315},"Additional Flags",{"type":39,"tag":3317,"props":3318,"children":3319},"tbody",{},[3320,3342,3362,3382,3407],{"type":39,"tag":3292,"props":3321,"children":3322},{},[3323,3328,3337],{"type":39,"tag":3324,"props":3325,"children":3326},"td",{},[3327],{"type":45,"value":3227},{"type":39,"tag":3324,"props":3329,"children":3330},{},[3331],{"type":39,"tag":111,"props":3332,"children":3334},{"className":3333},[],[3335],{"type":45,"value":3336},"google",{"type":39,"tag":3324,"props":3338,"children":3339},{},[3340],{"type":45,"value":3341},"None",{"type":39,"tag":3292,"props":3343,"children":3344},{},[3345,3349,3358],{"type":39,"tag":3324,"props":3346,"children":3347},{},[3348],{"type":45,"value":3237},{"type":39,"tag":3324,"props":3350,"children":3351},{},[3352],{"type":39,"tag":111,"props":3353,"children":3355},{"className":3354},[],[3356],{"type":45,"value":3357},"github",{"type":39,"tag":3324,"props":3359,"children":3360},{},[3361],{"type":45,"value":3341},{"type":39,"tag":3292,"props":3363,"children":3364},{},[3365,3369,3378],{"type":39,"tag":3324,"props":3366,"children":3367},{},[3368],{"type":45,"value":3247},{"type":39,"tag":3324,"props":3370,"children":3371},{},[3372],{"type":39,"tag":111,"props":3373,"children":3375},{"className":3374},[],[3376],{"type":45,"value":3377},"gitlab",{"type":39,"tag":3324,"props":3379,"children":3380},{},[3381],{"type":45,"value":3341},{"type":39,"tag":3292,"props":3383,"children":3384},{},[3385,3389,3398],{"type":39,"tag":3324,"props":3386,"children":3387},{},[3388],{"type":45,"value":3257},{"type":39,"tag":3324,"props":3390,"children":3391},{},[3392],{"type":39,"tag":111,"props":3393,"children":3395},{"className":3394},[],[3396],{"type":45,"value":3397},"sso",{"type":39,"tag":3324,"props":3399,"children":3400},{},[3401],{"type":39,"tag":111,"props":3402,"children":3404},{"className":3403},[],[3405],{"type":45,"value":3406},"--auth-tenant \u003Ctenant-name>",{"type":39,"tag":3292,"props":3408,"children":3409},{},[3410,3414,3423],{"type":39,"tag":3324,"props":3411,"children":3412},{},[3413],{"type":45,"value":3267},{"type":39,"tag":3324,"props":3415,"children":3416},{},[3417],{"type":39,"tag":111,"props":3418,"children":3420},{"className":3419},[],[3421],{"type":45,"value":3422},"browser-auth",{"type":39,"tag":3324,"props":3424,"children":3425},{},[3426],{"type":45,"value":3341},{"type":39,"tag":48,"props":3428,"children":3429},{},[3430,3435],{"type":39,"tag":74,"props":3431,"children":3432},{},[3433],{"type":45,"value":3434},"For Enterprise SSO only",{"type":45,"value":3436},": After the user selects SSO, also ask them for their SSO tenant name:",{"type":39,"tag":225,"props":3438,"children":3442},{"className":3439,"code":3441,"language":45},[3440],"language-text","\"What is your SSO tenant name? (This is used with --auth-tenant)\"\n",[3443],{"type":39,"tag":111,"props":3444,"children":3445},{"__ignoreMap":230},[3446],{"type":45,"value":3441},{"type":39,"tag":864,"props":3448,"children":3450},{"id":3449},"step-4c-run-authentication-two-step-process-for-cli-authentication",[3451],{"type":45,"value":3452},"Step 4c: Run Authentication (Two-Step Process for CLI Authentication)",{"type":39,"tag":48,"props":3454,"children":3455},{},[3456,3461,3463,3468],{"type":39,"tag":74,"props":3457,"children":3458},{},[3459],{"type":45,"value":3460},"CRITICAL - Multi-Tenant Handling",{"type":45,"value":3462},": Users with access to multiple tenants will be prompted to select a tenant interactively. In non-interactive agent environments, this causes an EOF error. The ",{"type":39,"tag":111,"props":3464,"children":3466},{"className":3465},[],[3467],{"type":45,"value":210},{"type":45,"value":3469}," flag alone does NOT prevent this prompt. This applies to ALL browser-based auth modes.",{"type":39,"tag":48,"props":3471,"children":3472},{},[3473,3475,3481],{"type":45,"value":3474},"Construct the ",{"type":39,"tag":111,"props":3476,"children":3478},{"className":3477},[],[3479],{"type":45,"value":3480},"AUTH_FLAGS",{"type":45,"value":3482}," based on the user's provider selection:",{"type":39,"tag":225,"props":3484,"children":3486},{"className":227,"code":3485,"language":229,"meta":230,"style":230},"# Set AUTH_FLAGS based on user's provider selection\n# Google:           AUTH_FLAGS=\"--auth-mode=google\"\n# GitHub:           AUTH_FLAGS=\"--auth-mode=github\"\n# GitLab:           AUTH_FLAGS=\"--auth-mode=gitlab\"\n# Enterprise SSO:   AUTH_FLAGS=\"--auth-mode=sso --auth-tenant=\u003Ctenant-name>\"\n# Browser (generic): AUTH_FLAGS=\"--auth-mode=browser-auth\"\n",[3487],{"type":39,"tag":111,"props":3488,"children":3489},{"__ignoreMap":230},[3490,3498,3506,3514,3522,3530],{"type":39,"tag":236,"props":3491,"children":3492},{"class":238,"line":239},[3493],{"type":39,"tag":236,"props":3494,"children":3495},{"style":243},[3496],{"type":45,"value":3497},"# Set AUTH_FLAGS based on user's provider selection\n",{"type":39,"tag":236,"props":3499,"children":3500},{"class":238,"line":249},[3501],{"type":39,"tag":236,"props":3502,"children":3503},{"style":243},[3504],{"type":45,"value":3505},"# Google:           AUTH_FLAGS=\"--auth-mode=google\"\n",{"type":39,"tag":236,"props":3507,"children":3508},{"class":238,"line":388},[3509],{"type":39,"tag":236,"props":3510,"children":3511},{"style":243},[3512],{"type":45,"value":3513},"# GitHub:           AUTH_FLAGS=\"--auth-mode=github\"\n",{"type":39,"tag":236,"props":3515,"children":3516},{"class":238,"line":26},[3517],{"type":39,"tag":236,"props":3518,"children":3519},{"style":243},[3520],{"type":45,"value":3521},"# GitLab:           AUTH_FLAGS=\"--auth-mode=gitlab\"\n",{"type":39,"tag":236,"props":3523,"children":3524},{"class":238,"line":420},[3525],{"type":39,"tag":236,"props":3526,"children":3527},{"style":243},[3528],{"type":45,"value":3529},"# Enterprise SSO:   AUTH_FLAGS=\"--auth-mode=sso --auth-tenant=\u003Ctenant-name>\"\n",{"type":39,"tag":236,"props":3531,"children":3532},{"class":238,"line":435},[3533],{"type":39,"tag":236,"props":3534,"children":3535},{"style":243},[3536],{"type":45,"value":3537},"# Browser (generic): AUTH_FLAGS=\"--auth-mode=browser-auth\"\n",{"type":39,"tag":48,"props":3539,"children":3540},{},[3541],{"type":39,"tag":74,"props":3542,"children":3543},{},[3544],{"type":45,"value":3545},"Step 4c-i: Initiate browser oauth and capture tenant list",{"type":39,"tag":48,"props":3547,"children":3548},{},[3549],{"type":45,"value":3550},"Run init and capture output — this will open the browser for OAuth. After browser auth completes, it will show a tenant list if the user has multiple tenants.",{"type":39,"tag":48,"props":3552,"children":3553},{},[3554,3558],{"type":39,"tag":74,"props":3555,"children":3556},{},[3557],{"type":45,"value":312},{"type":45,"value":3559},": Use a timeout to prevent the command from blocking indefinitely at the interactive tenant selection prompt. Shell tools in AI coding agents usually cannot provide interactive input to a running process. The timeout ensures the command exits so the agent can parse the output and proceed to Step 4c-ii.",{"type":39,"tag":225,"props":3561,"children":3563},{"className":227,"code":3562,"language":229,"meta":230,"style":230},"# Run init with a timeout (60s allows time for browser OAuth, but won't hang forever at the tenant prompt)\n# The timeout will kill the process after 60 seconds if it's still waiting for input\ntimeout 60 bash -c 'endorctl init $AUTH_FLAGS --namespace=\u003Cuser-provided-namespace> 2>&1' | tee \u002Ftmp\u002Fendorctl_init_output.txt || true\n",[3564],{"type":39,"tag":111,"props":3565,"children":3566},{"__ignoreMap":230},[3567,3575,3583],{"type":39,"tag":236,"props":3568,"children":3569},{"class":238,"line":239},[3570],{"type":39,"tag":236,"props":3571,"children":3572},{"style":243},[3573],{"type":45,"value":3574},"# Run init with a timeout (60s allows time for browser OAuth, but won't hang forever at the tenant prompt)\n",{"type":39,"tag":236,"props":3576,"children":3577},{"class":238,"line":249},[3578],{"type":39,"tag":236,"props":3579,"children":3580},{"style":243},[3581],{"type":45,"value":3582},"# The timeout will kill the process after 60 seconds if it's still waiting for input\n",{"type":39,"tag":236,"props":3584,"children":3585},{"class":238,"line":388},[3586,3591,3596,3601,3606,3610,3615,3619,3623,3628,3633,3638],{"type":39,"tag":236,"props":3587,"children":3588},{"style":424},[3589],{"type":45,"value":3590},"timeout",{"type":39,"tag":236,"props":3592,"children":3593},{"style":1290},[3594],{"type":45,"value":3595}," 60",{"type":39,"tag":236,"props":3597,"children":3598},{"style":357},[3599],{"type":45,"value":3600}," bash",{"type":39,"tag":236,"props":3602,"children":3603},{"style":357},[3604],{"type":45,"value":3605}," -c",{"type":39,"tag":236,"props":3607,"children":3608},{"style":265},[3609],{"type":45,"value":550},{"type":39,"tag":236,"props":3611,"children":3612},{"style":357},[3613],{"type":45,"value":3614},"endorctl init $AUTH_FLAGS --namespace=\u003Cuser-provided-namespace> 2>&1",{"type":39,"tag":236,"props":3616,"children":3617},{"style":265},[3618],{"type":45,"value":560},{"type":39,"tag":236,"props":3620,"children":3621},{"style":265},[3622],{"type":45,"value":570},{"type":39,"tag":236,"props":3624,"children":3625},{"style":424},[3626],{"type":45,"value":3627}," tee",{"type":39,"tag":236,"props":3629,"children":3630},{"style":357},[3631],{"type":45,"value":3632}," \u002Ftmp\u002Fendorctl_init_output.txt",{"type":39,"tag":236,"props":3634,"children":3635},{"style":265},[3636],{"type":45,"value":3637}," ||",{"type":39,"tag":236,"props":3639,"children":3640},{"style":351},[3641],{"type":45,"value":3642}," true\n",{"type":39,"tag":48,"props":3644,"children":3645},{},[3646],{"type":45,"value":3647},"After this command completes (either successfully or via timeout\u002FEOF), check the captured output:",{"type":39,"tag":225,"props":3649,"children":3651},{"className":227,"code":3650,"language":229,"meta":230,"style":230},"# Check if tenant selection was required\nif grep -q \"Please select the tenant\" \u002Ftmp\u002Fendorctl_init_output.txt; then\n  echo \"MULTI_TENANT_DETECTED\"\n  cat \u002Ftmp\u002Fendorctl_init_output.txt\nfi\n",[3652],{"type":39,"tag":111,"props":3653,"children":3654},{"__ignoreMap":230},[3655,3663,3705,3725,3738],{"type":39,"tag":236,"props":3656,"children":3657},{"class":238,"line":239},[3658],{"type":39,"tag":236,"props":3659,"children":3660},{"style":243},[3661],{"type":45,"value":3662},"# Check if tenant selection was required\n",{"type":39,"tag":236,"props":3664,"children":3665},{"class":238,"line":249},[3666,3670,3675,3680,3684,3689,3693,3697,3701],{"type":39,"tag":236,"props":3667,"children":3668},{"style":340},[3669],{"type":45,"value":343},{"type":39,"tag":236,"props":3671,"children":3672},{"style":424},[3673],{"type":45,"value":3674}," grep",{"type":39,"tag":236,"props":3676,"children":3677},{"style":357},[3678],{"type":45,"value":3679}," -q",{"type":39,"tag":236,"props":3681,"children":3682},{"style":265},[3683],{"type":45,"value":399},{"type":39,"tag":236,"props":3685,"children":3686},{"style":357},[3687],{"type":45,"value":3688},"Please select the tenant",{"type":39,"tag":236,"props":3690,"children":3691},{"style":265},[3692],{"type":45,"value":972},{"type":39,"tag":236,"props":3694,"children":3695},{"style":357},[3696],{"type":45,"value":3632},{"type":39,"tag":236,"props":3698,"children":3699},{"style":265},[3700],{"type":45,"value":380},{"type":39,"tag":236,"props":3702,"children":3703},{"style":340},[3704],{"type":45,"value":385},{"type":39,"tag":236,"props":3706,"children":3707},{"class":238,"line":388},[3708,3712,3716,3721],{"type":39,"tag":236,"props":3709,"children":3710},{"style":351},[3711],{"type":45,"value":394},{"type":39,"tag":236,"props":3713,"children":3714},{"style":265},[3715],{"type":45,"value":399},{"type":39,"tag":236,"props":3717,"children":3718},{"style":357},[3719],{"type":45,"value":3720},"MULTI_TENANT_DETECTED",{"type":39,"tag":236,"props":3722,"children":3723},{"style":265},[3724],{"type":45,"value":409},{"type":39,"tag":236,"props":3726,"children":3727},{"class":238,"line":26},[3728,3733],{"type":39,"tag":236,"props":3729,"children":3730},{"style":424},[3731],{"type":45,"value":3732},"  cat",{"type":39,"tag":236,"props":3734,"children":3735},{"style":357},[3736],{"type":45,"value":3737}," \u002Ftmp\u002Fendorctl_init_output.txt\n",{"type":39,"tag":236,"props":3739,"children":3740},{"class":238,"line":420},[3741],{"type":39,"tag":236,"props":3742,"children":3743},{"style":340},[3744],{"type":45,"value":441},{"type":39,"tag":48,"props":3746,"children":3747},{},[3748],{"type":45,"value":3749},"If the output shows a tenant list like:",{"type":39,"tag":225,"props":3751,"children":3754},{"className":3752,"code":3753,"language":45},[3440],"Your account has access to multiple tenants. Please select the tenant you would like to initialize:\n0 : tenant-a [SYSTEM_ROLE_ADMIN]\n1 : tenant-b [SYSTEM_ROLE_READ_ONLY]\n2 : my-namespace [SYSTEM_ROLE_ADMIN]\nEnter tenant number:\n",[3755],{"type":39,"tag":111,"props":3756,"children":3757},{"__ignoreMap":230},[3758],{"type":45,"value":3753},{"type":39,"tag":48,"props":3760,"children":3761},{},[3762],{"type":45,"value":3763},"Then proceed immediately to Step 4c-ii.",{"type":39,"tag":48,"props":3765,"children":3766},{},[3767],{"type":39,"tag":74,"props":3768,"children":3769},{},[3770],{"type":45,"value":3771},"Step 4c-ii: Re-run with tenant number piped in",{"type":39,"tag":48,"props":3773,"children":3774},{},[3775,3777,3783],{"type":45,"value":3776},"Parse the captured output to find the tenant number matching the user's requested namespace. The tenant number is the number before the ",{"type":39,"tag":111,"props":3778,"children":3780},{"className":3779},[],[3781],{"type":45,"value":3782},":",{"type":45,"value":3784}," on the line containing the namespace name.",{"type":39,"tag":225,"props":3786,"children":3788},{"className":227,"code":3787,"language":229,"meta":230,"style":230},"# Parse the tenant number from the captured output\n# Example: for namespace \"qa-test\", find the line \"15 : qa-test [SYSTEM_ROLE_ADMIN]\" and extract \"15\"\nTENANT_NUM=$(grep -E \"^\\s*[0-9]+ : \u003Cuser-provided-namespace> \" \u002Ftmp\u002Fendorctl_init_output.txt | awk '{print $1}')\necho \"Found tenant number: $TENANT_NUM\"\n\n# Re-run with tenant number piped via stdin (no tee needed this time)\necho \"$TENANT_NUM\" | endorctl init $AUTH_FLAGS --namespace=\u003Cuser-provided-namespace>\n",[3789],{"type":39,"tag":111,"props":3790,"children":3791},{"__ignoreMap":230},[3792,3800,3808,3871,3896,3903,3911],{"type":39,"tag":236,"props":3793,"children":3794},{"class":238,"line":239},[3795],{"type":39,"tag":236,"props":3796,"children":3797},{"style":243},[3798],{"type":45,"value":3799},"# Parse the tenant number from the captured output\n",{"type":39,"tag":236,"props":3801,"children":3802},{"class":238,"line":249},[3803],{"type":39,"tag":236,"props":3804,"children":3805},{"style":243},[3806],{"type":45,"value":3807},"# Example: for namespace \"qa-test\", find the line \"15 : qa-test [SYSTEM_ROLE_ADMIN]\" and extract \"15\"\n",{"type":39,"tag":236,"props":3809,"children":3810},{"class":238,"line":388},[3811,3816,3820,3824,3829,3833,3838,3842,3846,3850,3854,3858,3863,3867],{"type":39,"tag":236,"props":3812,"children":3813},{"style":259},[3814],{"type":45,"value":3815},"TENANT_NUM",{"type":39,"tag":236,"props":3817,"children":3818},{"style":265},[3819],{"type":45,"value":540},{"type":39,"tag":236,"props":3821,"children":3822},{"style":424},[3823],{"type":45,"value":545},{"type":39,"tag":236,"props":3825,"children":3826},{"style":357},[3827],{"type":45,"value":3828}," -E",{"type":39,"tag":236,"props":3830,"children":3831},{"style":265},[3832],{"type":45,"value":399},{"type":39,"tag":236,"props":3834,"children":3835},{"style":357},[3836],{"type":45,"value":3837},"^\\s*[0-9]+ : \u003Cuser-provided-namespace> ",{"type":39,"tag":236,"props":3839,"children":3840},{"style":265},[3841],{"type":45,"value":972},{"type":39,"tag":236,"props":3843,"children":3844},{"style":357},[3845],{"type":45,"value":3632},{"type":39,"tag":236,"props":3847,"children":3848},{"style":265},[3849],{"type":45,"value":570},{"type":39,"tag":236,"props":3851,"children":3852},{"style":424},[3853],{"type":45,"value":575},{"type":39,"tag":236,"props":3855,"children":3856},{"style":265},[3857],{"type":45,"value":550},{"type":39,"tag":236,"props":3859,"children":3860},{"style":357},[3861],{"type":45,"value":3862},"{print $1}",{"type":39,"tag":236,"props":3864,"children":3865},{"style":265},[3866],{"type":45,"value":560},{"type":39,"tag":236,"props":3868,"children":3869},{"style":265},[3870],{"type":45,"value":593},{"type":39,"tag":236,"props":3872,"children":3873},{"class":238,"line":26},[3874,3878,3882,3887,3892],{"type":39,"tag":236,"props":3875,"children":3876},{"style":351},[3877],{"type":45,"value":1130},{"type":39,"tag":236,"props":3879,"children":3880},{"style":265},[3881],{"type":45,"value":399},{"type":39,"tag":236,"props":3883,"children":3884},{"style":357},[3885],{"type":45,"value":3886},"Found tenant number: ",{"type":39,"tag":236,"props":3888,"children":3889},{"style":259},[3890],{"type":45,"value":3891},"$TENANT_NUM",{"type":39,"tag":236,"props":3893,"children":3894},{"style":265},[3895],{"type":45,"value":409},{"type":39,"tag":236,"props":3897,"children":3898},{"class":238,"line":420},[3899],{"type":39,"tag":236,"props":3900,"children":3901},{"emptyLinePlaceholder":448},[3902],{"type":45,"value":451},{"type":39,"tag":236,"props":3904,"children":3905},{"class":238,"line":435},[3906],{"type":39,"tag":236,"props":3907,"children":3908},{"style":243},[3909],{"type":45,"value":3910},"# Re-run with tenant number piped via stdin (no tee needed this time)\n",{"type":39,"tag":236,"props":3912,"children":3913},{"class":238,"line":444},[3914,3918,3922,3926,3930,3934,3938,3943,3948,3953,3957,3961],{"type":39,"tag":236,"props":3915,"children":3916},{"style":351},[3917],{"type":45,"value":1130},{"type":39,"tag":236,"props":3919,"children":3920},{"style":265},[3921],{"type":45,"value":399},{"type":39,"tag":236,"props":3923,"children":3924},{"style":259},[3925],{"type":45,"value":3891},{"type":39,"tag":236,"props":3927,"children":3928},{"style":265},[3929],{"type":45,"value":972},{"type":39,"tag":236,"props":3931,"children":3932},{"style":265},[3933],{"type":45,"value":570},{"type":39,"tag":236,"props":3935,"children":3936},{"style":424},[3937],{"type":45,"value":365},{"type":39,"tag":236,"props":3939,"children":3940},{"style":357},[3941],{"type":45,"value":3942}," init",{"type":39,"tag":236,"props":3944,"children":3945},{"style":259},[3946],{"type":45,"value":3947}," $AUTH_FLAGS ",{"type":39,"tag":236,"props":3949,"children":3950},{"style":357},[3951],{"type":45,"value":3952},"--namespace=",{"type":39,"tag":236,"props":3954,"children":3955},{"style":265},[3956],{"type":45,"value":3142},{"type":39,"tag":236,"props":3958,"children":3959},{"style":357},[3960],{"type":45,"value":3104},{"type":39,"tag":236,"props":3962,"children":3963},{"style":265},[3964],{"type":45,"value":3109},{"type":39,"tag":48,"props":3966,"children":3967},{},[3968,3972,3974,3980,3982,3988],{"type":39,"tag":74,"props":3969,"children":3970},{},[3971],{"type":45,"value":312},{"type":45,"value":3973},": The ",{"type":39,"tag":111,"props":3975,"children":3977},{"className":3976},[],[3978],{"type":45,"value":3979},"echo \"$TENANT_NUM\" |",{"type":45,"value":3981}," syntax pipes the tenant number into stdin, which is more portable across shell environments than ",{"type":39,"tag":111,"props":3983,"children":3985},{"className":3984},[],[3986],{"type":45,"value":3987},"\u003C\u003C\u003C",{"type":45,"value":3989},". This avoids the interactive prompt entirely on the second run.",{"type":39,"tag":48,"props":3991,"children":3992},{},[3993,3998],{"type":39,"tag":74,"props":3994,"children":3995},{},[3996],{"type":45,"value":3997},"If authentication still fails",{"type":45,"value":3999}," (e.g., user doesn't have access to the specified namespace):",{"type":39,"tag":66,"props":4001,"children":4002},{},[4003,4008,4013],{"type":39,"tag":70,"props":4004,"children":4005},{},[4006],{"type":45,"value":4007},"Show the error message clearly",{"type":39,"tag":70,"props":4009,"children":4010},{},[4011],{"type":45,"value":4012},"Show the list of available tenants from the output",{"type":39,"tag":70,"props":4014,"children":4015},{},[4016],{"type":45,"value":4017},"Ask the user to verify they have access to that namespace or choose from the list",{"type":39,"tag":812,"props":4019,"children":4021},{"id":4020},"option-2-api-key-automatedci",[4022],{"type":45,"value":4023},"Option 2: API Key (automated\u002FCI)",{"type":39,"tag":48,"props":4025,"children":4026},{},[4027],{"type":45,"value":4028},"Instruct the user to set these environment variables themselves (never ask them to paste credentials into chat):",{"type":39,"tag":225,"props":4030,"children":4032},{"className":227,"code":4031,"language":229,"meta":230,"style":230},"export ENDOR_API_CREDENTIALS_KEY=\u003Cyour-api-key>\nexport ENDOR_API_CREDENTIALS_SECRET=\u003Cyour-api-secret>\n",[4033],{"type":39,"tag":111,"props":4034,"children":4035},{"__ignoreMap":230},[4036,4061],{"type":39,"tag":236,"props":4037,"children":4038},{"class":238,"line":239},[4039,4043,4048,4052,4057],{"type":39,"tag":236,"props":4040,"children":4041},{"style":253},[4042],{"type":45,"value":256},{"type":39,"tag":236,"props":4044,"children":4045},{"style":259},[4046],{"type":45,"value":4047}," ENDOR_API_CREDENTIALS_KEY",{"type":39,"tag":236,"props":4049,"children":4050},{"style":265},[4051],{"type":45,"value":3099},{"type":39,"tag":236,"props":4053,"children":4054},{"style":259},[4055],{"type":45,"value":4056},"your-api-key",{"type":39,"tag":236,"props":4058,"children":4059},{"style":265},[4060],{"type":45,"value":3109},{"type":39,"tag":236,"props":4062,"children":4063},{"class":238,"line":249},[4064,4068,4073,4077,4082],{"type":39,"tag":236,"props":4065,"children":4066},{"style":253},[4067],{"type":45,"value":256},{"type":39,"tag":236,"props":4069,"children":4070},{"style":259},[4071],{"type":45,"value":4072}," ENDOR_API_CREDENTIALS_SECRET",{"type":39,"tag":236,"props":4074,"children":4075},{"style":265},[4076],{"type":45,"value":3099},{"type":39,"tag":236,"props":4078,"children":4079},{"style":259},[4080],{"type":45,"value":4081},"your-api-secret",{"type":39,"tag":236,"props":4083,"children":4084},{"style":265},[4085],{"type":45,"value":3109},{"type":39,"tag":48,"props":4087,"children":4088},{},[4089],{"type":45,"value":4090},"No init needed - scan will use these credentials directly.",{"type":39,"tag":48,"props":4092,"children":4093},{},[4094,4099,4101],{"type":39,"tag":74,"props":4095,"children":4096},{},[4097],{"type":45,"value":4098},"Note",{"type":45,"value":4100},": API Key authentication avoids interactive prompts entirely and works best in automated\u002FCLI environments. ",{"type":39,"tag":74,"props":4102,"children":4103},{},[4104],{"type":45,"value":4105},"This is the recommended approach for users who frequently encounter multi-tenant selection issues.",{"type":39,"tag":54,"props":4107,"children":4109},{"id":4108},"scan-types-and-options-always-fetch-from-docs",[4110],{"type":45,"value":4111},"Scan Types and Options (ALWAYS FETCH FROM DOCS)",{"type":39,"tag":48,"props":4113,"children":4114},{},[4115,4119],{"type":39,"tag":74,"props":4116,"children":4117},{},[4118],{"type":45,"value":312},{"type":45,"value":4120},": When the user requests a specific type of scan (e.g., \"quick scan\", \"secrets scan\", \"SAST scan\", \"container scan\", etc.), you MUST fetch the current scan options from the documentation before running the scan.",{"type":39,"tag":812,"props":4122,"children":4124},{"id":4123},"how-to-handle-scan-type-requests",[4125],{"type":45,"value":4126},"How to Handle Scan Type Requests",{"type":39,"tag":66,"props":4128,"children":4129},{},[4130,4140,4169,4201],{"type":39,"tag":70,"props":4131,"children":4132},{},[4133,4138],{"type":39,"tag":74,"props":4134,"children":4135},{},[4136],{"type":45,"value":4137},"User requests a specific scan type",{"type":45,"value":4139}," (e.g., \"run a quick scan\", \"scan for secrets\", \"run SAST\")",{"type":39,"tag":70,"props":4141,"children":4142},{},[4143,4148,4150,4159,4163,4167],{"type":39,"tag":74,"props":4144,"children":4145},{},[4146],{"type":45,"value":4147},"Fetch documentation automatically",{"type":45,"value":4149}," using WebFetch (do NOT ask for permission - just fetch):",{"type":39,"tag":225,"props":4151,"children":4154},{"className":4152,"code":4153,"language":45},[3440],"URL: https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F\nPrompt: \"Find the flag\u002Foption for [user's requested scan type] scan\"\n",[4155],{"type":39,"tag":111,"props":4156,"children":4157},{"__ignoreMap":230},[4158],{"type":45,"value":4153},{"type":39,"tag":4160,"props":4161,"children":4162},"br",{},[],{"type":39,"tag":74,"props":4164,"children":4165},{},[4166],{"type":45,"value":4098},{"type":45,"value":4168},": Fetching from docs.endorlabs.com should be done automatically without prompting the user for confirmation.",{"type":39,"tag":70,"props":4170,"children":4171},{},[4172,4177,4179,4185,4187,4193,4194,4200],{"type":39,"tag":74,"props":4173,"children":4174},{},[4175],{"type":45,"value":4176},"Extract the correct flag",{"type":45,"value":4178}," from the documentation (e.g., ",{"type":39,"tag":111,"props":4180,"children":4182},{"className":4181},[],[4183],{"type":45,"value":4184},"--quick-scan",{"type":45,"value":4186},", ",{"type":39,"tag":111,"props":4188,"children":4190},{"className":4189},[],[4191],{"type":45,"value":4192},"--secrets",{"type":45,"value":4186},{"type":39,"tag":111,"props":4195,"children":4197},{"className":4196},[],[4198],{"type":45,"value":4199},"--sast",{"type":45,"value":1000},{"type":39,"tag":70,"props":4202,"children":4203},{},[4204,4209],{"type":39,"tag":74,"props":4205,"children":4206},{},[4207],{"type":45,"value":4208},"Run the scan",{"type":45,"value":4210}," with the appropriate flag(s)",{"type":39,"tag":812,"props":4212,"children":4214},{"id":4213},"example-workflow",[4215],{"type":45,"value":4216},"Example Workflow",{"type":39,"tag":225,"props":4218,"children":4221},{"className":4219,"code":4220,"language":45},[3440],"User: \"Can you run a quick scan on this repo?\"\n\nStep 1: Fetch docs\n→ WebFetch(\"https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F\", \"Find the flag for quick scan\")\n\nStep 2: Extract flag from docs\n→ Found: --quick-scan\n\nStep 3: Run scan with flag\n→ endorctl scan --namespace=$ENDOR_NAMESPACE --quick-scan\n",[4222],{"type":39,"tag":111,"props":4223,"children":4224},{"__ignoreMap":230},[4225],{"type":45,"value":4220},{"type":39,"tag":812,"props":4227,"children":4229},{"id":4228},"why-always-fetch",[4230],{"type":45,"value":4231},"Why Always Fetch?",{"type":39,"tag":82,"props":4233,"children":4234},{},[4235,4240,4245,4250],{"type":39,"tag":70,"props":4236,"children":4237},{},[4238],{"type":45,"value":4239},"Scan options and flags may change between endorctl versions",{"type":39,"tag":70,"props":4241,"children":4242},{},[4243],{"type":45,"value":4244},"New scan types may be added over time",{"type":39,"tag":70,"props":4246,"children":4247},{},[4248],{"type":45,"value":4249},"Documentation is the source of truth for current options",{"type":39,"tag":70,"props":4251,"children":4252},{},[4253],{"type":45,"value":4254},"Avoids using outdated or incorrect flags",{"type":39,"tag":812,"props":4256,"children":4258},{"id":4257},"documentation-urls",[4259],{"type":45,"value":4260},"Documentation URLs",{"type":39,"tag":82,"props":4262,"children":4263},{},[4264,4280],{"type":39,"tag":70,"props":4265,"children":4266},{},[4267,4272,4274],{"type":39,"tag":74,"props":4268,"children":4269},{},[4270],{"type":45,"value":4271},"Scan options reference",{"type":45,"value":4273},": ",{"type":39,"tag":3012,"props":4275,"children":4278},{"href":4276,"rel":4277},"https:\u002F\u002Fdocs.endorlabs.com\u002Fendorctl\u002Fcommands\u002Fscan\u002F",[3016],[4279],{"type":45,"value":4276},{"type":39,"tag":70,"props":4281,"children":4282},{},[4283,4288,4289],{"type":39,"tag":74,"props":4284,"children":4285},{},[4286],{"type":45,"value":4287},"Main docs",{"type":45,"value":4273},{"type":39,"tag":3012,"props":4290,"children":4293},{"href":4291,"rel":4292},"https:\u002F\u002Fdocs.endorlabs.com",[3016],[4294],{"type":45,"value":4291},{"type":39,"tag":54,"props":4296,"children":4298},{"id":4297},"step-5-run-scan",[4299],{"type":45,"value":4300},"Step 5: Run Scan",{"type":39,"tag":225,"props":4302,"children":4304},{"className":227,"code":4303,"language":229,"meta":230,"style":230},"# Default scan (no specific type requested)\nendorctl scan --namespace=$ENDOR_NAMESPACE\n\n# With specific scan type (fetch flag from docs first!)\nendorctl scan --namespace=$ENDOR_NAMESPACE \u003Cflags-from-docs>\n",[4305],{"type":39,"tag":111,"props":4306,"children":4307},{"__ignoreMap":230},[4308,4316,4336,4343,4351],{"type":39,"tag":236,"props":4309,"children":4310},{"class":238,"line":239},[4311],{"type":39,"tag":236,"props":4312,"children":4313},{"style":243},[4314],{"type":45,"value":4315},"# Default scan (no specific type requested)\n",{"type":39,"tag":236,"props":4317,"children":4318},{"class":238,"line":249},[4319,4323,4327,4331],{"type":39,"tag":236,"props":4320,"children":4321},{"style":424},[4322],{"type":45,"value":2182},{"type":39,"tag":236,"props":4324,"children":4325},{"style":357},[4326],{"type":45,"value":2898},{"type":39,"tag":236,"props":4328,"children":4329},{"style":357},[4330],{"type":45,"value":3137},{"type":39,"tag":236,"props":4332,"children":4333},{"style":259},[4334],{"type":45,"value":4335},"$ENDOR_NAMESPACE\n",{"type":39,"tag":236,"props":4337,"children":4338},{"class":238,"line":388},[4339],{"type":39,"tag":236,"props":4340,"children":4341},{"emptyLinePlaceholder":448},[4342],{"type":45,"value":451},{"type":39,"tag":236,"props":4344,"children":4345},{"class":238,"line":26},[4346],{"type":39,"tag":236,"props":4347,"children":4348},{"style":243},[4349],{"type":45,"value":4350},"# With specific scan type (fetch flag from docs first!)\n",{"type":39,"tag":236,"props":4352,"children":4353},{"class":238,"line":420},[4354,4358,4362,4366,4371,4376,4381,4386],{"type":39,"tag":236,"props":4355,"children":4356},{"style":424},[4357],{"type":45,"value":2182},{"type":39,"tag":236,"props":4359,"children":4360},{"style":357},[4361],{"type":45,"value":2898},{"type":39,"tag":236,"props":4363,"children":4364},{"style":357},[4365],{"type":45,"value":3137},{"type":39,"tag":236,"props":4367,"children":4368},{"style":259},[4369],{"type":45,"value":4370},"$ENDOR_NAMESPACE",{"type":39,"tag":236,"props":4372,"children":4373},{"style":265},[4374],{"type":45,"value":4375}," \u003C",{"type":39,"tag":236,"props":4377,"children":4378},{"style":357},[4379],{"type":45,"value":4380},"flags-from-doc",{"type":39,"tag":236,"props":4382,"children":4383},{"style":259},[4384],{"type":45,"value":4385},"s",{"type":39,"tag":236,"props":4387,"children":4388},{"style":265},[4389],{"type":45,"value":3109},{"type":39,"tag":48,"props":4391,"children":4392},{},[4393,4397],{"type":39,"tag":74,"props":4394,"children":4395},{},[4396],{"type":45,"value":312},{"type":45,"value":3782},{"type":39,"tag":66,"props":4399,"children":4400},{},[4401,4406,4411],{"type":39,"tag":70,"props":4402,"children":4403},{},[4404],{"type":45,"value":4405},"Do NOT run the scan twice or ask the user if they want to see a summary - include it in the initial scan command.",{"type":39,"tag":70,"props":4407,"children":4408},{},[4409],{"type":45,"value":4410},"If user requests a specific scan type, ALWAYS fetch the documentation first to get the correct flag.",{"type":39,"tag":70,"props":4412,"children":4413},{},[4414],{"type":45,"value":4415},"Do NOT guess or assume flag names - always verify from docs.",{"type":39,"tag":54,"props":4417,"children":4419},{"id":4418},"full-automated-setup",[4420],{"type":45,"value":4421},"Full Automated Setup",{"type":39,"tag":48,"props":4423,"children":4424},{},[4425],{"type":45,"value":4426},"For first-time users:",{"type":39,"tag":66,"props":4428,"children":4429},{},[4430,4435,4445,4488],{"type":39,"tag":70,"props":4431,"children":4432},{},[4433],{"type":45,"value":4434},"Download endorctl for the current OS (if not installed)",{"type":39,"tag":70,"props":4436,"children":4437},{},[4438,4443],{"type":39,"tag":74,"props":4439,"children":4440},{},[4441],{"type":45,"value":4442},"ALWAYS",{"type":45,"value":4444}," ask user for their ENDOR_NAMESPACE first (this is needed for authentication)",{"type":39,"tag":70,"props":4446,"children":4447},{},[4448,4450],{"type":45,"value":4449},"Authenticate: Ask user \"CLI Authentication or API Key?\"\n",{"type":39,"tag":82,"props":4451,"children":4452},{},[4453,4479],{"type":39,"tag":70,"props":4454,"children":4455},{},[4456,4461,4463,4469,4471,4477],{"type":39,"tag":74,"props":4457,"children":4458},{},[4459],{"type":45,"value":4460},"CLI Auth",{"type":45,"value":4462},": Ask which provider (Google, GitHub, GitLab, Enterprise SSO, Browser), then run ",{"type":39,"tag":111,"props":4464,"children":4466},{"className":4465},[],[4467],{"type":45,"value":4468},"endorctl init --auth-mode=\u003Cmode> --namespace=\u003Cnamespace>",{"type":45,"value":4470}," (MUST include namespace to avoid interactive prompts). For SSO, also collect ",{"type":39,"tag":111,"props":4472,"children":4474},{"className":4473},[],[4475],{"type":45,"value":4476},"--auth-tenant",{"type":45,"value":4478},".",{"type":39,"tag":70,"props":4480,"children":4481},{},[4482,4486],{"type":39,"tag":74,"props":4483,"children":4484},{},[4485],{"type":45,"value":3197},{"type":45,"value":4487},": Instruct the user to set these environment variables, ENDOR_API_CREDENTIALS_KEY and ENDOR_API_CREDENTIALS_SECRET, then export them",{"type":39,"tag":70,"props":4489,"children":4490},{},[4491,4493],{"type":45,"value":4492},"Run ",{"type":39,"tag":111,"props":4494,"children":4496},{"className":4495},[],[4497],{"type":45,"value":4498},"endorctl scan --namespace=\u003Cnamespace>",{"type":39,"tag":48,"props":4500,"children":4501},{},[4502],{"type":45,"value":4503},"For returning users (already authenticated):",{"type":39,"tag":66,"props":4505,"children":4506},{},[4507,4512,4521],{"type":39,"tag":70,"props":4508,"children":4509},{},[4510],{"type":45,"value":4511},"Check installation and authentication status",{"type":39,"tag":70,"props":4513,"children":4514},{},[4515,4519],{"type":39,"tag":74,"props":4516,"children":4517},{},[4518],{"type":45,"value":4442},{"type":45,"value":4520}," ask user for their ENDOR_NAMESPACE (always offer existing config value as suggestion)",{"type":39,"tag":70,"props":4522,"children":4523},{},[4524,4525],{"type":45,"value":4492},{"type":39,"tag":111,"props":4526,"children":4528},{"className":4527},[],[4529],{"type":45,"value":4498},{"type":39,"tag":48,"props":4531,"children":4532},{},[4533,4538,4540,4546],{"type":39,"tag":74,"props":4534,"children":4535},{},[4536],{"type":45,"value":4537},"CRITICAL REMINDER",{"type":45,"value":4539},": The namespace MUST be collected BEFORE running ",{"type":39,"tag":111,"props":4541,"children":4543},{"className":4542},[],[4544],{"type":45,"value":4545},"endorctl init",{"type":45,"value":4547}," with Browser OAuth. This prevents EOF errors from interactive tenant selection prompts in non-interactive agent environments.",{"type":39,"tag":4549,"props":4550,"children":4551},"style",{},[4552],{"type":45,"value":4553},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4555,"total":2164},[4556,4575,4595,4614,4631,4647,4666],{"slug":4557,"name":4557,"fn":4558,"description":4559,"org":4560,"tags":4561,"stars":22,"repoUrl":23,"updatedAt":4574},"amazon-location-service","integrate Amazon Location Service APIs","Integrates Amazon Location Service APIs for AWS applications. Use this skill when users want to add maps (interactive MapLibre or static images); geocode addresses to coordinates or reverse geocode coordinates to addresses; calculate routes, travel times, or service areas; find places and businesses through text search, nearby search, or autocomplete suggestions; retrieve detailed place information including hours, contacts, and addresses; monitor geographical boundaries with geofences; or track device locations. Covers authentication, SDK integration, and all Amazon Location Service capabilities.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4562,4565,4568,4571],{"name":4563,"slug":4564,"type":15},"API Development","api-development",{"name":4566,"slug":4567,"type":15},"AWS","aws",{"name":4569,"slug":4570,"type":15},"Maps","maps",{"name":4572,"slug":4573,"type":15},"Navigation","navigation","2026-07-12T08:13:53.294026",{"slug":4576,"name":4576,"fn":4577,"description":4578,"org":4579,"tags":4580,"stars":22,"repoUrl":23,"updatedAt":4594},"amplify-workflow","build full-stack apps with AWS Amplify","Build and deploy full-stack web and mobile apps with AWS Amplify Gen2 (TypeScript code-first). Covers auth (Cognito), data (AppSync\u002FDynamoDB including schema modeling, enum types, relationships, authorization rules), storage (S3), functions, APIs, and AI (Amplify AI Kit with Bedrock). Supports React, Next.js, Vue, Angular, React Native, Flutter, Swift, and Android. Always use this skill for Amplify Gen2 topics — even for questions you think you know — it contains validated, version-specific patterns that prevent common mistakes. TRIGGER when: user mentions Amplify Gen2; project has amplify\u002F directory or amplify_outputs; code imports @aws-amplify packages; user asks about defineBackend, defineAuth, defineData, defineStorage, or npx ampx. SKIP: Amplify Gen1 (amplify CLI v6), standalone SAM\u002FCDK without Amplify (use aws-serverless), direct Bedrock without Amplify AI Kit (use bedrock).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4581,4584,4585,4588,4591],{"name":4582,"slug":4583,"type":15},"Auth","auth",{"name":4566,"slug":4567,"type":15},{"name":4586,"slug":4587,"type":15},"Database","database",{"name":4589,"slug":4590,"type":15},"Frontend","frontend",{"name":4592,"slug":4593,"type":15},"TypeScript","typescript","2026-07-12T08:13:47.134012",{"slug":4596,"name":4596,"fn":4597,"description":4598,"org":4599,"tags":4600,"stars":22,"repoUrl":23,"updatedAt":4613},"analyzer","analyze queried data for trends","Analyze queried data for trends, week-over-week comparisons, distributions, funnels, cohorts, top-N lists, anomalies, sanity checks, and report-ready findings. Use after or alongside ClickHouse queries when the user wants insight rather than raw rows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4601,4604,4607,4610],{"name":4602,"slug":4603,"type":15},"Analytics","analytics",{"name":4605,"slug":4606,"type":15},"ClickHouse","clickhouse",{"name":4608,"slug":4609,"type":15},"Data Analysis","data-analysis",{"name":4611,"slug":4612,"type":15},"Statistics","statistics","2026-07-12T08:14:05.606036",{"slug":4615,"name":4615,"fn":4616,"description":4617,"org":4618,"tags":4619,"stars":22,"repoUrl":23,"updatedAt":4630},"artifact-management","manage and organize analysis artifacts","Save, organize, and describe reusable analysis artifacts such as SQL, result snapshots, CSV exports, summaries, caveats, plots, and report-ready files. Use when users ask to save, export, share, cite, reproduce, or organize data-analysis outputs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4620,4621,4624,4627],{"name":4608,"slug":4609,"type":15},{"name":4622,"slug":4623,"type":15},"Productivity","productivity",{"name":4625,"slug":4626,"type":15},"Reporting","reporting",{"name":4628,"slug":4629,"type":15},"SQL","sql","2026-07-12T08:14:09.265555",{"slug":4632,"name":4632,"fn":4633,"description":4634,"org":4635,"tags":4636,"stars":22,"repoUrl":23,"updatedAt":4646},"attorney-assist","connect with attorneys for legal consultation","Connects the user with a LegalZoom attorney for legal consultation. Use when a user asks about attorneys, lawyers, or legal help, or when contract review reveals high risks or low-confidence findings.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4637,4640,4643],{"name":4638,"slug":4639,"type":15},"Contracts","contracts",{"name":4641,"slug":4642,"type":15},"Legal","legal",{"name":4644,"slug":4645,"type":15},"Risk Assessment","risk-assessment","2026-07-12T08:13:45.878361",{"slug":4648,"name":4648,"fn":4649,"description":4650,"org":4651,"tags":4652,"stars":22,"repoUrl":23,"updatedAt":4665},"building-pydantic-ai-agents","build AI agents with Pydantic AI","Build AI agents with Pydantic AI — tools, capabilities (including on-demand loading), structured output, streaming, testing, and multi-agent patterns. Use when the user mentions Pydantic AI, imports pydantic_ai, or asks to build an AI agent, add tools\u002Fcapabilities, defer capability loading, stream output, define agents from YAML, or test agent behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4653,4656,4659,4662],{"name":4654,"slug":4655,"type":15},"Agents","agents",{"name":4657,"slug":4658,"type":15},"LLM","llm",{"name":4660,"slug":4661,"type":15},"Multi-Agent","multi-agent",{"name":4663,"slug":4664,"type":15},"Python","python","2026-07-12T08:14:01.893781",{"slug":4606,"name":4606,"fn":4667,"description":4668,"org":4669,"tags":4670,"stars":22,"repoUrl":23,"updatedAt":4675},"query ClickHouse databases via CLI","Connect to and query ClickHouse (a local server or a ClickHouse Cloud service) from the terminal using the official clickhousectl CLI, including the browser OAuth login flow. Use when the user wants to run SQL against ClickHouse, explore schemas and tables, inspect Cloud services, or authenticate clickhousectl. For building a local dev environment or deploying to Cloud, defer to the official ClickHouse skills (see Scope).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4671,4672,4673,4674],{"name":4602,"slug":4603,"type":15},{"name":17,"slug":18,"type":15},{"name":4605,"slug":4606,"type":15},{"name":4586,"slug":4587,"type":15},"2026-07-12T08:14:06.829692",{"items":4677,"total":2197},[4678,4685,4693,4700,4707,4713,4720,4727,4739,4757,4777,4790],{"slug":4557,"name":4557,"fn":4558,"description":4559,"org":4679,"tags":4680,"stars":22,"repoUrl":23,"updatedAt":4574},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4681,4682,4683,4684],{"name":4563,"slug":4564,"type":15},{"name":4566,"slug":4567,"type":15},{"name":4569,"slug":4570,"type":15},{"name":4572,"slug":4573,"type":15},{"slug":4576,"name":4576,"fn":4577,"description":4578,"org":4686,"tags":4687,"stars":22,"repoUrl":23,"updatedAt":4594},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4688,4689,4690,4691,4692],{"name":4582,"slug":4583,"type":15},{"name":4566,"slug":4567,"type":15},{"name":4586,"slug":4587,"type":15},{"name":4589,"slug":4590,"type":15},{"name":4592,"slug":4593,"type":15},{"slug":4596,"name":4596,"fn":4597,"description":4598,"org":4694,"tags":4695,"stars":22,"repoUrl":23,"updatedAt":4613},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4696,4697,4698,4699],{"name":4602,"slug":4603,"type":15},{"name":4605,"slug":4606,"type":15},{"name":4608,"slug":4609,"type":15},{"name":4611,"slug":4612,"type":15},{"slug":4615,"name":4615,"fn":4616,"description":4617,"org":4701,"tags":4702,"stars":22,"repoUrl":23,"updatedAt":4630},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4703,4704,4705,4706],{"name":4608,"slug":4609,"type":15},{"name":4622,"slug":4623,"type":15},{"name":4625,"slug":4626,"type":15},{"name":4628,"slug":4629,"type":15},{"slug":4632,"name":4632,"fn":4633,"description":4634,"org":4708,"tags":4709,"stars":22,"repoUrl":23,"updatedAt":4646},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4710,4711,4712],{"name":4638,"slug":4639,"type":15},{"name":4641,"slug":4642,"type":15},{"name":4644,"slug":4645,"type":15},{"slug":4648,"name":4648,"fn":4649,"description":4650,"org":4714,"tags":4715,"stars":22,"repoUrl":23,"updatedAt":4665},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4716,4717,4718,4719],{"name":4654,"slug":4655,"type":15},{"name":4657,"slug":4658,"type":15},{"name":4660,"slug":4661,"type":15},{"name":4663,"slug":4664,"type":15},{"slug":4606,"name":4606,"fn":4667,"description":4668,"org":4721,"tags":4722,"stars":22,"repoUrl":23,"updatedAt":4675},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4723,4724,4725,4726],{"name":4602,"slug":4603,"type":15},{"name":17,"slug":18,"type":15},{"name":4605,"slug":4606,"type":15},{"name":4586,"slug":4587,"type":15},{"slug":4728,"name":4728,"fn":4729,"description":4730,"org":4731,"tags":4732,"stars":22,"repoUrl":23,"updatedAt":4738},"cline-session-history","search and browse Cline session history","Search and browse Cline session history. Use when the user asks to find, list, inspect, or export Cline sessions by time period, prompt content, status, model, provider, source, mode, workspace, or other criteria. Also use when the user wants to read a session transcript or export sessions to a directory. Trigger phrases include \"find my session\", \"search my session history\", \"show me past sessions\", \"what was that session where\", \"find the session that started with\", and any mention of past Cline conversations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4733,4734,4737],{"name":4654,"slug":4655,"type":15},{"name":4735,"slug":4736,"type":15},"History","history",{"name":4622,"slug":4623,"type":15},"2026-07-19T06:03:13.945151",{"slug":4740,"name":4740,"fn":4741,"description":4742,"org":4743,"tags":4744,"stars":22,"repoUrl":23,"updatedAt":4756},"convex-design","build reactive backends with Convex","Design and build reactive, type-safe, production-grade backends on Convex. Covers schema, queries\u002Fmutations\u002Factions, indexes, auth, file storage, scheduling, real-time multiplayer, mobile backends, and LLM\u002Fagent workflows on Convex's one-platform stack.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4745,4746,4749,4750,4753],{"name":4582,"slug":4583,"type":15},{"name":4747,"slug":4748,"type":15},"Backend","backend",{"name":4586,"slug":4587,"type":15},{"name":4751,"slug":4752,"type":15},"Real-time","real-time",{"name":4754,"slug":4755,"type":15},"Storage","storage","2026-07-12T08:13:37.101253",{"slug":4758,"name":4758,"fn":4759,"description":4760,"org":4761,"tags":4762,"stars":22,"repoUrl":23,"updatedAt":4776},"cosmosdb-best-practices","optimize Azure Cosmos DB performance","Azure Cosmos DB performance optimization and best practices guidelines for NoSQL,\npartitioning, queries, SDK usage, and vector search. Use when writing, reviewing,\nor refactoring code that interacts with Azure Cosmos DB, designing data models,\noptimizing queries, or implementing high-performance database operations.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4763,4766,4769,4770,4773],{"name":4764,"slug":4765,"type":15},"Azure","azure",{"name":4767,"slug":4768,"type":15},"Cosmos DB","cosmos-db",{"name":4586,"slug":4587,"type":15},{"name":4771,"slug":4772,"type":15},"NoSQL","nosql",{"name":4774,"slug":4775,"type":15},"Performance","performance","2026-07-12T08:13:54.531719",{"slug":4778,"name":4778,"fn":4779,"description":4780,"org":4781,"tags":4782,"stars":22,"repoUrl":23,"updatedAt":4789},"data-analyst","analyze ClickHouse analytics data","Act as an interactive data analyst for ClickHouse-backed analytics. Use when the user asks questions about internal data, metrics, dashboards, telemetry, active users, revenue, funnels, trends, distributions, or wants an analyst-style conversation, ad hoc SQL, charts, or a data export against ClickHouse (local or ClickHouse Cloud).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4783,4784,4785,4788],{"name":4602,"slug":4603,"type":15},{"name":4605,"slug":4606,"type":15},{"name":4786,"slug":4787,"type":15},"Dashboards","dashboards",{"name":4608,"slug":4609,"type":15},"2026-07-12T08:13:31.975246",{"slug":4791,"name":4791,"fn":4792,"description":4793,"org":4794,"tags":4795,"stars":22,"repoUrl":23,"updatedAt":4802},"dataproc-skills","manage Dataproc clusters and jobs","Skills to interact with your Dataproc clusters and jobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4796,4799],{"name":4797,"slug":4798,"type":15},"Data Engineering","data-engineering",{"name":4800,"slug":4801,"type":15},"Operations","operations","2026-07-12T08:13:42.179275"]