[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-launchdarkly-plan":3,"mdc--954r0a-key":34,"related-org-launchdarkly-plan":1507,"related-repo-launchdarkly-plan":1641},{"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},"plan","plan LaunchDarkly SDK integrations","Generate a minimal LaunchDarkly SDK integration plan from detected stack: choose SDK type(s), dual-SDK server+client when required, files to change, env conventions. Nested under sdk-install; follows detect, precedes apply.",{"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},"Architecture","architecture","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:56.587293","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\u002Fplan","---\nname: plan\ndescription: \"Generate a minimal LaunchDarkly SDK integration plan from detected stack: choose SDK type(s), dual-SDK server+client when required, files to change, env conventions. Nested under sdk-install; follows detect, precedes apply.\"\nlicense: Apache-2.0\ncompatibility: Requires completed or equivalent detect context (see sibling detect skill)\nmetadata:\n  author: launchdarkly\n  version: \"0.2.0\"\n---\n\n# Generate integration plan (SDK install)\n\nBased on what you detected, choose the right SDK and plan the minimal set of changes needed.\n\nThis skill is nested under [LaunchDarkly SDK Install (onboarding)](..\u002FSKILL.md); the parent **Step 2** is **plan**. **Prior:** [Detect repository stack](..\u002Fdetect\u002FSKILL.md). **Next:** [Apply code changes](..\u002Fapply\u002FSKILL.md).\n\n## Choose the right SDK\n\nUse the [SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md) reference to match the detected stack to an SDK. Start with **Top 10 SDKs (start here)** in that file for common stacks; use the **(other)** sections for less common SDKs.\n\nThe key decision:\n\n| Project Type | SDK Type | Key Type |\n|-------------|----------|----------|\n| Backend API, server-rendered app, CLI tool | Server-side SDK | SDK Key |\n| Browser SPA (React, Vue, Angular, vanilla JS) | Client-side SDK | Client-side ID |\n| iOS or Android native app | Mobile SDK | Mobile Key |\n| React Native | Mobile SDK | Mobile Key |\n| Flutter (iOS, Android, or desktop **app** targets) | Client-side SDK (Flutter) | Mobile Key |\n| Flutter **web** | Client-side SDK (Flutter) | Client-side ID |\n| Electron desktop app | Client-side SDK (Node.js) | Client-side ID |\n| Cloudflare Workers, Vercel Edge, AWS Lambda@Edge | Edge SDK | SDK Key |\n| .NET client (MAUI, Xamarin, WPF, UWP) | Mobile SDK (.NET) | Mobile Key |\n| C\u002FC++ client application | Client-side SDK (C\u002FC++) | Mobile Key |\n| C\u002FC++ server application | Server-side SDK (C\u002FC++) | SDK Key |\n| Haskell server | Server-side SDK (Haskell) | SDK Key |\n| Lua server | Server-side SDK (Lua) | SDK Key |\n| Roku (BrightScript) | Client-side SDK (Roku) | Mobile Key |\n\nFor every supported SDK, package name, install hint, and official **Docs** link, use [SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md) and the linked files under [`snippets\u002F`](..\u002F..\u002Freferences\u002Fsdk\u002Fsnippets\u002F).\n\n## Dual SDK integrations\n\nUse this section when the user asked for **both** a server-side and a client-side integration, or when the stack clearly needs **two** LaunchDarkly SDKs (e.g. Next.js with server evaluation **and** browser UI flags, separate backend + SPA repos in one workspace target, etc.).\n\n**Do not** \"complete\" onboarding with a single SDK while **hand-waving** the second (no second package in `package.json`, no second init path, no second recipe followed). Each SDK is a separate product with its own install command and initialization.\n\nFor **each** of the two SDKs, the plan must spell out (with no gaps):\n\n**Server-side track:**\n\n1. Recipe \u002F [SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md) row or snippet name\n2. Package name(s) (exact artifact)\n3. Install command (full command from recipe)\n4. Dependency file (where the line is added)\n5. Entrypoint file(s) (e.g. `instrumentation.ts`, API entry, `main.py`)\n6. Env vars (typically `LAUNCHDARKLY_SDK_KEY`)\n7. Init summary (where it runs; which doc\u002Fsnippet)\n\n**Client-side track:**\n\n1. Recipe \u002F snippet name (**different** row than server)\n2. Package name(s) (e.g. React Web vs Node server -- must be the **client** artifact)\n3. Install command (**second** command -- never implied)\n4. Dependency file\n5. Entrypoint file(s) (e.g. `app\u002Fproviders.tsx`, root layout, `main.tsx`)\n6. Env vars (bundler-prefixed **client-side ID**, e.g. `NEXT_PUBLIC_...`)\n7. Init summary (provider\u002Fwrapper\u002Fhook from **client** recipe)\n\nIf you cannot name **two** packages and **two** entrypoints, you are not done planning -- go back to [SDK recipes](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md) and detection.\n\n**Important distinctions:**\n\n- **Next.js**: Server-side SDK for API routes \u002F server components \u002F RSC contexts that evaluate on the server; React client SDK for client components. If the user requested **both**, the plan lists **both** tracks in full. If they only want one surface to start, state that explicitly in the plan.\n- **Node.js**: If it's a backend service (Express, Fastify, etc.), use the server-side SDK. There is also a [Node.js client SDK](https:\u002F\u002Flaunchdarkly.com\u002Fdocs\u002Fsdk\u002Fclient-side\u002Fnode-js) for desktop\u002FElectron apps.\n- **React**: If it's a standalone SPA, use `launchdarkly-react-client-sdk`. If it's part of Next.js, see above.\n- **.NET**: Use the **server** SDK (`LaunchDarkly.ServerSdk`) for ASP.NET and backend services. For MAUI, Xamarin, WPF, and UWP, use the **.NET mobile SDK** (`LaunchDarkly.ClientSdk`, **mobile key**) -- [SDK recipes -- .NET (Client)](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md#net-client). **Blazor WebAssembly** (and other browser-hosted .NET client UI) still uses `LaunchDarkly.ClientSdk` but with a **client-side ID**, not a mobile key -- see the same recipe.\n- **Flutter**: Use the Flutter client SDK (`launchdarkly_flutter_client_sdk` -- [SDK recipes -- Flutter](..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md#flutter)). Use a **mobile key** for typical iOS\u002FAndroid\u002Fdesktop **app** builds; use the **client-side ID** (and the project's pattern for public env vars) for **Flutter web**. If the user ships multiple targets, confirm which to wire first or plan separate env\u002Fconfig per target.\n\n## Plan the changes\n\nYour integration plan should identify exactly:\n\n### 1. Files to modify\n\nUse the information gathered during [Detect repository stack](..\u002Fdetect\u002FSKILL.md) -- specifically the detected package manager, dependency file, and application entrypoint:\n\n- **Dependency file**: The file identified during detection (e.g., `package.json`, `requirements.txt`, `go.mod`) -- use the detected package manager to add the SDK\n- **Entrypoint file**: The application entrypoint identified during detection -- where SDK initialization code will go. Dual-SDK plans list **two** entrypoints (see [Dual SDK integrations](#dual-sdk-integrations)).\n- **Environment\u002Fconfig file**: Prefer `.env` at the integration root for real secrets (create it if it does not exist); ensure `.env` is listed in `.gitignore` there. Use `.env.example` \u002F `.env.sample` for placeholders only. If the project does not use dotenv, follow its existing config pattern -- see [Apply code changes](..\u002Fapply\u002FSKILL.md) Step 2 for consent, writing keys, and hybrid server+client cases.\n\n### 2. Code changes\n\nFor **each SDK** in scope (one or two tracks), describe the specific changes:\n\n1. **Add SDK dependency** -- the install command from the SDK recipe (repeat for each package when dual-SDK)\n2. **Add SDK import** -- the import statement at the top of that track's entrypoint\n3. **Add SDK initialization** -- the init code for that SDK from that recipe\u002Fsnippet, placed early in the right lifecycle (server vs client)\n4. **Configure credentials** -- via environment variable, never hardcoded (SDK key vs client-side ID per track)\n\n### 3. Environment variable convention\n\nCheck how the project handles configuration:\n\n- **`.env`:** If the stack uses dotenv (or you are introducing it for LaunchDarkly), plan to create `.env` at the integration root when it is missing, then add `LAUNCHDARKLY_SDK_KEY`, `LAUNCHDARKLY_CLIENT_SIDE_ID` \u002F bundler-prefixed client ID, or `LAUNCHDARKLY_MOBILE_KEY` as appropriate (see [Apply code changes](..\u002Fapply\u002FSKILL.md) Step 2 for names, consent before real values, and hybrid server+client cases). Plan to verify `.gitignore` includes `.env` at that root (add the entry if missing, with the same user permission as other repo edits).\n- **`.env.example` \u002F `.env.sample`:** If present, plan **placeholder** entries only (no real secrets).\n- **Config module or `process.env`:** If the project does not use `.env`, plan to follow the existing pattern for secrets.\n\n## Present the plan\n\nBefore making any changes, summarize the plan to the user.\n\n**Single SDK:**\n\n1. Install `[package name]` using `[install command]`\n2. Add SDK dependency to `[dependency file]`\n3. Add import and initialization to `[entrypoint file]`\n4. Add `[env var]` to `.env` (create if missing; real value after user consent)\n5. Ensure `.env` is in `.gitignore`\n6. Add placeholder to `.env.example` if the project uses one\n\nOnly LaunchDarkly SDK packages will be added unless the user explicitly approves other dependency changes.\n\n**Dual SDK:** Present the same numbered format **separately for each track** (e.g. \"Server-side:\" steps 1-7, then \"Client-side:\" steps 1-7), following [Dual SDK integrations](#dual-sdk-integrations). Do not omit the second track.\n\nAfter presenting the plan:\n\n**D6 -- NON-BLOCKING (proceed unless objected):** Present the plan summary to the user with a note like \"Here's what I'm going to do -- say stop or let me know if anything looks wrong.\" Then **continue into [Apply code changes](..\u002Fapply\u002FSKILL.md)** without waiting for explicit approval. If the user objects or says something looks wrong, stop and adjust the plan before continuing.\n\nThis is intentionally non-blocking to reduce ceremony. The plan is visible to the user and they can interrupt at any time. The real safety gates are D7 (secret consent) and D8 (non-LD dependency changes) in the apply step.\n\nIf the entrypoint is ambiguous or multiple SDKs could apply, those specific questions **are** blocking -- ask them as part of the plan presentation using your structured question tool and wait for an answer before proceeding.\n\n**Do not** ask for SDK keys, client-side IDs, or mobile keys as part of plan confirmation -- the parent flow collects those at [Apply code changes](..\u002Fapply\u002FSKILL.md). The **Key type** column above is for technical planning only, not a prompt for secrets.\n\n**Do not** promise or imply that you will upgrade unrelated dependencies to satisfy the latest SDK -- [Apply](..\u002Fapply\u002FSKILL.md) requires **explicit approval** before any non-LaunchDarkly package changes.\n\n---\n\n**Upon completion:** [Apply code changes](..\u002Fapply\u002FSKILL.md)\n",{"data":35,"body":39},{"name":4,"description":6,"license":23,"compatibility":36,"metadata":37},"Requires completed or equivalent detect context (see sibling detect skill)",{"author":8,"version":38},"0.2.0",{"type":40,"children":41},"root",[42,51,57,113,120,147,152,436,466,472,498,523,535,543,612,620,713,736,744,933,939,944,951,962,1073,1079,1090,1133,1139,1144,1262,1268,1273,1281,1374,1379,1402,1407,1428,1433,1445,1467,1490,1494],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"generate-integration-plan-sdk-install",[48],{"type":49,"value":50},"text","Generate integration plan (SDK install)",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Based on what you detected, choose the right SDK and plan the minimal set of changes needed.",{"type":43,"tag":52,"props":58,"children":59},{},[60,62,69,71,77,79,83,85,90,92,98,99,104,105,111],{"type":49,"value":61},"This skill is nested under ",{"type":43,"tag":63,"props":64,"children":66},"a",{"href":65},"..\u002FSKILL.md",[67],{"type":49,"value":68},"LaunchDarkly SDK Install (onboarding)",{"type":49,"value":70},"; the parent ",{"type":43,"tag":72,"props":73,"children":74},"strong",{},[75],{"type":49,"value":76},"Step 2",{"type":49,"value":78}," is ",{"type":43,"tag":72,"props":80,"children":81},{},[82],{"type":49,"value":4},{"type":49,"value":84},". ",{"type":43,"tag":72,"props":86,"children":87},{},[88],{"type":49,"value":89},"Prior:",{"type":49,"value":91}," ",{"type":43,"tag":63,"props":93,"children":95},{"href":94},"..\u002Fdetect\u002FSKILL.md",[96],{"type":49,"value":97},"Detect repository stack",{"type":49,"value":84},{"type":43,"tag":72,"props":100,"children":101},{},[102],{"type":49,"value":103},"Next:",{"type":49,"value":91},{"type":43,"tag":63,"props":106,"children":108},{"href":107},"..\u002Fapply\u002FSKILL.md",[109],{"type":49,"value":110},"Apply code changes",{"type":49,"value":112},".",{"type":43,"tag":114,"props":115,"children":117},"h2",{"id":116},"choose-the-right-sdk",[118],{"type":49,"value":119},"Choose the right SDK",{"type":43,"tag":52,"props":121,"children":122},{},[123,125,131,133,138,140,145],{"type":49,"value":124},"Use the ",{"type":43,"tag":63,"props":126,"children":128},{"href":127},"..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md",[129],{"type":49,"value":130},"SDK recipes",{"type":49,"value":132}," reference to match the detected stack to an SDK. Start with ",{"type":43,"tag":72,"props":134,"children":135},{},[136],{"type":49,"value":137},"Top 10 SDKs (start here)",{"type":49,"value":139}," in that file for common stacks; use the ",{"type":43,"tag":72,"props":141,"children":142},{},[143],{"type":49,"value":144},"(other)",{"type":49,"value":146}," sections for less common SDKs.",{"type":43,"tag":52,"props":148,"children":149},{},[150],{"type":49,"value":151},"The key decision:",{"type":43,"tag":153,"props":154,"children":155},"table",{},[156,180],{"type":43,"tag":157,"props":158,"children":159},"thead",{},[160],{"type":43,"tag":161,"props":162,"children":163},"tr",{},[164,170,175],{"type":43,"tag":165,"props":166,"children":167},"th",{},[168],{"type":49,"value":169},"Project Type",{"type":43,"tag":165,"props":171,"children":172},{},[173],{"type":49,"value":174},"SDK Type",{"type":43,"tag":165,"props":176,"children":177},{},[178],{"type":49,"value":179},"Key Type",{"type":43,"tag":181,"props":182,"children":183},"tbody",{},[184,203,221,239,255,279,300,317,334,351,368,385,402,419],{"type":43,"tag":161,"props":185,"children":186},{},[187,193,198],{"type":43,"tag":188,"props":189,"children":190},"td",{},[191],{"type":49,"value":192},"Backend API, server-rendered app, CLI tool",{"type":43,"tag":188,"props":194,"children":195},{},[196],{"type":49,"value":197},"Server-side SDK",{"type":43,"tag":188,"props":199,"children":200},{},[201],{"type":49,"value":202},"SDK Key",{"type":43,"tag":161,"props":204,"children":205},{},[206,211,216],{"type":43,"tag":188,"props":207,"children":208},{},[209],{"type":49,"value":210},"Browser SPA (React, Vue, Angular, vanilla JS)",{"type":43,"tag":188,"props":212,"children":213},{},[214],{"type":49,"value":215},"Client-side SDK",{"type":43,"tag":188,"props":217,"children":218},{},[219],{"type":49,"value":220},"Client-side ID",{"type":43,"tag":161,"props":222,"children":223},{},[224,229,234],{"type":43,"tag":188,"props":225,"children":226},{},[227],{"type":49,"value":228},"iOS or Android native app",{"type":43,"tag":188,"props":230,"children":231},{},[232],{"type":49,"value":233},"Mobile SDK",{"type":43,"tag":188,"props":235,"children":236},{},[237],{"type":49,"value":238},"Mobile Key",{"type":43,"tag":161,"props":240,"children":241},{},[242,247,251],{"type":43,"tag":188,"props":243,"children":244},{},[245],{"type":49,"value":246},"React Native",{"type":43,"tag":188,"props":248,"children":249},{},[250],{"type":49,"value":233},{"type":43,"tag":188,"props":252,"children":253},{},[254],{"type":49,"value":238},{"type":43,"tag":161,"props":256,"children":257},{},[258,270,275],{"type":43,"tag":188,"props":259,"children":260},{},[261,263,268],{"type":49,"value":262},"Flutter (iOS, Android, or desktop ",{"type":43,"tag":72,"props":264,"children":265},{},[266],{"type":49,"value":267},"app",{"type":49,"value":269}," targets)",{"type":43,"tag":188,"props":271,"children":272},{},[273],{"type":49,"value":274},"Client-side SDK (Flutter)",{"type":43,"tag":188,"props":276,"children":277},{},[278],{"type":49,"value":238},{"type":43,"tag":161,"props":280,"children":281},{},[282,292,296],{"type":43,"tag":188,"props":283,"children":284},{},[285,287],{"type":49,"value":286},"Flutter ",{"type":43,"tag":72,"props":288,"children":289},{},[290],{"type":49,"value":291},"web",{"type":43,"tag":188,"props":293,"children":294},{},[295],{"type":49,"value":274},{"type":43,"tag":188,"props":297,"children":298},{},[299],{"type":49,"value":220},{"type":43,"tag":161,"props":301,"children":302},{},[303,308,313],{"type":43,"tag":188,"props":304,"children":305},{},[306],{"type":49,"value":307},"Electron desktop app",{"type":43,"tag":188,"props":309,"children":310},{},[311],{"type":49,"value":312},"Client-side SDK (Node.js)",{"type":43,"tag":188,"props":314,"children":315},{},[316],{"type":49,"value":220},{"type":43,"tag":161,"props":318,"children":319},{},[320,325,330],{"type":43,"tag":188,"props":321,"children":322},{},[323],{"type":49,"value":324},"Cloudflare Workers, Vercel Edge, AWS Lambda@Edge",{"type":43,"tag":188,"props":326,"children":327},{},[328],{"type":49,"value":329},"Edge SDK",{"type":43,"tag":188,"props":331,"children":332},{},[333],{"type":49,"value":202},{"type":43,"tag":161,"props":335,"children":336},{},[337,342,347],{"type":43,"tag":188,"props":338,"children":339},{},[340],{"type":49,"value":341},".NET client (MAUI, Xamarin, WPF, UWP)",{"type":43,"tag":188,"props":343,"children":344},{},[345],{"type":49,"value":346},"Mobile SDK (.NET)",{"type":43,"tag":188,"props":348,"children":349},{},[350],{"type":49,"value":238},{"type":43,"tag":161,"props":352,"children":353},{},[354,359,364],{"type":43,"tag":188,"props":355,"children":356},{},[357],{"type":49,"value":358},"C\u002FC++ client application",{"type":43,"tag":188,"props":360,"children":361},{},[362],{"type":49,"value":363},"Client-side SDK (C\u002FC++)",{"type":43,"tag":188,"props":365,"children":366},{},[367],{"type":49,"value":238},{"type":43,"tag":161,"props":369,"children":370},{},[371,376,381],{"type":43,"tag":188,"props":372,"children":373},{},[374],{"type":49,"value":375},"C\u002FC++ server application",{"type":43,"tag":188,"props":377,"children":378},{},[379],{"type":49,"value":380},"Server-side SDK (C\u002FC++)",{"type":43,"tag":188,"props":382,"children":383},{},[384],{"type":49,"value":202},{"type":43,"tag":161,"props":386,"children":387},{},[388,393,398],{"type":43,"tag":188,"props":389,"children":390},{},[391],{"type":49,"value":392},"Haskell server",{"type":43,"tag":188,"props":394,"children":395},{},[396],{"type":49,"value":397},"Server-side SDK (Haskell)",{"type":43,"tag":188,"props":399,"children":400},{},[401],{"type":49,"value":202},{"type":43,"tag":161,"props":403,"children":404},{},[405,410,415],{"type":43,"tag":188,"props":406,"children":407},{},[408],{"type":49,"value":409},"Lua server",{"type":43,"tag":188,"props":411,"children":412},{},[413],{"type":49,"value":414},"Server-side SDK (Lua)",{"type":43,"tag":188,"props":416,"children":417},{},[418],{"type":49,"value":202},{"type":43,"tag":161,"props":420,"children":421},{},[422,427,432],{"type":43,"tag":188,"props":423,"children":424},{},[425],{"type":49,"value":426},"Roku (BrightScript)",{"type":43,"tag":188,"props":428,"children":429},{},[430],{"type":49,"value":431},"Client-side SDK (Roku)",{"type":43,"tag":188,"props":433,"children":434},{},[435],{"type":49,"value":238},{"type":43,"tag":52,"props":437,"children":438},{},[439,441,446,448,452,454,465],{"type":49,"value":440},"For every supported SDK, package name, install hint, and official ",{"type":43,"tag":72,"props":442,"children":443},{},[444],{"type":49,"value":445},"Docs",{"type":49,"value":447}," link, use ",{"type":43,"tag":63,"props":449,"children":450},{"href":127},[451],{"type":49,"value":130},{"type":49,"value":453}," and the linked files under ",{"type":43,"tag":63,"props":455,"children":457},{"href":456},"..\u002F..\u002Freferences\u002Fsdk\u002Fsnippets\u002F",[458],{"type":43,"tag":459,"props":460,"children":462},"code",{"className":461},[],[463],{"type":49,"value":464},"snippets\u002F",{"type":49,"value":112},{"type":43,"tag":114,"props":467,"children":469},{"id":468},"dual-sdk-integrations",[470],{"type":49,"value":471},"Dual SDK integrations",{"type":43,"tag":52,"props":473,"children":474},{},[475,477,482,484,489,491,496],{"type":49,"value":476},"Use this section when the user asked for ",{"type":43,"tag":72,"props":478,"children":479},{},[480],{"type":49,"value":481},"both",{"type":49,"value":483}," a server-side and a client-side integration, or when the stack clearly needs ",{"type":43,"tag":72,"props":485,"children":486},{},[487],{"type":49,"value":488},"two",{"type":49,"value":490}," LaunchDarkly SDKs (e.g. Next.js with server evaluation ",{"type":43,"tag":72,"props":492,"children":493},{},[494],{"type":49,"value":495},"and",{"type":49,"value":497}," browser UI flags, separate backend + SPA repos in one workspace target, etc.).",{"type":43,"tag":52,"props":499,"children":500},{},[501,506,508,513,515,521],{"type":43,"tag":72,"props":502,"children":503},{},[504],{"type":49,"value":505},"Do not",{"type":49,"value":507}," \"complete\" onboarding with a single SDK while ",{"type":43,"tag":72,"props":509,"children":510},{},[511],{"type":49,"value":512},"hand-waving",{"type":49,"value":514}," the second (no second package in ",{"type":43,"tag":459,"props":516,"children":518},{"className":517},[],[519],{"type":49,"value":520},"package.json",{"type":49,"value":522},", no second init path, no second recipe followed). Each SDK is a separate product with its own install command and initialization.",{"type":43,"tag":52,"props":524,"children":525},{},[526,528,533],{"type":49,"value":527},"For ",{"type":43,"tag":72,"props":529,"children":530},{},[531],{"type":49,"value":532},"each",{"type":49,"value":534}," of the two SDKs, the plan must spell out (with no gaps):",{"type":43,"tag":52,"props":536,"children":537},{},[538],{"type":43,"tag":72,"props":539,"children":540},{},[541],{"type":49,"value":542},"Server-side track:",{"type":43,"tag":544,"props":545,"children":546},"ol",{},[547,559,564,569,574,595,607],{"type":43,"tag":548,"props":549,"children":550},"li",{},[551,553,557],{"type":49,"value":552},"Recipe \u002F ",{"type":43,"tag":63,"props":554,"children":555},{"href":127},[556],{"type":49,"value":130},{"type":49,"value":558}," row or snippet name",{"type":43,"tag":548,"props":560,"children":561},{},[562],{"type":49,"value":563},"Package name(s) (exact artifact)",{"type":43,"tag":548,"props":565,"children":566},{},[567],{"type":49,"value":568},"Install command (full command from recipe)",{"type":43,"tag":548,"props":570,"children":571},{},[572],{"type":49,"value":573},"Dependency file (where the line is added)",{"type":43,"tag":548,"props":575,"children":576},{},[577,579,585,587,593],{"type":49,"value":578},"Entrypoint file(s) (e.g. ",{"type":43,"tag":459,"props":580,"children":582},{"className":581},[],[583],{"type":49,"value":584},"instrumentation.ts",{"type":49,"value":586},", API entry, ",{"type":43,"tag":459,"props":588,"children":590},{"className":589},[],[591],{"type":49,"value":592},"main.py",{"type":49,"value":594},")",{"type":43,"tag":548,"props":596,"children":597},{},[598,600,606],{"type":49,"value":599},"Env vars (typically ",{"type":43,"tag":459,"props":601,"children":603},{"className":602},[],[604],{"type":49,"value":605},"LAUNCHDARKLY_SDK_KEY",{"type":49,"value":594},{"type":43,"tag":548,"props":608,"children":609},{},[610],{"type":49,"value":611},"Init summary (where it runs; which doc\u002Fsnippet)",{"type":43,"tag":52,"props":613,"children":614},{},[615],{"type":43,"tag":72,"props":616,"children":617},{},[618],{"type":49,"value":619},"Client-side track:",{"type":43,"tag":544,"props":621,"children":622},{},[623,635,647,659,664,683,702],{"type":43,"tag":548,"props":624,"children":625},{},[626,628,633],{"type":49,"value":627},"Recipe \u002F snippet name (",{"type":43,"tag":72,"props":629,"children":630},{},[631],{"type":49,"value":632},"different",{"type":49,"value":634}," row than server)",{"type":43,"tag":548,"props":636,"children":637},{},[638,640,645],{"type":49,"value":639},"Package name(s) (e.g. React Web vs Node server -- must be the ",{"type":43,"tag":72,"props":641,"children":642},{},[643],{"type":49,"value":644},"client",{"type":49,"value":646}," artifact)",{"type":43,"tag":548,"props":648,"children":649},{},[650,652,657],{"type":49,"value":651},"Install command (",{"type":43,"tag":72,"props":653,"children":654},{},[655],{"type":49,"value":656},"second",{"type":49,"value":658}," command -- never implied)",{"type":43,"tag":548,"props":660,"children":661},{},[662],{"type":49,"value":663},"Dependency file",{"type":43,"tag":548,"props":665,"children":666},{},[667,668,674,676,682],{"type":49,"value":578},{"type":43,"tag":459,"props":669,"children":671},{"className":670},[],[672],{"type":49,"value":673},"app\u002Fproviders.tsx",{"type":49,"value":675},", root layout, ",{"type":43,"tag":459,"props":677,"children":679},{"className":678},[],[680],{"type":49,"value":681},"main.tsx",{"type":49,"value":594},{"type":43,"tag":548,"props":684,"children":685},{},[686,688,693,695,701],{"type":49,"value":687},"Env vars (bundler-prefixed ",{"type":43,"tag":72,"props":689,"children":690},{},[691],{"type":49,"value":692},"client-side ID",{"type":49,"value":694},", e.g. ",{"type":43,"tag":459,"props":696,"children":698},{"className":697},[],[699],{"type":49,"value":700},"NEXT_PUBLIC_...",{"type":49,"value":594},{"type":43,"tag":548,"props":703,"children":704},{},[705,707,711],{"type":49,"value":706},"Init summary (provider\u002Fwrapper\u002Fhook from ",{"type":43,"tag":72,"props":708,"children":709},{},[710],{"type":49,"value":644},{"type":49,"value":712}," recipe)",{"type":43,"tag":52,"props":714,"children":715},{},[716,718,722,724,728,730,734],{"type":49,"value":717},"If you cannot name ",{"type":43,"tag":72,"props":719,"children":720},{},[721],{"type":49,"value":488},{"type":49,"value":723}," packages and ",{"type":43,"tag":72,"props":725,"children":726},{},[727],{"type":49,"value":488},{"type":49,"value":729}," entrypoints, you are not done planning -- go back to ",{"type":43,"tag":63,"props":731,"children":732},{"href":127},[733],{"type":49,"value":130},{"type":49,"value":735}," and detection.",{"type":43,"tag":52,"props":737,"children":738},{},[739],{"type":43,"tag":72,"props":740,"children":741},{},[742],{"type":49,"value":743},"Important distinctions:",{"type":43,"tag":745,"props":746,"children":747},"ul",{},[748,770,790,808,882],{"type":43,"tag":548,"props":749,"children":750},{},[751,756,758,762,764,768],{"type":43,"tag":72,"props":752,"children":753},{},[754],{"type":49,"value":755},"Next.js",{"type":49,"value":757},": Server-side SDK for API routes \u002F server components \u002F RSC contexts that evaluate on the server; React client SDK for client components. If the user requested ",{"type":43,"tag":72,"props":759,"children":760},{},[761],{"type":49,"value":481},{"type":49,"value":763},", the plan lists ",{"type":43,"tag":72,"props":765,"children":766},{},[767],{"type":49,"value":481},{"type":49,"value":769}," tracks in full. If they only want one surface to start, state that explicitly in the plan.",{"type":43,"tag":548,"props":771,"children":772},{},[773,778,780,788],{"type":43,"tag":72,"props":774,"children":775},{},[776],{"type":49,"value":777},"Node.js",{"type":49,"value":779},": If it's a backend service (Express, Fastify, etc.), use the server-side SDK. There is also a ",{"type":43,"tag":63,"props":781,"children":785},{"href":782,"rel":783},"https:\u002F\u002Flaunchdarkly.com\u002Fdocs\u002Fsdk\u002Fclient-side\u002Fnode-js",[784],"nofollow",[786],{"type":49,"value":787},"Node.js client SDK",{"type":49,"value":789}," for desktop\u002FElectron apps.",{"type":43,"tag":548,"props":791,"children":792},{},[793,798,800,806],{"type":43,"tag":72,"props":794,"children":795},{},[796],{"type":49,"value":797},"React",{"type":49,"value":799},": If it's a standalone SPA, use ",{"type":43,"tag":459,"props":801,"children":803},{"className":802},[],[804],{"type":49,"value":805},"launchdarkly-react-client-sdk",{"type":49,"value":807},". If it's part of Next.js, see above.",{"type":43,"tag":548,"props":809,"children":810},{},[811,816,818,823,825,831,833,838,840,846,848,853,855,861,862,867,869,874,876,880],{"type":43,"tag":72,"props":812,"children":813},{},[814],{"type":49,"value":815},".NET",{"type":49,"value":817},": Use the ",{"type":43,"tag":72,"props":819,"children":820},{},[821],{"type":49,"value":822},"server",{"type":49,"value":824}," SDK (",{"type":43,"tag":459,"props":826,"children":828},{"className":827},[],[829],{"type":49,"value":830},"LaunchDarkly.ServerSdk",{"type":49,"value":832},") for ASP.NET and backend services. For MAUI, Xamarin, WPF, and UWP, use the ",{"type":43,"tag":72,"props":834,"children":835},{},[836],{"type":49,"value":837},".NET mobile SDK",{"type":49,"value":839}," (",{"type":43,"tag":459,"props":841,"children":843},{"className":842},[],[844],{"type":49,"value":845},"LaunchDarkly.ClientSdk",{"type":49,"value":847},", ",{"type":43,"tag":72,"props":849,"children":850},{},[851],{"type":49,"value":852},"mobile key",{"type":49,"value":854},") -- ",{"type":43,"tag":63,"props":856,"children":858},{"href":857},"..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md#net-client",[859],{"type":49,"value":860},"SDK recipes -- .NET (Client)",{"type":49,"value":84},{"type":43,"tag":72,"props":863,"children":864},{},[865],{"type":49,"value":866},"Blazor WebAssembly",{"type":49,"value":868}," (and other browser-hosted .NET client UI) still uses ",{"type":43,"tag":459,"props":870,"children":872},{"className":871},[],[873],{"type":49,"value":845},{"type":49,"value":875}," but with a ",{"type":43,"tag":72,"props":877,"children":878},{},[879],{"type":49,"value":692},{"type":49,"value":881},", not a mobile key -- see the same recipe.",{"type":43,"tag":548,"props":883,"children":884},{},[885,890,892,898,900,906,908,912,914,918,920,924,926,931],{"type":43,"tag":72,"props":886,"children":887},{},[888],{"type":49,"value":889},"Flutter",{"type":49,"value":891},": Use the Flutter client SDK (",{"type":43,"tag":459,"props":893,"children":895},{"className":894},[],[896],{"type":49,"value":897},"launchdarkly_flutter_client_sdk",{"type":49,"value":899}," -- ",{"type":43,"tag":63,"props":901,"children":903},{"href":902},"..\u002F..\u002Freferences\u002Fsdk\u002Frecipes.md#flutter",[904],{"type":49,"value":905},"SDK recipes -- Flutter",{"type":49,"value":907},"). Use a ",{"type":43,"tag":72,"props":909,"children":910},{},[911],{"type":49,"value":852},{"type":49,"value":913}," for typical iOS\u002FAndroid\u002Fdesktop ",{"type":43,"tag":72,"props":915,"children":916},{},[917],{"type":49,"value":267},{"type":49,"value":919}," builds; use the ",{"type":43,"tag":72,"props":921,"children":922},{},[923],{"type":49,"value":692},{"type":49,"value":925}," (and the project's pattern for public env vars) for ",{"type":43,"tag":72,"props":927,"children":928},{},[929],{"type":49,"value":930},"Flutter web",{"type":49,"value":932},". If the user ships multiple targets, confirm which to wire first or plan separate env\u002Fconfig per target.",{"type":43,"tag":114,"props":934,"children":936},{"id":935},"plan-the-changes",[937],{"type":49,"value":938},"Plan the changes",{"type":43,"tag":52,"props":940,"children":941},{},[942],{"type":49,"value":943},"Your integration plan should identify exactly:",{"type":43,"tag":945,"props":946,"children":948},"h3",{"id":947},"_1-files-to-modify",[949],{"type":49,"value":950},"1. Files to modify",{"type":43,"tag":52,"props":952,"children":953},{},[954,956,960],{"type":49,"value":955},"Use the information gathered during ",{"type":43,"tag":63,"props":957,"children":958},{"href":94},[959],{"type":49,"value":97},{"type":49,"value":961}," -- specifically the detected package manager, dependency file, and application entrypoint:",{"type":43,"tag":745,"props":963,"children":964},{},[965,995,1018],{"type":43,"tag":548,"props":966,"children":967},{},[968,972,974,979,980,986,987,993],{"type":43,"tag":72,"props":969,"children":970},{},[971],{"type":49,"value":663},{"type":49,"value":973},": The file identified during detection (e.g., ",{"type":43,"tag":459,"props":975,"children":977},{"className":976},[],[978],{"type":49,"value":520},{"type":49,"value":847},{"type":43,"tag":459,"props":981,"children":983},{"className":982},[],[984],{"type":49,"value":985},"requirements.txt",{"type":49,"value":847},{"type":43,"tag":459,"props":988,"children":990},{"className":989},[],[991],{"type":49,"value":992},"go.mod",{"type":49,"value":994},") -- use the detected package manager to add the SDK",{"type":43,"tag":548,"props":996,"children":997},{},[998,1003,1005,1009,1011,1016],{"type":43,"tag":72,"props":999,"children":1000},{},[1001],{"type":49,"value":1002},"Entrypoint file",{"type":49,"value":1004},": The application entrypoint identified during detection -- where SDK initialization code will go. Dual-SDK plans list ",{"type":43,"tag":72,"props":1006,"children":1007},{},[1008],{"type":49,"value":488},{"type":49,"value":1010}," entrypoints (see ",{"type":43,"tag":63,"props":1012,"children":1014},{"href":1013},"#dual-sdk-integrations",[1015],{"type":49,"value":471},{"type":49,"value":1017},").",{"type":43,"tag":548,"props":1019,"children":1020},{},[1021,1026,1028,1034,1036,1041,1043,1049,1051,1057,1059,1065,1067,1071],{"type":43,"tag":72,"props":1022,"children":1023},{},[1024],{"type":49,"value":1025},"Environment\u002Fconfig file",{"type":49,"value":1027},": Prefer ",{"type":43,"tag":459,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":49,"value":1033},".env",{"type":49,"value":1035}," at the integration root for real secrets (create it if it does not exist); ensure ",{"type":43,"tag":459,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":49,"value":1033},{"type":49,"value":1042}," is listed in ",{"type":43,"tag":459,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":49,"value":1048},".gitignore",{"type":49,"value":1050}," there. Use ",{"type":43,"tag":459,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":49,"value":1056},".env.example",{"type":49,"value":1058}," \u002F ",{"type":43,"tag":459,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":49,"value":1064},".env.sample",{"type":49,"value":1066}," for placeholders only. If the project does not use dotenv, follow its existing config pattern -- see ",{"type":43,"tag":63,"props":1068,"children":1069},{"href":107},[1070],{"type":49,"value":110},{"type":49,"value":1072}," Step 2 for consent, writing keys, and hybrid server+client cases.",{"type":43,"tag":945,"props":1074,"children":1076},{"id":1075},"_2-code-changes",[1077],{"type":49,"value":1078},"2. Code changes",{"type":43,"tag":52,"props":1080,"children":1081},{},[1082,1083,1088],{"type":49,"value":527},{"type":43,"tag":72,"props":1084,"children":1085},{},[1086],{"type":49,"value":1087},"each SDK",{"type":49,"value":1089}," in scope (one or two tracks), describe the specific changes:",{"type":43,"tag":544,"props":1091,"children":1092},{},[1093,1103,1113,1123],{"type":43,"tag":548,"props":1094,"children":1095},{},[1096,1101],{"type":43,"tag":72,"props":1097,"children":1098},{},[1099],{"type":49,"value":1100},"Add SDK dependency",{"type":49,"value":1102}," -- the install command from the SDK recipe (repeat for each package when dual-SDK)",{"type":43,"tag":548,"props":1104,"children":1105},{},[1106,1111],{"type":43,"tag":72,"props":1107,"children":1108},{},[1109],{"type":49,"value":1110},"Add SDK import",{"type":49,"value":1112}," -- the import statement at the top of that track's entrypoint",{"type":43,"tag":548,"props":1114,"children":1115},{},[1116,1121],{"type":43,"tag":72,"props":1117,"children":1118},{},[1119],{"type":49,"value":1120},"Add SDK initialization",{"type":49,"value":1122}," -- the init code for that SDK from that recipe\u002Fsnippet, placed early in the right lifecycle (server vs client)",{"type":43,"tag":548,"props":1124,"children":1125},{},[1126,1131],{"type":43,"tag":72,"props":1127,"children":1128},{},[1129],{"type":49,"value":1130},"Configure credentials",{"type":49,"value":1132}," -- via environment variable, never hardcoded (SDK key vs client-side ID per track)",{"type":43,"tag":945,"props":1134,"children":1136},{"id":1135},"_3-environment-variable-convention",[1137],{"type":49,"value":1138},"3. Environment variable convention",{"type":43,"tag":52,"props":1140,"children":1141},{},[1142],{"type":49,"value":1143},"Check how the project handles configuration:",{"type":43,"tag":745,"props":1145,"children":1146},{},[1147,1211,1238],{"type":43,"tag":548,"props":1148,"children":1149},{},[1150,1160,1162,1167,1169,1174,1175,1181,1183,1189,1191,1195,1197,1202,1204,1209],{"type":43,"tag":72,"props":1151,"children":1152},{},[1153,1158],{"type":43,"tag":459,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":49,"value":1033},{"type":49,"value":1159},":",{"type":49,"value":1161}," If the stack uses dotenv (or you are introducing it for LaunchDarkly), plan to create ",{"type":43,"tag":459,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":49,"value":1033},{"type":49,"value":1168}," at the integration root when it is missing, then add ",{"type":43,"tag":459,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":49,"value":605},{"type":49,"value":847},{"type":43,"tag":459,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":49,"value":1180},"LAUNCHDARKLY_CLIENT_SIDE_ID",{"type":49,"value":1182}," \u002F bundler-prefixed client ID, or ",{"type":43,"tag":459,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":49,"value":1188},"LAUNCHDARKLY_MOBILE_KEY",{"type":49,"value":1190}," as appropriate (see ",{"type":43,"tag":63,"props":1192,"children":1193},{"href":107},[1194],{"type":49,"value":110},{"type":49,"value":1196}," Step 2 for names, consent before real values, and hybrid server+client cases). Plan to verify ",{"type":43,"tag":459,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":49,"value":1048},{"type":49,"value":1203}," includes ",{"type":43,"tag":459,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":49,"value":1033},{"type":49,"value":1210}," at that root (add the entry if missing, with the same user permission as other repo edits).",{"type":43,"tag":548,"props":1212,"children":1213},{},[1214,1229,1231,1236],{"type":43,"tag":72,"props":1215,"children":1216},{},[1217,1222,1223,1228],{"type":43,"tag":459,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":49,"value":1056},{"type":49,"value":1058},{"type":43,"tag":459,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":49,"value":1064},{"type":49,"value":1159},{"type":49,"value":1230}," If present, plan ",{"type":43,"tag":72,"props":1232,"children":1233},{},[1234],{"type":49,"value":1235},"placeholder",{"type":49,"value":1237}," entries only (no real secrets).",{"type":43,"tag":548,"props":1239,"children":1240},{},[1241,1253,1255,1260],{"type":43,"tag":72,"props":1242,"children":1243},{},[1244,1246,1252],{"type":49,"value":1245},"Config module or ",{"type":43,"tag":459,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":49,"value":1251},"process.env",{"type":49,"value":1159},{"type":49,"value":1254}," If the project does not use ",{"type":43,"tag":459,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":49,"value":1033},{"type":49,"value":1261},", plan to follow the existing pattern for secrets.",{"type":43,"tag":114,"props":1263,"children":1265},{"id":1264},"present-the-plan",[1266],{"type":49,"value":1267},"Present the plan",{"type":43,"tag":52,"props":1269,"children":1270},{},[1271],{"type":49,"value":1272},"Before making any changes, summarize the plan to the user.",{"type":43,"tag":52,"props":1274,"children":1275},{},[1276],{"type":43,"tag":72,"props":1277,"children":1278},{},[1279],{"type":49,"value":1280},"Single SDK:",{"type":43,"tag":544,"props":1282,"children":1283},{},[1284,1303,1314,1325,1345,1362],{"type":43,"tag":548,"props":1285,"children":1286},{},[1287,1289,1295,1297],{"type":49,"value":1288},"Install ",{"type":43,"tag":459,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":49,"value":1294},"[package name]",{"type":49,"value":1296}," using ",{"type":43,"tag":459,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":49,"value":1302},"[install command]",{"type":43,"tag":548,"props":1304,"children":1305},{},[1306,1308],{"type":49,"value":1307},"Add SDK dependency to ",{"type":43,"tag":459,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":49,"value":1313},"[dependency file]",{"type":43,"tag":548,"props":1315,"children":1316},{},[1317,1319],{"type":49,"value":1318},"Add import and initialization to ",{"type":43,"tag":459,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":49,"value":1324},"[entrypoint file]",{"type":43,"tag":548,"props":1326,"children":1327},{},[1328,1330,1336,1338,1343],{"type":49,"value":1329},"Add ",{"type":43,"tag":459,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":49,"value":1335},"[env var]",{"type":49,"value":1337}," to ",{"type":43,"tag":459,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":49,"value":1033},{"type":49,"value":1344}," (create if missing; real value after user consent)",{"type":43,"tag":548,"props":1346,"children":1347},{},[1348,1350,1355,1357],{"type":49,"value":1349},"Ensure ",{"type":43,"tag":459,"props":1351,"children":1353},{"className":1352},[],[1354],{"type":49,"value":1033},{"type":49,"value":1356}," is in ",{"type":43,"tag":459,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":49,"value":1048},{"type":43,"tag":548,"props":1363,"children":1364},{},[1365,1367,1372],{"type":49,"value":1366},"Add placeholder to ",{"type":43,"tag":459,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":49,"value":1056},{"type":49,"value":1373}," if the project uses one",{"type":43,"tag":52,"props":1375,"children":1376},{},[1377],{"type":49,"value":1378},"Only LaunchDarkly SDK packages will be added unless the user explicitly approves other dependency changes.",{"type":43,"tag":52,"props":1380,"children":1381},{},[1382,1387,1389,1394,1396,1400],{"type":43,"tag":72,"props":1383,"children":1384},{},[1385],{"type":49,"value":1386},"Dual SDK:",{"type":49,"value":1388}," Present the same numbered format ",{"type":43,"tag":72,"props":1390,"children":1391},{},[1392],{"type":49,"value":1393},"separately for each track",{"type":49,"value":1395}," (e.g. \"Server-side:\" steps 1-7, then \"Client-side:\" steps 1-7), following ",{"type":43,"tag":63,"props":1397,"children":1398},{"href":1013},[1399],{"type":49,"value":471},{"type":49,"value":1401},". Do not omit the second track.",{"type":43,"tag":52,"props":1403,"children":1404},{},[1405],{"type":49,"value":1406},"After presenting the plan:",{"type":43,"tag":52,"props":1408,"children":1409},{},[1410,1415,1417,1426],{"type":43,"tag":72,"props":1411,"children":1412},{},[1413],{"type":49,"value":1414},"D6 -- NON-BLOCKING (proceed unless objected):",{"type":49,"value":1416}," Present the plan summary to the user with a note like \"Here's what I'm going to do -- say stop or let me know if anything looks wrong.\" Then ",{"type":43,"tag":72,"props":1418,"children":1419},{},[1420,1422],{"type":49,"value":1421},"continue into ",{"type":43,"tag":63,"props":1423,"children":1424},{"href":107},[1425],{"type":49,"value":110},{"type":49,"value":1427}," without waiting for explicit approval. If the user objects or says something looks wrong, stop and adjust the plan before continuing.",{"type":43,"tag":52,"props":1429,"children":1430},{},[1431],{"type":49,"value":1432},"This is intentionally non-blocking to reduce ceremony. The plan is visible to the user and they can interrupt at any time. The real safety gates are D7 (secret consent) and D8 (non-LD dependency changes) in the apply step.",{"type":43,"tag":52,"props":1434,"children":1435},{},[1436,1438,1443],{"type":49,"value":1437},"If the entrypoint is ambiguous or multiple SDKs could apply, those specific questions ",{"type":43,"tag":72,"props":1439,"children":1440},{},[1441],{"type":49,"value":1442},"are",{"type":49,"value":1444}," blocking -- ask them as part of the plan presentation using your structured question tool and wait for an answer before proceeding.",{"type":43,"tag":52,"props":1446,"children":1447},{},[1448,1452,1454,1458,1460,1465],{"type":43,"tag":72,"props":1449,"children":1450},{},[1451],{"type":49,"value":505},{"type":49,"value":1453}," ask for SDK keys, client-side IDs, or mobile keys as part of plan confirmation -- the parent flow collects those at ",{"type":43,"tag":63,"props":1455,"children":1456},{"href":107},[1457],{"type":49,"value":110},{"type":49,"value":1459},". The ",{"type":43,"tag":72,"props":1461,"children":1462},{},[1463],{"type":49,"value":1464},"Key type",{"type":49,"value":1466}," column above is for technical planning only, not a prompt for secrets.",{"type":43,"tag":52,"props":1468,"children":1469},{},[1470,1474,1476,1481,1483,1488],{"type":43,"tag":72,"props":1471,"children":1472},{},[1473],{"type":49,"value":505},{"type":49,"value":1475}," promise or imply that you will upgrade unrelated dependencies to satisfy the latest SDK -- ",{"type":43,"tag":63,"props":1477,"children":1478},{"href":107},[1479],{"type":49,"value":1480},"Apply",{"type":49,"value":1482}," requires ",{"type":43,"tag":72,"props":1484,"children":1485},{},[1486],{"type":49,"value":1487},"explicit approval",{"type":49,"value":1489}," before any non-LaunchDarkly package changes.",{"type":43,"tag":1491,"props":1492,"children":1493},"hr",{},[],{"type":43,"tag":52,"props":1495,"children":1496},{},[1497,1502,1503],{"type":43,"tag":72,"props":1498,"children":1499},{},[1500],{"type":49,"value":1501},"Upon completion:",{"type":49,"value":91},{"type":43,"tag":63,"props":1504,"children":1505},{"href":107},[1506],{"type":49,"value":110},{"items":1508,"total":1640},[1509,1524,1533,1547,1558,1570,1578,1592,1603,1612,1622,1631],{"slug":1510,"name":1510,"fn":1511,"description":1512,"org":1513,"tags":1514,"stars":20,"repoUrl":21,"updatedAt":1523},"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},[1515,1518,1519,1520],{"name":1516,"slug":1517,"type":15},"Agents","agents",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1521,"slug":1522,"type":15},"Multi-Agent","multi-agent","2026-07-28T05:33:33.709407",{"slug":1525,"name":1525,"fn":1526,"description":1527,"org":1528,"tags":1529,"stars":20,"repoUrl":21,"updatedAt":1532},"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},[1530,1531],{"name":1516,"slug":1517,"type":15},{"name":13,"slug":14,"type":15},"2026-05-22T06:55:56.527064",{"slug":1534,"name":1534,"fn":1535,"description":1536,"org":1537,"tags":1538,"stars":20,"repoUrl":21,"updatedAt":1546},"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},[1539,1542,1543],{"name":1540,"slug":1541,"type":15},"Analytics","analytics",{"name":9,"slug":8,"type":15},{"name":1544,"slug":1545,"type":15},"Metrics","metrics","2026-05-22T06:55:53.858749",{"slug":1548,"name":1548,"fn":1549,"description":1550,"org":1551,"tags":1552,"stars":20,"repoUrl":21,"updatedAt":1557},"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},[1553,1554],{"name":9,"slug":8,"type":15},{"name":1555,"slug":1556,"type":15},"Reference","reference","2026-05-22T06:55:41.790591",{"slug":1559,"name":1559,"fn":1560,"description":1561,"org":1562,"tags":1563,"stars":20,"repoUrl":21,"updatedAt":1569},"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},[1564,1565,1568],{"name":1540,"slug":1541,"type":15},{"name":1566,"slug":1567,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:57.84851",{"slug":1571,"name":1571,"fn":1572,"description":1573,"org":1574,"tags":1575,"stars":20,"repoUrl":21,"updatedAt":1577},"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},[1576],{"name":1555,"slug":1556,"type":15},"2026-05-22T06:55:44.464733",{"slug":1579,"name":1579,"fn":1580,"description":1581,"org":1582,"tags":1583,"stars":20,"repoUrl":21,"updatedAt":1591},"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},[1584,1587,1588],{"name":1585,"slug":1586,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":1589,"slug":1590,"type":15},"Testing","testing","2026-05-22T06:55:55.179617",{"slug":1593,"name":1593,"fn":1594,"description":1595,"org":1596,"tags":1597,"stars":20,"repoUrl":21,"updatedAt":1602},"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},[1598,1601],{"name":1599,"slug":1600,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},"2026-05-22T06:55:48.522229",{"slug":1604,"name":1604,"fn":1605,"description":1606,"org":1607,"tags":1608,"stars":20,"repoUrl":21,"updatedAt":1611},"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},[1609,1610],{"name":1599,"slug":1600,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:47.16557",{"slug":1613,"name":1613,"fn":1614,"description":1615,"org":1616,"tags":1617,"stars":20,"repoUrl":21,"updatedAt":1621},"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},[1618,1619,1620],{"name":1599,"slug":1600,"type":15},{"name":1566,"slug":1567,"type":15},{"name":9,"slug":8,"type":15},"2026-05-22T06:55:49.845445",{"slug":1623,"name":1623,"fn":1624,"description":1625,"org":1626,"tags":1627,"stars":20,"repoUrl":21,"updatedAt":1630},"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},[1628,1629],{"name":9,"slug":8,"type":15},{"name":1555,"slug":1556,"type":15},"2026-05-22T06:55:39.13373",{"slug":1632,"name":1632,"fn":1633,"description":1634,"org":1635,"tags":1636,"stars":20,"repoUrl":21,"updatedAt":1639},"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},[1637,1638],{"name":9,"slug":8,"type":15},{"name":1555,"slug":1556,"type":15},"2026-05-22T06:55:40.464884",49,{"items":1642,"total":1640},[1643,1650,1655,1661,1666,1672,1676],{"slug":1510,"name":1510,"fn":1511,"description":1512,"org":1644,"tags":1645,"stars":20,"repoUrl":21,"updatedAt":1523},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1646,1647,1648,1649],{"name":1516,"slug":1517,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1521,"slug":1522,"type":15},{"slug":1525,"name":1525,"fn":1526,"description":1527,"org":1651,"tags":1652,"stars":20,"repoUrl":21,"updatedAt":1532},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1653,1654],{"name":1516,"slug":1517,"type":15},{"name":13,"slug":14,"type":15},{"slug":1534,"name":1534,"fn":1535,"description":1536,"org":1656,"tags":1657,"stars":20,"repoUrl":21,"updatedAt":1546},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1658,1659,1660],{"name":1540,"slug":1541,"type":15},{"name":9,"slug":8,"type":15},{"name":1544,"slug":1545,"type":15},{"slug":1548,"name":1548,"fn":1549,"description":1550,"org":1662,"tags":1663,"stars":20,"repoUrl":21,"updatedAt":1557},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1664,1665],{"name":9,"slug":8,"type":15},{"name":1555,"slug":1556,"type":15},{"slug":1559,"name":1559,"fn":1560,"description":1561,"org":1667,"tags":1668,"stars":20,"repoUrl":21,"updatedAt":1569},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1669,1670,1671],{"name":1540,"slug":1541,"type":15},{"name":1566,"slug":1567,"type":15},{"name":9,"slug":8,"type":15},{"slug":1571,"name":1571,"fn":1572,"description":1573,"org":1673,"tags":1674,"stars":20,"repoUrl":21,"updatedAt":1577},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1675],{"name":1555,"slug":1556,"type":15},{"slug":1579,"name":1579,"fn":1580,"description":1581,"org":1677,"tags":1678,"stars":20,"repoUrl":21,"updatedAt":1591},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1679,1680,1681],{"name":1585,"slug":1586,"type":15},{"name":9,"slug":8,"type":15},{"name":1589,"slug":1590,"type":15}]