[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-apply":3,"mdc-k9cmdv-key":34,"related-org-launchdarkly-apply":1817,"related-repo-launchdarkly-apply":1953},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":29,"sourceUrl":32,"mdContent":33},"apply","install and configure LaunchDarkly SDKs","Apply LaunchDarkly SDK onboarding: install dependency (or dual-SDK pair), configure env and secrets with consent, add init at entrypoint(s), verify compile. Nested under sdk-install; next is run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"launchdarkly","LaunchDarkly","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Flaunchdarkly.png",[12,16,17],{"name":13,"slug":14,"type":15},"Deployment","deployment","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"SDK","sdk",20,"https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling","2026-04-16T05:07:55.215942","Apache-2.0",6,[26,27,28],"agent-skills","launchdarkly-ai","managed-by-terraform",{"repoUrl":21,"stars":20,"forks":24,"topics":30,"description":31},[26,27,28],"LaunchDarkly's official AI tooling","https:\u002F\u002Fgithub.com\u002Flaunchdarkly\u002Fai-tooling\u002Ftree\u002FHEAD\u002Fskills\u002Fonboarding\u002Fsdk-install\u002Fapply","---\nname: apply\ndescription: \"Apply LaunchDarkly SDK onboarding: install dependency (or dual-SDK pair), configure env and secrets with consent, add init at entrypoint(s), verify compile. Nested under sdk-install; next is run.\"\nlicense: Apache-2.0\ncompatibility: Requires integration plan and LaunchDarkly credentials (see parent onboarding)\nmetadata:\n  author: launchdarkly\n  version: \"0.2.0\"\n---\n\n# Apply code changes (SDK install)\n\nExecute the integration plan. Install the SDK(s) and add the minimal code needed to initialize **each** tracked surface.\n\nThis skill is nested under [LaunchDarkly SDK Install (onboarding)](..\u002FSKILL.md); the parent **Step 3** is **apply**. **Prior:** [Generate integration plan](..\u002Fplan\u002FSKILL.md). **Next:** [Start the application](..\u002Frun\u002FSKILL.md).\n\n**Dual SDK:** If the approved plan is **dual SDK** ([plan: Dual SDK integrations](..\u002Fplan\u002FSKILL.md#dual-sdk-integrations)), you must complete Steps 1-3 **for both tracks** -- **two** packages in the manifest, **two** install commands run (or equivalent), **two** credential lines where needed, **two** inits in **different** entrypoints per recipe. **Do not** claim the second SDK is set up without performing its real install and init. If the plan only listed one track but the user asked for both, **stop** and return to [plan](..\u002Fplan\u002FSKILL.md) -- do not invent the second half from memory.\n\n**Credential timing:** This is the first nested step where you ask the user for **SDK key \u002F client-side ID \u002F mobile key** (or consent to fetch\u002Fwrite them). Account status is not asked upfront -- it is inferred earlier via MCP OAuth (parent Step 4) or surfaced here at D7 (option 4) if the user has no account yet ([parent Prerequisites](..\u002F..\u002FSKILL.md#prerequisites)).\n\n## Step 1: Install the SDK dependency\n\nUse the **exact** package or module name and install command from the SDK row you already matched in [SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md), with the project's package manager. Do not copy a generic install line from elsewhere -- each recipe names the right artifact.\n\n**Dual SDK:** Run the **install command for Track A**, then the **install command for Track B** (from the plan). Confirm **both** package names appear in `package.json` \u002F `requirements.txt` \u002F lockfile (or the correct package manifest for each language). Skipping the second install is **not** optional when the plan says dual.\n\nAfter installation, verify the dependency appears in the lock file or dependency manifest (**all** LaunchDarkly packages from the plan).\n\n### Permission before changing other dependencies\n\n**Allowed without asking for extra permission (beyond normal repo-edit consent):** Installing **only** the LaunchDarkly SDK package(s) named in the recipe(s) for this integration (e.g. one server SDK, **or** the **exact server + client pair** listed in a dual-SDK plan -- **both** packages count as in-scope LD installs). Use the **minimum** install each recipe specifies (exact package names).\n\n**Requires explicit user approval *before* you run any command or edit manifests:** Any change beyond that scope, including but not limited to:\n\n- Upgrading, downgrading, pinning, or adding **non-LaunchDarkly** packages (peer-dependency \"fixes,\" `npm install X@latest`, `yarn upgrade`, `pnpm update`, bumping React\u002FNode types, transitive lockfile churn, etc.)\n- Running **`npm audit fix`**, **bulk updates**, or **replacing** the project's package manager resolution strategy to satisfy the SDK\n- Changing **engine** \u002F **packageManager** fields, **resolutions** \u002F **overrides**, or **workspaces** entries for reasons other than adding the LD artifact line\n\nIf the package manager reports peer conflicts or install failures:\n\n**D8 -- BLOCKING:** Call your structured question tool now.\n- question: \"The install reported [specific error]. To fix this, I would need to [specific changes to non-LD packages]. Should I proceed with those additional changes?\"\n- options:\n  - \"Yes, make those changes\"\n  - \"No, keep only the LaunchDarkly package -- I'll resolve conflicts myself\"\n  - \"Show me the exact commands first\"\n- STOP. Do not write the question as text. Do not upgrade an older repo \"to match the newest SDK's dependencies\" silently. Do not continue until the user selects an option.\n\nIf the user **declines** broader changes: keep only the LD package addition if possible, document the conflict, and proceed with placeholders or manual steps.\n\n## Step 2: Add the SDK key to environment configuration\n\n**Never hardcode SDK keys, client-side IDs, or mobile keys in application source files** (only reference them via environment variables).\n\n### Permission before secrets\n\n**D7 -- BLOCKING (MANDATORY -- DO NOT SKIP):** Call your structured question tool now. This decision point exists for security compliance -- the user must explicitly choose how secrets are handled. Skipping this and proceeding to write keys without consent is a critical failure.\n- question: \"The SDK needs an SDK key (or client-side ID \u002F mobile key) for your environment. How would you like to set up the secret?\"\n- options:\n  - \"I'll tell you where to put it\"\n  - \"I'll set up the secret myself -- just tell me what variable name to use\"\n  - \"Write it to a `.env` file for me\"\n  - \"I don't have an account yet -- help me sign up\" -> point to the resolved signup URL (see [Source Attribution](..\u002F..\u002FSKILL.md#source-attribution); default `https:\u002F\u002Fapp.launchdarkly.com\u002Fsignup?source=agent`), write placeholders and continue (real keys deferred until account is ready)\n- STOP. Do not write the question as text. Do not fetch keys from LaunchDarkly or write real values into the repo without the user selecting an option first. Do not infer the answer from context or prior conversation -- always present this choice.\n\n**If the user chooses option 1 (\"Tell me where to put it\"):**\n1. Ask where they want the secret written (file path, secrets manager, etc.)\n2. Ask how they want to provide the key: paste it, or have the agent fetch it via MCP\u002FAPI\n3. Write the key **only** to the location the user specified\n4. Do not create a `.env` or modify any other file\n\n**If the user chooses option 2 (\"I'll set it up myself\"):**\n1. Tell them the variable name(s) they need to set (see the table below)\n2. Link them to the right dashboard page. When the project key and environment key are known: **`https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects\u002F{projectKey}\u002Fsettings\u002Fenvironments\u002F{envKey}\u002Fkeys`**. When only the project key is known: **`https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects\u002F{projectKey}\u002Fsettings\u002Fenvironments`** and tell them to select the environment. When neither is known: **`https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects`** and tell them to navigate to **Settings > Environments** to find the key.\n3. Wait for the user to confirm the secret is in place before proceeding to Step 3\n4. Do not fetch, write, or handle the key value at all\n\n**If the user chooses option 3 (\"Write it to a `.env` file for me\"):**\n1. Ask how they want to provide the key: paste it, or have the agent fetch it via MCP\u002FAPI\n2. Follow the [Write to `.env`](#write-to-env-when-the-user-consents) section below\n3. Ensure `.env` is in `.gitignore` before writing any real values\n\n**If the user chooses option 4 (\"I don't have an account yet\"):**\n1. Point them to the resolved signup URL (see [Source Attribution](..\u002F..\u002FSKILL.md#source-attribution); default `https:\u002F\u002Fapp.launchdarkly.com\u002Fsignup?source=agent`)\n2. Explain that SDK key setup requires an account -- they can complete setup after signing up\n3. Ensure `.env` is in `.gitignore` before writing (same check as option 3 \u002F [Write to `.env`](#write-to-env-when-the-user-consents))\n4. Write placeholder variable names to `.env` (no real values) so the code compiles\n5. Continue with Step 3 (init code) using the placeholder env var references. The app will fail to connect to LaunchDarkly until real keys are set, which is expected.\n6. Note in the onboarding log that key setup is pending account creation\n\n### Fetching keys via MCP\n\nWhen the user asks the agent to fetch the key (via option 1 or 3 above), use the **`get-environments`** MCP tool (if configured). Call it with the project key — the response includes each environment's **SDK key**, **client-side ID**, and **mobile key**. Do **not** make separate API requests for individual keys when `get-environments` already returns them.\n\n```\nget-environments({ request: { projectKey: \"PROJECT_KEY\" } })\n```\n\n**Security: Treat MCP responses containing keys as sensitive.** Write keys only to the location the user chose without echoing full key values in chat responses. Keys in agent conversation history or logs may persist beyond the session.\n\nPick the correct key type from the matching environment in the response (see table below). If MCP is not configured, fall back to `ldcli` or the REST API (`GET \u002Fapi\u002Fv2\u002Fprojects\u002F{PROJECT_KEY}\u002Fenvironments`).\n\n### Variable names and where values come from\n\n| SDK Type | Variable name (typical) | Source in LaunchDarkly |\n|----------|-------------------------|-------------------------|\n| Server-side | `LAUNCHDARKLY_SDK_KEY` | `get-environments` response → environment → SDK key |\n| Client-side | Logical \u002F bundler-prefixed name (see below) | `get-environments` response → environment → Client-side ID |\n| Mobile | `LAUNCHDARKLY_MOBILE_KEY` | `get-environments` response → environment → Mobile key |\n\n**Client-side (browser) projects:** The LaunchDarkly value is still the Client-side ID. In `.env`, use a name the bundler exposes to client code:\n\n| Stack | `.env` key | Read in code |\n|-------|------------|--------------|\n| Create React App | `REACT_APP_LAUNCHDARKLY_CLIENT_SIDE_ID` | `process.env.REACT_APP_LAUNCHDARKLY_CLIENT_SIDE_ID` |\n| Vite | `VITE_LAUNCHDARKLY_CLIENT_SIDE_ID` | `import.meta.env.VITE_LAUNCHDARKLY_CLIENT_SIDE_ID` |\n| Next.js | `NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_SIDE_ID` | `process.env.NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_SIDE_ID` |\n\nOther stacks may use different prefixes or plain `LAUNCHDARKLY_CLIENT_SIDE_ID` -- match what the project already uses for public env vars.\n\n### Write to `.env` (when the user consents)\n\nUse the **integration root** for the file path (repo root or the target package in a monorepo -- see [Detect repository stack](..\u002Fdetect\u002FSKILL.md)).\n\n1. **Create or update `.env`:** If `.env` does not exist, create it. If it exists, **append or update** only the LaunchDarkly lines -- do not remove unrelated variables.\n2. **Add what the integration needs:**\n   - Server-only: `LAUNCHDARKLY_SDK_KEY=...`\n   - Client\u002Fbrowser: the **client-side ID** under the correct bundler-prefixed key (e.g. `VITE_LAUNCHDARKLY_CLIENT_SIDE_ID=...`).\n   - **Full-stack or hybrid (e.g. Next.js, SSR + client):** add **both** the server SDK key and the client-side ID lines when both SDKs are in use.\n   - Mobile: `LAUNCHDARKLY_MOBILE_KEY=...` when applicable.\n3. **`.gitignore`:** Ensure `.env` is listed in `.gitignore` at the same root where you created `.env` (or the nearest relevant ignore file in a monorepo). If the entry is missing, add it -- only after the user has agreed to repo changes (same permission scope as writing `.env`). Do not commit files that contain real secrets.\n4. **`.env.example` \u002F `.env.sample`:** If the project uses one, add **placeholder** entries only (no real keys), so teammates know which variables to set.\n\nIf the project does not use dotenv and relies on a config module or hosted secrets, follow existing patterns there instead -- the same D7 consent above still applies before writing real values into any file.\n\n## Step 3: Add SDK initialization code\n\nInitialization shape **depends on which SDK was chosen** during detection and planning. This skill does not include copy-paste samples per SDK -- using the wrong snippet (e.g. React Web when the recipe is Node server) will mislead you.\n\n**Source of truth (use in order, repeat per track when dual-SDK):**\n\n1. **[SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md)** -- the row for **this** track's SDK: install is Step 1 above; for init, follow the **SDK detail** \u002F doc links listed there.\n2. **SDK detail files** under [`snippets\u002F`](..\u002F..\u002Freferences\u002Fsdk\u002Fsnippets\u002F) (when linked from the recipe) -- curated links and, for many SDKs, a full onboarding sample aligned with that SDK.\n3. **LaunchDarkly's official docs** for that SDK (URLs from the recipe or detail file) -- use their entrypoint and async patterns (e.g. React Web: [React Web SDK](https:\u002F\u002Flaunchdarkly.com\u002Fdocs\u002Fsdk\u002Fclient-side\u002Freact\u002Freact-web)).\n\nWire credentials using Step 2: server SDKs use `LAUNCHDARKLY_SDK_KEY`; client\u002Fbrowser SDKs use the client-side ID with the **bundler-prefixed** env names from Step 2 where applicable.\n\nAdd imports and init to the **application entrypoint** for **that** track (or the target package's entrypoint in a monorepo -- see [Detect repository stack](..\u002Fdetect\u002FSKILL.md)). **Dual SDK:** server init goes in the **server** entrypoint from the plan; client\u002Fprovider init goes in the **client** entrypoint -- **never** a single shared block that pretends to cover both unless the official docs for that stack explicitly prescribe one pattern for both.\n\n### Key principles\n\n1. **Import at the top** of the file with other imports\n2. **Initialize early** in the application lifecycle **for that runtime** (Node server vs browser)\n3. **Wait for initialization** before evaluating flags when the SDK supports it\n4. **Handle errors** -- log failures but don't crash the application\n5. **Match existing code style** -- same patterns (async\u002Fawait, callbacks, modules CommonJS vs ESM) as the rest of the codebase\n6. **Use the right pattern per surface** -- server-side init from the **server** recipe in server code; client\u002Fprovider init from the **client** recipe in client code. **Do not** reuse one snippet for both tracks or skip the second track's init when the plan is dual-SDK.\n\n## Step 4: Verify the code compiles\n\nAfter making changes:\n\n1. Run the project's build or compile step\n2. Run the linter if one is configured\n3. Fix any import errors or type issues **without** upgrading unrelated dependencies unless the user approved that scope ([Permission before changing other dependencies](#permission-before-changing-other-dependencies))\n\nDo not proceed to the next step if the code doesn't compile.\n\n---\n\n**Upon completion:** [Start the application](..\u002Frun\u002FSKILL.md)\n",{"data":35,"body":39},{"name":4,"description":6,"license":23,"compatibility":36,"metadata":37},"Requires integration plan and LaunchDarkly credentials (see parent onboarding)",{"author":8,"version":38},"0.2.0",{"type":40,"children":41},"root",[42,51,65,120,205,230,237,257,311,323,330,374,392,498,503,513,564,576,582,592,598,608,672,680,717,725,788,803,848,856,930,936,985,997,1007,1027,1033,1143,1160,1270,1283,1295,1313,1487,1492,1498,1510,1518,1588,1607,1659,1665,1753,1759,1764,1795,1800,1804],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"apply-code-changes-sdk-install",[48],{"type":49,"value":50},"text","Apply code changes (SDK install)",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55,57,63],{"type":49,"value":56},"Execute the integration plan. Install the SDK(s) and add the minimal code needed to initialize ",{"type":43,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":49,"value":62},"each",{"type":49,"value":64}," tracked surface.",{"type":43,"tag":52,"props":66,"children":67},{},[68,70,77,79,84,86,90,92,97,99,105,106,111,112,118],{"type":49,"value":69},"This skill is nested under ",{"type":43,"tag":71,"props":72,"children":74},"a",{"href":73},"..\u002FSKILL.md",[75],{"type":49,"value":76},"LaunchDarkly SDK Install (onboarding)",{"type":49,"value":78},"; the parent ",{"type":43,"tag":58,"props":80,"children":81},{},[82],{"type":49,"value":83},"Step 3",{"type":49,"value":85}," is ",{"type":43,"tag":58,"props":87,"children":88},{},[89],{"type":49,"value":4},{"type":49,"value":91},". ",{"type":43,"tag":58,"props":93,"children":94},{},[95],{"type":49,"value":96},"Prior:",{"type":49,"value":98}," ",{"type":43,"tag":71,"props":100,"children":102},{"href":101},"..\u002Fplan\u002FSKILL.md",[103],{"type":49,"value":104},"Generate integration plan",{"type":49,"value":91},{"type":43,"tag":58,"props":107,"children":108},{},[109],{"type":49,"value":110},"Next:",{"type":49,"value":98},{"type":43,"tag":71,"props":113,"children":115},{"href":114},"..\u002Frun\u002FSKILL.md",[116],{"type":49,"value":117},"Start the application",{"type":49,"value":119},".",{"type":43,"tag":52,"props":121,"children":122},{},[123,128,130,135,137,143,145,150,152,157,159,163,165,169,171,175,177,182,184,189,191,196,198,203],{"type":43,"tag":58,"props":124,"children":125},{},[126],{"type":49,"value":127},"Dual SDK:",{"type":49,"value":129}," If the approved plan is ",{"type":43,"tag":58,"props":131,"children":132},{},[133],{"type":49,"value":134},"dual SDK",{"type":49,"value":136}," (",{"type":43,"tag":71,"props":138,"children":140},{"href":139},"..\u002Fplan\u002FSKILL.md#dual-sdk-integrations",[141],{"type":49,"value":142},"plan: Dual SDK integrations",{"type":49,"value":144},"), you must complete Steps 1-3 ",{"type":43,"tag":58,"props":146,"children":147},{},[148],{"type":49,"value":149},"for both tracks",{"type":49,"value":151}," -- ",{"type":43,"tag":58,"props":153,"children":154},{},[155],{"type":49,"value":156},"two",{"type":49,"value":158}," packages in the manifest, ",{"type":43,"tag":58,"props":160,"children":161},{},[162],{"type":49,"value":156},{"type":49,"value":164}," install commands run (or equivalent), ",{"type":43,"tag":58,"props":166,"children":167},{},[168],{"type":49,"value":156},{"type":49,"value":170}," credential lines where needed, ",{"type":43,"tag":58,"props":172,"children":173},{},[174],{"type":49,"value":156},{"type":49,"value":176}," inits in ",{"type":43,"tag":58,"props":178,"children":179},{},[180],{"type":49,"value":181},"different",{"type":49,"value":183}," entrypoints per recipe. ",{"type":43,"tag":58,"props":185,"children":186},{},[187],{"type":49,"value":188},"Do not",{"type":49,"value":190}," claim the second SDK is set up without performing its real install and init. If the plan only listed one track but the user asked for both, ",{"type":43,"tag":58,"props":192,"children":193},{},[194],{"type":49,"value":195},"stop",{"type":49,"value":197}," and return to ",{"type":43,"tag":71,"props":199,"children":200},{"href":101},[201],{"type":49,"value":202},"plan",{"type":49,"value":204}," -- do not invent the second half from memory.",{"type":43,"tag":52,"props":206,"children":207},{},[208,213,215,220,222,228],{"type":43,"tag":58,"props":209,"children":210},{},[211],{"type":49,"value":212},"Credential timing:",{"type":49,"value":214}," This is the first nested step where you ask the user for ",{"type":43,"tag":58,"props":216,"children":217},{},[218],{"type":49,"value":219},"SDK key \u002F client-side ID \u002F mobile key",{"type":49,"value":221}," (or consent to fetch\u002Fwrite them). Account status is not asked upfront -- it is inferred earlier via MCP OAuth (parent Step 4) or surfaced here at D7 (option 4) if the user has no account yet (",{"type":43,"tag":71,"props":223,"children":225},{"href":224},"..\u002F..\u002FSKILL.md#prerequisites",[226],{"type":49,"value":227},"parent Prerequisites",{"type":49,"value":229},").",{"type":43,"tag":231,"props":232,"children":234},"h2",{"id":233},"step-1-install-the-sdk-dependency",[235],{"type":49,"value":236},"Step 1: Install the SDK dependency",{"type":43,"tag":52,"props":238,"children":239},{},[240,242,247,249,255],{"type":49,"value":241},"Use the ",{"type":43,"tag":58,"props":243,"children":244},{},[245],{"type":49,"value":246},"exact",{"type":49,"value":248}," package or module name and install command from the SDK row you already matched in ",{"type":43,"tag":71,"props":250,"children":252},{"href":251},"..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md",[253],{"type":49,"value":254},"SDK recipes",{"type":49,"value":256},", with the project's package manager. Do not copy a generic install line from elsewhere -- each recipe names the right artifact.",{"type":43,"tag":52,"props":258,"children":259},{},[260,264,266,271,273,278,280,285,287,294,296,302,304,309],{"type":43,"tag":58,"props":261,"children":262},{},[263],{"type":49,"value":127},{"type":49,"value":265}," Run the ",{"type":43,"tag":58,"props":267,"children":268},{},[269],{"type":49,"value":270},"install command for Track A",{"type":49,"value":272},", then the ",{"type":43,"tag":58,"props":274,"children":275},{},[276],{"type":49,"value":277},"install command for Track B",{"type":49,"value":279}," (from the plan). Confirm ",{"type":43,"tag":58,"props":281,"children":282},{},[283],{"type":49,"value":284},"both",{"type":49,"value":286}," package names appear in ",{"type":43,"tag":288,"props":289,"children":291},"code",{"className":290},[],[292],{"type":49,"value":293},"package.json",{"type":49,"value":295}," \u002F ",{"type":43,"tag":288,"props":297,"children":299},{"className":298},[],[300],{"type":49,"value":301},"requirements.txt",{"type":49,"value":303}," \u002F lockfile (or the correct package manifest for each language). Skipping the second install is ",{"type":43,"tag":58,"props":305,"children":306},{},[307],{"type":49,"value":308},"not",{"type":49,"value":310}," optional when the plan says dual.",{"type":43,"tag":52,"props":312,"children":313},{},[314,316,321],{"type":49,"value":315},"After installation, verify the dependency appears in the lock file or dependency manifest (",{"type":43,"tag":58,"props":317,"children":318},{},[319],{"type":49,"value":320},"all",{"type":49,"value":322}," LaunchDarkly packages from the plan).",{"type":43,"tag":324,"props":325,"children":327},"h3",{"id":326},"permission-before-changing-other-dependencies",[328],{"type":49,"value":329},"Permission before changing other dependencies",{"type":43,"tag":52,"props":331,"children":332},{},[333,338,340,345,347,352,354,359,361,365,367,372],{"type":43,"tag":58,"props":334,"children":335},{},[336],{"type":49,"value":337},"Allowed without asking for extra permission (beyond normal repo-edit consent):",{"type":49,"value":339}," Installing ",{"type":43,"tag":58,"props":341,"children":342},{},[343],{"type":49,"value":344},"only",{"type":49,"value":346}," the LaunchDarkly SDK package(s) named in the recipe(s) for this integration (e.g. one server SDK, ",{"type":43,"tag":58,"props":348,"children":349},{},[350],{"type":49,"value":351},"or",{"type":49,"value":353}," the ",{"type":43,"tag":58,"props":355,"children":356},{},[357],{"type":49,"value":358},"exact server + client pair",{"type":49,"value":360}," listed in a dual-SDK plan -- ",{"type":43,"tag":58,"props":362,"children":363},{},[364],{"type":49,"value":284},{"type":49,"value":366}," packages count as in-scope LD installs). Use the ",{"type":43,"tag":58,"props":368,"children":369},{},[370],{"type":49,"value":371},"minimum",{"type":49,"value":373}," install each recipe specifies (exact package names).",{"type":43,"tag":52,"props":375,"children":376},{},[377,390],{"type":43,"tag":58,"props":378,"children":379},{},[380,382,388],{"type":49,"value":381},"Requires explicit user approval ",{"type":43,"tag":383,"props":384,"children":385},"em",{},[386],{"type":49,"value":387},"before",{"type":49,"value":389}," you run any command or edit manifests:",{"type":49,"value":391}," Any change beyond that scope, including but not limited to:",{"type":43,"tag":393,"props":394,"children":395},"ul",{},[396,432,461],{"type":43,"tag":397,"props":398,"children":399},"li",{},[400,402,407,409,415,417,423,424,430],{"type":49,"value":401},"Upgrading, downgrading, pinning, or adding ",{"type":43,"tag":58,"props":403,"children":404},{},[405],{"type":49,"value":406},"non-LaunchDarkly",{"type":49,"value":408}," packages (peer-dependency \"fixes,\" ",{"type":43,"tag":288,"props":410,"children":412},{"className":411},[],[413],{"type":49,"value":414},"npm install X@latest",{"type":49,"value":416},", ",{"type":43,"tag":288,"props":418,"children":420},{"className":419},[],[421],{"type":49,"value":422},"yarn upgrade",{"type":49,"value":416},{"type":43,"tag":288,"props":425,"children":427},{"className":426},[],[428],{"type":49,"value":429},"pnpm update",{"type":49,"value":431},", bumping React\u002FNode types, transitive lockfile churn, etc.)",{"type":43,"tag":397,"props":433,"children":434},{},[435,437,446,447,452,454,459],{"type":49,"value":436},"Running ",{"type":43,"tag":58,"props":438,"children":439},{},[440],{"type":43,"tag":288,"props":441,"children":443},{"className":442},[],[444],{"type":49,"value":445},"npm audit fix",{"type":49,"value":416},{"type":43,"tag":58,"props":448,"children":449},{},[450],{"type":49,"value":451},"bulk updates",{"type":49,"value":453},", or ",{"type":43,"tag":58,"props":455,"children":456},{},[457],{"type":49,"value":458},"replacing",{"type":49,"value":460}," the project's package manager resolution strategy to satisfy the SDK",{"type":43,"tag":397,"props":462,"children":463},{},[464,466,471,472,477,479,484,485,490,491,496],{"type":49,"value":465},"Changing ",{"type":43,"tag":58,"props":467,"children":468},{},[469],{"type":49,"value":470},"engine",{"type":49,"value":295},{"type":43,"tag":58,"props":473,"children":474},{},[475],{"type":49,"value":476},"packageManager",{"type":49,"value":478}," fields, ",{"type":43,"tag":58,"props":480,"children":481},{},[482],{"type":49,"value":483},"resolutions",{"type":49,"value":295},{"type":43,"tag":58,"props":486,"children":487},{},[488],{"type":49,"value":489},"overrides",{"type":49,"value":453},{"type":43,"tag":58,"props":492,"children":493},{},[494],{"type":49,"value":495},"workspaces",{"type":49,"value":497}," entries for reasons other than adding the LD artifact line",{"type":43,"tag":52,"props":499,"children":500},{},[501],{"type":49,"value":502},"If the package manager reports peer conflicts or install failures:",{"type":43,"tag":52,"props":504,"children":505},{},[506,511],{"type":43,"tag":58,"props":507,"children":508},{},[509],{"type":49,"value":510},"D8 -- BLOCKING:",{"type":49,"value":512}," Call your structured question tool now.",{"type":43,"tag":393,"props":514,"children":515},{},[516,536,559],{"type":43,"tag":397,"props":517,"children":518},{},[519,521,527,529,534],{"type":49,"value":520},"question: \"The install reported ",{"type":43,"tag":522,"props":523,"children":524},"span",{},[525],{"type":49,"value":526},"specific error",{"type":49,"value":528},". To fix this, I would need to ",{"type":43,"tag":522,"props":530,"children":531},{},[532],{"type":49,"value":533},"specific changes to non-LD packages",{"type":49,"value":535},". Should I proceed with those additional changes?\"",{"type":43,"tag":397,"props":537,"children":538},{},[539,541],{"type":49,"value":540},"options:\n",{"type":43,"tag":393,"props":542,"children":543},{},[544,549,554],{"type":43,"tag":397,"props":545,"children":546},{},[547],{"type":49,"value":548},"\"Yes, make those changes\"",{"type":43,"tag":397,"props":550,"children":551},{},[552],{"type":49,"value":553},"\"No, keep only the LaunchDarkly package -- I'll resolve conflicts myself\"",{"type":43,"tag":397,"props":555,"children":556},{},[557],{"type":49,"value":558},"\"Show me the exact commands first\"",{"type":43,"tag":397,"props":560,"children":561},{},[562],{"type":49,"value":563},"STOP. Do not write the question as text. Do not upgrade an older repo \"to match the newest SDK's dependencies\" silently. Do not continue until the user selects an option.",{"type":43,"tag":52,"props":565,"children":566},{},[567,569,574],{"type":49,"value":568},"If the user ",{"type":43,"tag":58,"props":570,"children":571},{},[572],{"type":49,"value":573},"declines",{"type":49,"value":575}," broader changes: keep only the LD package addition if possible, document the conflict, and proceed with placeholders or manual steps.",{"type":43,"tag":231,"props":577,"children":579},{"id":578},"step-2-add-the-sdk-key-to-environment-configuration",[580],{"type":49,"value":581},"Step 2: Add the SDK key to environment configuration",{"type":43,"tag":52,"props":583,"children":584},{},[585,590],{"type":43,"tag":58,"props":586,"children":587},{},[588],{"type":49,"value":589},"Never hardcode SDK keys, client-side IDs, or mobile keys in application source files",{"type":49,"value":591}," (only reference them via environment variables).",{"type":43,"tag":324,"props":593,"children":595},{"id":594},"permission-before-secrets",[596],{"type":49,"value":597},"Permission before secrets",{"type":43,"tag":52,"props":599,"children":600},{},[601,606],{"type":43,"tag":58,"props":602,"children":603},{},[604],{"type":49,"value":605},"D7 -- BLOCKING (MANDATORY -- DO NOT SKIP):",{"type":49,"value":607}," Call your structured question tool now. This decision point exists for security compliance -- the user must explicitly choose how secrets are handled. Skipping this and proceeding to write keys without consent is a critical failure.",{"type":43,"tag":393,"props":609,"children":610},{},[611,616,667],{"type":43,"tag":397,"props":612,"children":613},{},[614],{"type":49,"value":615},"question: \"The SDK needs an SDK key (or client-side ID \u002F mobile key) for your environment. How would you like to set up the secret?\"",{"type":43,"tag":397,"props":617,"children":618},{},[619,620],{"type":49,"value":540},{"type":43,"tag":393,"props":621,"children":622},{},[623,628,633,646],{"type":43,"tag":397,"props":624,"children":625},{},[626],{"type":49,"value":627},"\"I'll tell you where to put it\"",{"type":43,"tag":397,"props":629,"children":630},{},[631],{"type":49,"value":632},"\"I'll set up the secret myself -- just tell me what variable name to use\"",{"type":43,"tag":397,"props":634,"children":635},{},[636,638,644],{"type":49,"value":637},"\"Write it to a ",{"type":43,"tag":288,"props":639,"children":641},{"className":640},[],[642],{"type":49,"value":643},".env",{"type":49,"value":645}," file for me\"",{"type":43,"tag":397,"props":647,"children":648},{},[649,651,657,659,665],{"type":49,"value":650},"\"I don't have an account yet -- help me sign up\" -> point to the resolved signup URL (see ",{"type":43,"tag":71,"props":652,"children":654},{"href":653},"..\u002F..\u002FSKILL.md#source-attribution",[655],{"type":49,"value":656},"Source Attribution",{"type":49,"value":658},"; default ",{"type":43,"tag":288,"props":660,"children":662},{"className":661},[],[663],{"type":49,"value":664},"https:\u002F\u002Fapp.launchdarkly.com\u002Fsignup?source=agent",{"type":49,"value":666},"), write placeholders and continue (real keys deferred until account is ready)",{"type":43,"tag":397,"props":668,"children":669},{},[670],{"type":49,"value":671},"STOP. Do not write the question as text. Do not fetch keys from LaunchDarkly or write real values into the repo without the user selecting an option first. Do not infer the answer from context or prior conversation -- always present this choice.",{"type":43,"tag":52,"props":673,"children":674},{},[675],{"type":43,"tag":58,"props":676,"children":677},{},[678],{"type":49,"value":679},"If the user chooses option 1 (\"Tell me where to put it\"):",{"type":43,"tag":681,"props":682,"children":683},"ol",{},[684,689,694,705],{"type":43,"tag":397,"props":685,"children":686},{},[687],{"type":49,"value":688},"Ask where they want the secret written (file path, secrets manager, etc.)",{"type":43,"tag":397,"props":690,"children":691},{},[692],{"type":49,"value":693},"Ask how they want to provide the key: paste it, or have the agent fetch it via MCP\u002FAPI",{"type":43,"tag":397,"props":695,"children":696},{},[697,699,703],{"type":49,"value":698},"Write the key ",{"type":43,"tag":58,"props":700,"children":701},{},[702],{"type":49,"value":344},{"type":49,"value":704}," to the location the user specified",{"type":43,"tag":397,"props":706,"children":707},{},[708,710,715],{"type":49,"value":709},"Do not create a ",{"type":43,"tag":288,"props":711,"children":713},{"className":712},[],[714],{"type":49,"value":643},{"type":49,"value":716}," or modify any other file",{"type":43,"tag":52,"props":718,"children":719},{},[720],{"type":43,"tag":58,"props":721,"children":722},{},[723],{"type":49,"value":724},"If the user chooses option 2 (\"I'll set it up myself\"):",{"type":43,"tag":681,"props":726,"children":727},{},[728,733,778,783],{"type":43,"tag":397,"props":729,"children":730},{},[731],{"type":49,"value":732},"Tell them the variable name(s) they need to set (see the table below)",{"type":43,"tag":397,"props":734,"children":735},{},[736,738,747,749,758,760,769,771,776],{"type":49,"value":737},"Link them to the right dashboard page. When the project key and environment key are known: ",{"type":43,"tag":58,"props":739,"children":740},{},[741],{"type":43,"tag":288,"props":742,"children":744},{"className":743},[],[745],{"type":49,"value":746},"https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects\u002F{projectKey}\u002Fsettings\u002Fenvironments\u002F{envKey}\u002Fkeys",{"type":49,"value":748},". When only the project key is known: ",{"type":43,"tag":58,"props":750,"children":751},{},[752],{"type":43,"tag":288,"props":753,"children":755},{"className":754},[],[756],{"type":49,"value":757},"https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects\u002F{projectKey}\u002Fsettings\u002Fenvironments",{"type":49,"value":759}," and tell them to select the environment. When neither is known: ",{"type":43,"tag":58,"props":761,"children":762},{},[763],{"type":43,"tag":288,"props":764,"children":766},{"className":765},[],[767],{"type":49,"value":768},"https:\u002F\u002Fapp.launchdarkly.com\u002Fprojects",{"type":49,"value":770}," and tell them to navigate to ",{"type":43,"tag":58,"props":772,"children":773},{},[774],{"type":49,"value":775},"Settings > Environments",{"type":49,"value":777}," to find the key.",{"type":43,"tag":397,"props":779,"children":780},{},[781],{"type":49,"value":782},"Wait for the user to confirm the secret is in place before proceeding to Step 3",{"type":43,"tag":397,"props":784,"children":785},{},[786],{"type":49,"value":787},"Do not fetch, write, or handle the key value at all",{"type":43,"tag":52,"props":789,"children":790},{},[791],{"type":43,"tag":58,"props":792,"children":793},{},[794,796,801],{"type":49,"value":795},"If the user chooses option 3 (\"Write it to a ",{"type":43,"tag":288,"props":797,"children":799},{"className":798},[],[800],{"type":49,"value":643},{"type":49,"value":802}," file for me\"):",{"type":43,"tag":681,"props":804,"children":805},{},[806,810,828],{"type":43,"tag":397,"props":807,"children":808},{},[809],{"type":49,"value":693},{"type":43,"tag":397,"props":811,"children":812},{},[813,815,826],{"type":49,"value":814},"Follow the ",{"type":43,"tag":71,"props":816,"children":818},{"href":817},"#write-to-env-when-the-user-consents",[819,821],{"type":49,"value":820},"Write to ",{"type":43,"tag":288,"props":822,"children":824},{"className":823},[],[825],{"type":49,"value":643},{"type":49,"value":827}," section below",{"type":43,"tag":397,"props":829,"children":830},{},[831,833,838,840,846],{"type":49,"value":832},"Ensure ",{"type":43,"tag":288,"props":834,"children":836},{"className":835},[],[837],{"type":49,"value":643},{"type":49,"value":839}," is in ",{"type":43,"tag":288,"props":841,"children":843},{"className":842},[],[844],{"type":49,"value":845},".gitignore",{"type":49,"value":847}," before writing any real values",{"type":43,"tag":52,"props":849,"children":850},{},[851],{"type":43,"tag":58,"props":852,"children":853},{},[854],{"type":49,"value":855},"If the user chooses option 4 (\"I don't have an account yet\"):",{"type":43,"tag":681,"props":857,"children":858},{},[859,876,881,908,920,925],{"type":43,"tag":397,"props":860,"children":861},{},[862,864,868,869,874],{"type":49,"value":863},"Point them to the resolved signup URL (see ",{"type":43,"tag":71,"props":865,"children":866},{"href":653},[867],{"type":49,"value":656},{"type":49,"value":658},{"type":43,"tag":288,"props":870,"children":872},{"className":871},[],[873],{"type":49,"value":664},{"type":49,"value":875},")",{"type":43,"tag":397,"props":877,"children":878},{},[879],{"type":49,"value":880},"Explain that SDK key setup requires an account -- they can complete setup after signing up",{"type":43,"tag":397,"props":882,"children":883},{},[884,885,890,891,896,898,907],{"type":49,"value":832},{"type":43,"tag":288,"props":886,"children":888},{"className":887},[],[889],{"type":49,"value":643},{"type":49,"value":839},{"type":43,"tag":288,"props":892,"children":894},{"className":893},[],[895],{"type":49,"value":845},{"type":49,"value":897}," before writing (same check as option 3 \u002F ",{"type":43,"tag":71,"props":899,"children":900},{"href":817},[901,902],{"type":49,"value":820},{"type":43,"tag":288,"props":903,"children":905},{"className":904},[],[906],{"type":49,"value":643},{"type":49,"value":875},{"type":43,"tag":397,"props":909,"children":910},{},[911,913,918],{"type":49,"value":912},"Write placeholder variable names to ",{"type":43,"tag":288,"props":914,"children":916},{"className":915},[],[917],{"type":49,"value":643},{"type":49,"value":919}," (no real values) so the code compiles",{"type":43,"tag":397,"props":921,"children":922},{},[923],{"type":49,"value":924},"Continue with Step 3 (init code) using the placeholder env var references. The app will fail to connect to LaunchDarkly until real keys are set, which is expected.",{"type":43,"tag":397,"props":926,"children":927},{},[928],{"type":49,"value":929},"Note in the onboarding log that key setup is pending account creation",{"type":43,"tag":324,"props":931,"children":933},{"id":932},"fetching-keys-via-mcp",[934],{"type":49,"value":935},"Fetching keys via MCP",{"type":43,"tag":52,"props":937,"children":938},{},[939,941,950,952,957,958,963,965,970,972,976,978,983],{"type":49,"value":940},"When the user asks the agent to fetch the key (via option 1 or 3 above), use the ",{"type":43,"tag":58,"props":942,"children":943},{},[944],{"type":43,"tag":288,"props":945,"children":947},{"className":946},[],[948],{"type":49,"value":949},"get-environments",{"type":49,"value":951}," MCP tool (if configured). Call it with the project key — the response includes each environment's ",{"type":43,"tag":58,"props":953,"children":954},{},[955],{"type":49,"value":956},"SDK key",{"type":49,"value":416},{"type":43,"tag":58,"props":959,"children":960},{},[961],{"type":49,"value":962},"client-side ID",{"type":49,"value":964},", and ",{"type":43,"tag":58,"props":966,"children":967},{},[968],{"type":49,"value":969},"mobile key",{"type":49,"value":971},". Do ",{"type":43,"tag":58,"props":973,"children":974},{},[975],{"type":49,"value":308},{"type":49,"value":977}," make separate API requests for individual keys when ",{"type":43,"tag":288,"props":979,"children":981},{"className":980},[],[982],{"type":49,"value":949},{"type":49,"value":984}," already returns them.",{"type":43,"tag":986,"props":987,"children":991},"pre",{"className":988,"code":990,"language":49},[989],"language-text","get-environments({ request: { projectKey: \"PROJECT_KEY\" } })\n",[992],{"type":43,"tag":288,"props":993,"children":995},{"__ignoreMap":994},"",[996],{"type":49,"value":990},{"type":43,"tag":52,"props":998,"children":999},{},[1000,1005],{"type":43,"tag":58,"props":1001,"children":1002},{},[1003],{"type":49,"value":1004},"Security: Treat MCP responses containing keys as sensitive.",{"type":49,"value":1006}," Write keys only to the location the user chose without echoing full key values in chat responses. Keys in agent conversation history or logs may persist beyond the session.",{"type":43,"tag":52,"props":1008,"children":1009},{},[1010,1012,1018,1020,1026],{"type":49,"value":1011},"Pick the correct key type from the matching environment in the response (see table below). If MCP is not configured, fall back to ",{"type":43,"tag":288,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":49,"value":1017},"ldcli",{"type":49,"value":1019}," or the REST API (",{"type":43,"tag":288,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":49,"value":1025},"GET \u002Fapi\u002Fv2\u002Fprojects\u002F{PROJECT_KEY}\u002Fenvironments",{"type":49,"value":229},{"type":43,"tag":324,"props":1028,"children":1030},{"id":1029},"variable-names-and-where-values-come-from",[1031],{"type":49,"value":1032},"Variable names and where values come from",{"type":43,"tag":1034,"props":1035,"children":1036},"table",{},[1037,1061],{"type":43,"tag":1038,"props":1039,"children":1040},"thead",{},[1041],{"type":43,"tag":1042,"props":1043,"children":1044},"tr",{},[1045,1051,1056],{"type":43,"tag":1046,"props":1047,"children":1048},"th",{},[1049],{"type":49,"value":1050},"SDK Type",{"type":43,"tag":1046,"props":1052,"children":1053},{},[1054],{"type":49,"value":1055},"Variable name (typical)",{"type":43,"tag":1046,"props":1057,"children":1058},{},[1059],{"type":49,"value":1060},"Source in LaunchDarkly",{"type":43,"tag":1062,"props":1063,"children":1064},"tbody",{},[1065,1093,1116],{"type":43,"tag":1042,"props":1066,"children":1067},{},[1068,1074,1083],{"type":43,"tag":1069,"props":1070,"children":1071},"td",{},[1072],{"type":49,"value":1073},"Server-side",{"type":43,"tag":1069,"props":1075,"children":1076},{},[1077],{"type":43,"tag":288,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":49,"value":1082},"LAUNCHDARKLY_SDK_KEY",{"type":43,"tag":1069,"props":1084,"children":1085},{},[1086,1091],{"type":43,"tag":288,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":49,"value":949},{"type":49,"value":1092}," response → environment → SDK key",{"type":43,"tag":1042,"props":1094,"children":1095},{},[1096,1101,1106],{"type":43,"tag":1069,"props":1097,"children":1098},{},[1099],{"type":49,"value":1100},"Client-side",{"type":43,"tag":1069,"props":1102,"children":1103},{},[1104],{"type":49,"value":1105},"Logical \u002F bundler-prefixed name (see below)",{"type":43,"tag":1069,"props":1107,"children":1108},{},[1109,1114],{"type":43,"tag":288,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":49,"value":949},{"type":49,"value":1115}," response → environment → Client-side ID",{"type":43,"tag":1042,"props":1117,"children":1118},{},[1119,1124,1133],{"type":43,"tag":1069,"props":1120,"children":1121},{},[1122],{"type":49,"value":1123},"Mobile",{"type":43,"tag":1069,"props":1125,"children":1126},{},[1127],{"type":43,"tag":288,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":49,"value":1132},"LAUNCHDARKLY_MOBILE_KEY",{"type":43,"tag":1069,"props":1134,"children":1135},{},[1136,1141],{"type":43,"tag":288,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":49,"value":949},{"type":49,"value":1142}," response → environment → Mobile key",{"type":43,"tag":52,"props":1144,"children":1145},{},[1146,1151,1153,1158],{"type":43,"tag":58,"props":1147,"children":1148},{},[1149],{"type":49,"value":1150},"Client-side (browser) projects:",{"type":49,"value":1152}," The LaunchDarkly value is still the Client-side ID. In ",{"type":43,"tag":288,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":49,"value":643},{"type":49,"value":1159},", use a name the bundler exposes to client code:",{"type":43,"tag":1034,"props":1161,"children":1162},{},[1163,1189],{"type":43,"tag":1038,"props":1164,"children":1165},{},[1166],{"type":43,"tag":1042,"props":1167,"children":1168},{},[1169,1174,1184],{"type":43,"tag":1046,"props":1170,"children":1171},{},[1172],{"type":49,"value":1173},"Stack",{"type":43,"tag":1046,"props":1175,"children":1176},{},[1177,1182],{"type":43,"tag":288,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":49,"value":643},{"type":49,"value":1183}," key",{"type":43,"tag":1046,"props":1185,"children":1186},{},[1187],{"type":49,"value":1188},"Read in code",{"type":43,"tag":1062,"props":1190,"children":1191},{},[1192,1218,1244],{"type":43,"tag":1042,"props":1193,"children":1194},{},[1195,1200,1209],{"type":43,"tag":1069,"props":1196,"children":1197},{},[1198],{"type":49,"value":1199},"Create React App",{"type":43,"tag":1069,"props":1201,"children":1202},{},[1203],{"type":43,"tag":288,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":49,"value":1208},"REACT_APP_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":1069,"props":1210,"children":1211},{},[1212],{"type":43,"tag":288,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":49,"value":1217},"process.env.REACT_APP_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":1042,"props":1219,"children":1220},{},[1221,1226,1235],{"type":43,"tag":1069,"props":1222,"children":1223},{},[1224],{"type":49,"value":1225},"Vite",{"type":43,"tag":1069,"props":1227,"children":1228},{},[1229],{"type":43,"tag":288,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":49,"value":1234},"VITE_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":1069,"props":1236,"children":1237},{},[1238],{"type":43,"tag":288,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":49,"value":1243},"import.meta.env.VITE_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":1042,"props":1245,"children":1246},{},[1247,1252,1261],{"type":43,"tag":1069,"props":1248,"children":1249},{},[1250],{"type":49,"value":1251},"Next.js",{"type":43,"tag":1069,"props":1253,"children":1254},{},[1255],{"type":43,"tag":288,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":49,"value":1260},"NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":1069,"props":1262,"children":1263},{},[1264],{"type":43,"tag":288,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":49,"value":1269},"process.env.NEXT_PUBLIC_LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":43,"tag":52,"props":1271,"children":1272},{},[1273,1275,1281],{"type":49,"value":1274},"Other stacks may use different prefixes or plain ",{"type":43,"tag":288,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":49,"value":1280},"LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":49,"value":1282}," -- match what the project already uses for public env vars.",{"type":43,"tag":324,"props":1284,"children":1286},{"id":1285},"write-to-env-when-the-user-consents",[1287,1288,1293],{"type":49,"value":820},{"type":43,"tag":288,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":49,"value":643},{"type":49,"value":1294}," (when the user consents)",{"type":43,"tag":52,"props":1296,"children":1297},{},[1298,1299,1304,1306,1312],{"type":49,"value":241},{"type":43,"tag":58,"props":1300,"children":1301},{},[1302],{"type":49,"value":1303},"integration root",{"type":49,"value":1305}," for the file path (repo root or the target package in a monorepo -- see ",{"type":43,"tag":71,"props":1307,"children":1309},{"href":1308},"..\u002Fdetect\u002FSKILL.md",[1310],{"type":49,"value":1311},"Detect repository stack",{"type":49,"value":229},{"type":43,"tag":681,"props":1314,"children":1315},{},[1316,1347,1416,1458],{"type":43,"tag":397,"props":1317,"children":1318},{},[1319,1331,1333,1338,1340,1345],{"type":43,"tag":58,"props":1320,"children":1321},{},[1322,1324,1329],{"type":49,"value":1323},"Create or update ",{"type":43,"tag":288,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":49,"value":643},{"type":49,"value":1330},":",{"type":49,"value":1332}," If ",{"type":43,"tag":288,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":49,"value":643},{"type":49,"value":1339}," does not exist, create it. If it exists, ",{"type":43,"tag":58,"props":1341,"children":1342},{},[1343],{"type":49,"value":1344},"append or update",{"type":49,"value":1346}," only the LaunchDarkly lines -- do not remove unrelated variables.",{"type":43,"tag":397,"props":1348,"children":1349},{},[1350,1355],{"type":43,"tag":58,"props":1351,"children":1352},{},[1353],{"type":49,"value":1354},"Add what the integration needs:",{"type":43,"tag":393,"props":1356,"children":1357},{},[1358,1369,1387,1403],{"type":43,"tag":397,"props":1359,"children":1360},{},[1361,1363],{"type":49,"value":1362},"Server-only: ",{"type":43,"tag":288,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":49,"value":1368},"LAUNCHDARKLY_SDK_KEY=...",{"type":43,"tag":397,"props":1370,"children":1371},{},[1372,1374,1378,1380,1386],{"type":49,"value":1373},"Client\u002Fbrowser: the ",{"type":43,"tag":58,"props":1375,"children":1376},{},[1377],{"type":49,"value":962},{"type":49,"value":1379}," under the correct bundler-prefixed key (e.g. ",{"type":43,"tag":288,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":49,"value":1385},"VITE_LAUNCHDARKLY_CLIENT_SIDE_ID=...",{"type":49,"value":229},{"type":43,"tag":397,"props":1388,"children":1389},{},[1390,1395,1397,1401],{"type":43,"tag":58,"props":1391,"children":1392},{},[1393],{"type":49,"value":1394},"Full-stack or hybrid (e.g. Next.js, SSR + client):",{"type":49,"value":1396}," add ",{"type":43,"tag":58,"props":1398,"children":1399},{},[1400],{"type":49,"value":284},{"type":49,"value":1402}," the server SDK key and the client-side ID lines when both SDKs are in use.",{"type":43,"tag":397,"props":1404,"children":1405},{},[1406,1408,1414],{"type":49,"value":1407},"Mobile: ",{"type":43,"tag":288,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":49,"value":1413},"LAUNCHDARKLY_MOBILE_KEY=...",{"type":49,"value":1415}," when applicable.",{"type":43,"tag":397,"props":1417,"children":1418},{},[1419,1428,1430,1435,1437,1442,1444,1449,1451,1456],{"type":43,"tag":58,"props":1420,"children":1421},{},[1422,1427],{"type":43,"tag":288,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":49,"value":845},{"type":49,"value":1330},{"type":49,"value":1429}," Ensure ",{"type":43,"tag":288,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":49,"value":643},{"type":49,"value":1436}," is listed in ",{"type":43,"tag":288,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":49,"value":845},{"type":49,"value":1443}," at the same root where you created ",{"type":43,"tag":288,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":49,"value":643},{"type":49,"value":1450}," (or the nearest relevant ignore file in a monorepo). If the entry is missing, add it -- only after the user has agreed to repo changes (same permission scope as writing ",{"type":43,"tag":288,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":49,"value":643},{"type":49,"value":1457},"). Do not commit files that contain real secrets.",{"type":43,"tag":397,"props":1459,"children":1460},{},[1461,1478,1480,1485],{"type":43,"tag":58,"props":1462,"children":1463},{},[1464,1470,1471,1477],{"type":43,"tag":288,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":49,"value":1469},".env.example",{"type":49,"value":295},{"type":43,"tag":288,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":49,"value":1476},".env.sample",{"type":49,"value":1330},{"type":49,"value":1479}," If the project uses one, add ",{"type":43,"tag":58,"props":1481,"children":1482},{},[1483],{"type":49,"value":1484},"placeholder",{"type":49,"value":1486}," entries only (no real keys), so teammates know which variables to set.",{"type":43,"tag":52,"props":1488,"children":1489},{},[1490],{"type":49,"value":1491},"If the project does not use dotenv and relies on a config module or hosted secrets, follow existing patterns there instead -- the same D7 consent above still applies before writing real values into any file.",{"type":43,"tag":231,"props":1493,"children":1495},{"id":1494},"step-3-add-sdk-initialization-code",[1496],{"type":49,"value":1497},"Step 3: Add SDK initialization code",{"type":43,"tag":52,"props":1499,"children":1500},{},[1501,1503,1508],{"type":49,"value":1502},"Initialization shape ",{"type":43,"tag":58,"props":1504,"children":1505},{},[1506],{"type":49,"value":1507},"depends on which SDK was chosen",{"type":49,"value":1509}," during detection and planning. This skill does not include copy-paste samples per SDK -- using the wrong snippet (e.g. React Web when the recipe is Node server) will mislead you.",{"type":43,"tag":52,"props":1511,"children":1512},{},[1513],{"type":43,"tag":58,"props":1514,"children":1515},{},[1516],{"type":49,"value":1517},"Source of truth (use in order, repeat per track when dual-SDK):",{"type":43,"tag":681,"props":1519,"children":1520},{},[1521,1547,1569],{"type":43,"tag":397,"props":1522,"children":1523},{},[1524,1531,1533,1538,1540,1545],{"type":43,"tag":58,"props":1525,"children":1526},{},[1527],{"type":43,"tag":71,"props":1528,"children":1529},{"href":251},[1530],{"type":49,"value":254},{"type":49,"value":1532}," -- the row for ",{"type":43,"tag":58,"props":1534,"children":1535},{},[1536],{"type":49,"value":1537},"this",{"type":49,"value":1539}," track's SDK: install is Step 1 above; for init, follow the ",{"type":43,"tag":58,"props":1541,"children":1542},{},[1543],{"type":49,"value":1544},"SDK detail",{"type":49,"value":1546}," \u002F doc links listed there.",{"type":43,"tag":397,"props":1548,"children":1549},{},[1550,1555,1557,1567],{"type":43,"tag":58,"props":1551,"children":1552},{},[1553],{"type":49,"value":1554},"SDK detail files",{"type":49,"value":1556}," under ",{"type":43,"tag":71,"props":1558,"children":1560},{"href":1559},"..\u002F..\u002Freferences\u002Fsdk\u002Fsnippets\u002F",[1561],{"type":43,"tag":288,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":49,"value":1566},"snippets\u002F",{"type":49,"value":1568}," (when linked from the recipe) -- curated links and, for many SDKs, a full onboarding sample aligned with that SDK.",{"type":43,"tag":397,"props":1570,"children":1571},{},[1572,1577,1579,1587],{"type":43,"tag":58,"props":1573,"children":1574},{},[1575],{"type":49,"value":1576},"LaunchDarkly's official docs",{"type":49,"value":1578}," for that SDK (URLs from the recipe or detail file) -- use their entrypoint and async patterns (e.g. React Web: ",{"type":43,"tag":71,"props":1580,"children":1584},{"href":1581,"rel":1582},"https:\u002F\u002Flaunchdarkly.com\u002Fdocs\u002Fsdk\u002Fclient-side\u002Freact\u002Freact-web",[1583],"nofollow",[1585],{"type":49,"value":1586},"React Web SDK",{"type":49,"value":229},{"type":43,"tag":52,"props":1589,"children":1590},{},[1591,1593,1598,1600,1605],{"type":49,"value":1592},"Wire credentials using Step 2: server SDKs use ",{"type":43,"tag":288,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":49,"value":1082},{"type":49,"value":1599},"; client\u002Fbrowser SDKs use the client-side ID with the ",{"type":43,"tag":58,"props":1601,"children":1602},{},[1603],{"type":49,"value":1604},"bundler-prefixed",{"type":49,"value":1606}," env names from Step 2 where applicable.",{"type":43,"tag":52,"props":1608,"children":1609},{},[1610,1612,1617,1619,1624,1626,1630,1632,1636,1638,1643,1645,1650,1652,1657],{"type":49,"value":1611},"Add imports and init to the ",{"type":43,"tag":58,"props":1613,"children":1614},{},[1615],{"type":49,"value":1616},"application entrypoint",{"type":49,"value":1618}," for ",{"type":43,"tag":58,"props":1620,"children":1621},{},[1622],{"type":49,"value":1623},"that",{"type":49,"value":1625}," track (or the target package's entrypoint in a monorepo -- see ",{"type":43,"tag":71,"props":1627,"children":1628},{"href":1308},[1629],{"type":49,"value":1311},{"type":49,"value":1631},"). ",{"type":43,"tag":58,"props":1633,"children":1634},{},[1635],{"type":49,"value":127},{"type":49,"value":1637}," server init goes in the ",{"type":43,"tag":58,"props":1639,"children":1640},{},[1641],{"type":49,"value":1642},"server",{"type":49,"value":1644}," entrypoint from the plan; client\u002Fprovider init goes in the ",{"type":43,"tag":58,"props":1646,"children":1647},{},[1648],{"type":49,"value":1649},"client",{"type":49,"value":1651}," entrypoint -- ",{"type":43,"tag":58,"props":1653,"children":1654},{},[1655],{"type":49,"value":1656},"never",{"type":49,"value":1658}," a single shared block that pretends to cover both unless the official docs for that stack explicitly prescribe one pattern for both.",{"type":43,"tag":324,"props":1660,"children":1662},{"id":1661},"key-principles",[1663],{"type":49,"value":1664},"Key principles",{"type":43,"tag":681,"props":1666,"children":1667},{},[1668,1678,1695,1705,1715,1725],{"type":43,"tag":397,"props":1669,"children":1670},{},[1671,1676],{"type":43,"tag":58,"props":1672,"children":1673},{},[1674],{"type":49,"value":1675},"Import at the top",{"type":49,"value":1677}," of the file with other imports",{"type":43,"tag":397,"props":1679,"children":1680},{},[1681,1686,1688,1693],{"type":43,"tag":58,"props":1682,"children":1683},{},[1684],{"type":49,"value":1685},"Initialize early",{"type":49,"value":1687}," in the application lifecycle ",{"type":43,"tag":58,"props":1689,"children":1690},{},[1691],{"type":49,"value":1692},"for that runtime",{"type":49,"value":1694}," (Node server vs browser)",{"type":43,"tag":397,"props":1696,"children":1697},{},[1698,1703],{"type":43,"tag":58,"props":1699,"children":1700},{},[1701],{"type":49,"value":1702},"Wait for initialization",{"type":49,"value":1704}," before evaluating flags when the SDK supports it",{"type":43,"tag":397,"props":1706,"children":1707},{},[1708,1713],{"type":43,"tag":58,"props":1709,"children":1710},{},[1711],{"type":49,"value":1712},"Handle errors",{"type":49,"value":1714}," -- log failures but don't crash the application",{"type":43,"tag":397,"props":1716,"children":1717},{},[1718,1723],{"type":43,"tag":58,"props":1719,"children":1720},{},[1721],{"type":49,"value":1722},"Match existing code style",{"type":49,"value":1724}," -- same patterns (async\u002Fawait, callbacks, modules CommonJS vs ESM) as the rest of the codebase",{"type":43,"tag":397,"props":1726,"children":1727},{},[1728,1733,1735,1739,1741,1745,1747,1751],{"type":43,"tag":58,"props":1729,"children":1730},{},[1731],{"type":49,"value":1732},"Use the right pattern per surface",{"type":49,"value":1734}," -- server-side init from the ",{"type":43,"tag":58,"props":1736,"children":1737},{},[1738],{"type":49,"value":1642},{"type":49,"value":1740}," recipe in server code; client\u002Fprovider init from the ",{"type":43,"tag":58,"props":1742,"children":1743},{},[1744],{"type":49,"value":1649},{"type":49,"value":1746}," recipe in client code. ",{"type":43,"tag":58,"props":1748,"children":1749},{},[1750],{"type":49,"value":188},{"type":49,"value":1752}," reuse one snippet for both tracks or skip the second track's init when the plan is dual-SDK.",{"type":43,"tag":231,"props":1754,"children":1756},{"id":1755},"step-4-verify-the-code-compiles",[1757],{"type":49,"value":1758},"Step 4: Verify the code compiles",{"type":43,"tag":52,"props":1760,"children":1761},{},[1762],{"type":49,"value":1763},"After making changes:",{"type":43,"tag":681,"props":1765,"children":1766},{},[1767,1772,1777],{"type":43,"tag":397,"props":1768,"children":1769},{},[1770],{"type":49,"value":1771},"Run the project's build or compile step",{"type":43,"tag":397,"props":1773,"children":1774},{},[1775],{"type":49,"value":1776},"Run the linter if one is configured",{"type":43,"tag":397,"props":1778,"children":1779},{},[1780,1782,1787,1789,1794],{"type":49,"value":1781},"Fix any import errors or type issues ",{"type":43,"tag":58,"props":1783,"children":1784},{},[1785],{"type":49,"value":1786},"without",{"type":49,"value":1788}," upgrading unrelated dependencies unless the user approved that scope (",{"type":43,"tag":71,"props":1790,"children":1792},{"href":1791},"#permission-before-changing-other-dependencies",[1793],{"type":49,"value":329},{"type":49,"value":875},{"type":43,"tag":52,"props":1796,"children":1797},{},[1798],{"type":49,"value":1799},"Do not proceed to the next step if the code doesn't compile.",{"type":43,"tag":1801,"props":1802,"children":1803},"hr",{},[],{"type":43,"tag":52,"props":1805,"children":1806},{},[1807,1812,1813],{"type":43,"tag":58,"props":1808,"children":1809},{},[1810],{"type":49,"value":1811},"Upon completion:",{"type":49,"value":98},{"type":43,"tag":71,"props":1814,"children":1815},{"href":114},[1816],{"type":49,"value":117},{"items":1818,"total":1952},[1819,1836,1845,1859,1870,1882,1890,1904,1915,1924,1934,1943],{"slug":1820,"name":1820,"fn":1821,"description":1822,"org":1823,"tags":1824,"stars":20,"repoUrl":21,"updatedAt":1835},"agent-graphs","create and manage agent graphs","Create and manage agent graphs — directed graphs of configs connected by edges with handoff logic. Use when building multi-agent workflows where configs route to each other.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1825,1828,1831,1832],{"name":1826,"slug":1827,"type":15},"Agents","agents",{"name":1829,"slug":1830,"type":15},"Architecture","architecture",{"name":9,"slug":8,"type":15},{"name":1833,"slug":1834,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1840,"tags":1841,"stars":20,"repoUrl":21,"updatedAt":1844},"aiconfig-agent-graphs","manage agent graphs","DEPRECATED redirect — this skill was renamed to agent-graphs. Do not use this skill; invoke agent-graphs instead. Kept only so old references to aiconfig-agent-graphs still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1842,1843],{"name":1826,"slug":1827,"type":15},{"name":1829,"slug":1830,"type":15},"2026-05-22T06:55:56.527064",{"slug":1846,"name":1846,"fn":1847,"description":1848,"org":1849,"tags":1850,"stars":20,"repoUrl":21,"updatedAt":1858},"aiconfig-ai-metrics","manage built-in AI metrics","DEPRECATED redirect — this skill was renamed to built-in-metrics. Do not use this skill; invoke built-in-metrics instead. Kept only so old references to aiconfig-ai-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1851,1854,1855],{"name":1852,"slug":1853,"type":15},"Analytics","analytics",{"name":9,"slug":8,"type":15},{"name":1856,"slug":1857,"type":15},"Metrics","metrics","2026-05-22T06:55:53.858749",{"slug":1860,"name":1860,"fn":1861,"description":1862,"org":1863,"tags":1864,"stars":20,"repoUrl":21,"updatedAt":1869},"aiconfig-create","redirect to configs-create skill","DEPRECATED redirect — this skill was renamed to configs-create. Do not use this skill; invoke configs-create instead. Kept only so old references to aiconfig-create still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1865,1866],{"name":9,"slug":8,"type":15},{"name":1867,"slug":1868,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1871,"name":1871,"fn":1872,"description":1873,"org":1874,"tags":1875,"stars":20,"repoUrl":21,"updatedAt":1881},"aiconfig-custom-metrics","configure custom metrics in LaunchDarkly","DEPRECATED redirect — this skill was renamed to custom-metrics. Do not use this skill; invoke custom-metrics instead. Kept only so old references to aiconfig-custom-metrics still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1876,1877,1880],{"name":1852,"slug":1853,"type":15},{"name":1878,"slug":1879,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1883,"name":1883,"fn":1884,"description":1885,"org":1886,"tags":1887,"stars":20,"repoUrl":21,"updatedAt":1889},"aiconfig-migrate","redirect to migrate skill","DEPRECATED redirect — this skill was renamed to migrate. Do not use this skill; invoke migrate instead. Kept only so old references to aiconfig-migrate still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1888],{"name":1867,"slug":1868,"type":15},"2026-05-22T06:55:44.464733",{"slug":1891,"name":1891,"fn":1892,"description":1893,"org":1894,"tags":1895,"stars":20,"repoUrl":21,"updatedAt":1903},"aiconfig-online-evals","run online evaluations","DEPRECATED redirect — this skill was renamed to online-evals. Do not use this skill; invoke online-evals instead. Kept only so old references to aiconfig-online-evals still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1896,1899,1900],{"name":1897,"slug":1898,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1901,"slug":1902,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",{"slug":1905,"name":1905,"fn":1906,"description":1907,"org":1908,"tags":1909,"stars":20,"repoUrl":21,"updatedAt":1914},"aiconfig-projects","manage AI configuration projects","DEPRECATED redirect — this skill was renamed to projects. Do not use this skill; invoke projects instead. Kept only so old references to aiconfig-projects still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1910,1913],{"name":1911,"slug":1912,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1916,"name":1916,"fn":1917,"description":1918,"org":1919,"tags":1920,"stars":20,"repoUrl":21,"updatedAt":1923},"aiconfig-snippets","manage AI configuration snippets","DEPRECATED redirect — this skill was renamed to snippets. Do not use this skill; invoke snippets instead. Kept only so old references to aiconfig-snippets still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1921,1922],{"name":1911,"slug":1912,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1925,"name":1925,"fn":1926,"description":1927,"org":1928,"tags":1929,"stars":20,"repoUrl":21,"updatedAt":1933},"aiconfig-targeting","configure LaunchDarkly targeting rules","DEPRECATED redirect — this skill was renamed to configs-targeting. Do not use this skill; invoke configs-targeting instead. Kept only so old references to aiconfig-targeting still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1930,1931,1932],{"name":1911,"slug":1912,"type":15},{"name":1878,"slug":1879,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1935,"name":1935,"fn":1936,"description":1937,"org":1938,"tags":1939,"stars":20,"repoUrl":21,"updatedAt":1942},"aiconfig-tools","redirect to tools skill","DEPRECATED redirect — this skill was renamed to tools. Do not use this skill; invoke tools instead. Kept only so old references to aiconfig-tools still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1940,1941],{"name":9,"slug":8,"type":15},{"name":1867,"slug":1868,"type":15},"2026-05-22T06:55:39.13373",{"slug":1944,"name":1944,"fn":1945,"description":1946,"org":1947,"tags":1948,"stars":20,"repoUrl":21,"updatedAt":1951},"aiconfig-update","redirect to configs-update skill","DEPRECATED redirect — this skill was renamed to configs-update. Do not use this skill; invoke configs-update instead. Kept only so old references to aiconfig-update still point users to the new name.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1949,1950],{"name":9,"slug":8,"type":15},{"name":1867,"slug":1868,"type":15},"2026-05-22T06:55:40.464884",49,{"items":1954,"total":1952},[1955,1962,1967,1973,1978,1984,1988],{"slug":1820,"name":1820,"fn":1821,"description":1822,"org":1956,"tags":1957,"stars":20,"repoUrl":21,"updatedAt":1835},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1958,1959,1960,1961],{"name":1826,"slug":1827,"type":15},{"name":1829,"slug":1830,"type":15},{"name":9,"slug":8,"type":15},{"name":1833,"slug":1834,"type":15},{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1963,"tags":1964,"stars":20,"repoUrl":21,"updatedAt":1844},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1965,1966],{"name":1826,"slug":1827,"type":15},{"name":1829,"slug":1830,"type":15},{"slug":1846,"name":1846,"fn":1847,"description":1848,"org":1968,"tags":1969,"stars":20,"repoUrl":21,"updatedAt":1858},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1970,1971,1972],{"name":1852,"slug":1853,"type":15},{"name":9,"slug":8,"type":15},{"name":1856,"slug":1857,"type":15},{"slug":1860,"name":1860,"fn":1861,"description":1862,"org":1974,"tags":1975,"stars":20,"repoUrl":21,"updatedAt":1869},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1976,1977],{"name":9,"slug":8,"type":15},{"name":1867,"slug":1868,"type":15},{"slug":1871,"name":1871,"fn":1872,"description":1873,"org":1979,"tags":1980,"stars":20,"repoUrl":21,"updatedAt":1881},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1981,1982,1983],{"name":1852,"slug":1853,"type":15},{"name":1878,"slug":1879,"type":15},{"name":9,"slug":8,"type":15},{"slug":1883,"name":1883,"fn":1884,"description":1885,"org":1985,"tags":1986,"stars":20,"repoUrl":21,"updatedAt":1889},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1987],{"name":1867,"slug":1868,"type":15},{"slug":1891,"name":1891,"fn":1892,"description":1893,"org":1989,"tags":1990,"stars":20,"repoUrl":21,"updatedAt":1903},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1991,1992,1993],{"name":1897,"slug":1898,"type":15},{"name":9,"slug":8,"type":15},{"name":1901,"slug":1902,"type":15}]