[{"data":1,"prerenderedAt":704},["ShallowReactive",2],{"navigation_docs":3,"-integrations-agents":282,"-integrations-agents-surround":699},[4,10,57,83,236,267],{"title":5,"path":6,"stem":7,"icon":8,"exact":9},"Introduction","\u002F","0.index","i-lucide-book-open",true,{"title":11,"icon":12,"modifiedAt":13,"path":14,"stem":15,"children":16,"page":12},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[17,22,27,32,37,42,47,52],{"title":18,"path":19,"stem":20,"icon":21},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":23,"path":24,"stem":25,"icon":26},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":28,"path":29,"stem":30,"icon":31},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":33,"path":34,"stem":35,"icon":36},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":38,"path":39,"stem":40,"icon":41},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":48,"path":49,"stem":50,"icon":51},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":53,"path":54,"stem":55,"icon":56},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":58,"modifiedAt":59,"defaultOpen":9,"path":60,"stem":61,"children":62,"page":12},"Monitoring","2026-09-24T23:33:20.000Z","\u002Fmonitoring","2.monitoring",[63,68,73,78],{"title":64,"path":65,"stem":66,"icon":67},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":69,"path":70,"stem":71,"icon":72},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":74,"path":75,"stem":76,"icon":77},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":79,"path":80,"stem":81,"icon":82},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":84,"modifiedAt":59,"defaultOpen":9,"path":85,"stem":86,"children":87,"page":12},"SDKs","\u002Fsdks","3.sdks",[88,93,114,139,155,186,231],{"title":89,"path":90,"stem":91,"icon":92},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":94,"modifiedAt":59,"icon":95,"defaultOpen":12,"path":96,"stem":97,"children":98,"page":12},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[99,104,109],{"title":100,"path":101,"stem":102,"icon":103},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":105,"path":106,"stem":107,"icon":108},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":110,"path":111,"stem":112,"icon":113},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":115,"modifiedAt":59,"icon":116,"defaultOpen":12,"path":117,"stem":118,"children":119,"page":12},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[120,124,129,134],{"title":121,"path":122,"stem":123,"icon":108},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":125,"path":126,"stem":127,"icon":128},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":130,"path":131,"stem":132,"icon":133},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":135,"path":136,"stem":137,"icon":138},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":140,"modifiedAt":59,"icon":141,"defaultOpen":12,"path":142,"stem":143,"children":144,"page":12},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[145,150],{"title":146,"path":147,"stem":148,"icon":149},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":151,"path":152,"stem":153,"icon":154},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":156,"modifiedAt":59,"icon":157,"defaultOpen":12,"path":158,"stem":159,"children":160,"page":12},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[161,166,171,176,181],{"title":162,"path":163,"stem":164,"icon":165},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":167,"path":168,"stem":169,"icon":170},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":172,"path":173,"stem":174,"icon":175},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":177,"path":178,"stem":179,"icon":180},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":182,"path":183,"stem":184,"icon":185},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":187,"modifiedAt":59,"icon":188,"defaultOpen":12,"path":189,"stem":190,"children":191},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature\u002Findex",[192,194,199,203,207,211,215,219,223,227],{"title":193,"path":189,"stem":190,"icon":188},"Overview",{"title":195,"path":196,"stem":197,"icon":188,"icons":198},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[188,103],{"title":130,"path":200,"stem":201,"icon":188,"icons":202},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[188,133],{"title":135,"path":204,"stem":205,"icon":188,"icons":206},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[188,138],{"title":125,"path":208,"stem":209,"icon":188,"icons":210},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[188,128],{"title":162,"path":212,"stem":213,"icon":188,"icons":214},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[188,165],{"title":167,"path":216,"stem":217,"icon":188,"icons":218},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[188,170],{"title":172,"path":220,"stem":221,"icon":188,"icons":222},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[188,175],{"title":177,"path":224,"stem":225,"icon":188,"icons":226},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[188,180],{"title":182,"path":228,"stem":229,"icon":188,"icons":230},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[188,185],{"title":232,"path":233,"stem":234,"icon":235},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":237,"modifiedAt":59,"defaultOpen":9,"path":238,"stem":239,"children":240,"page":12},"Integrations","\u002Fintegrations","4.integrations",[241,246,251,257,262],{"title":242,"path":243,"stem":244,"icon":245},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F1.mcp","cd-logos-mcp",{"title":247,"path":248,"stem":249,"icon":250},"Agent Skills","\u002Fintegrations\u002Fagents","4.integrations\u002F2.agents","i-lucide-bot",{"title":252,"path":253,"stem":254,"icon":255,"badge":256},"CLI","\u002Fintegrations\u002Fcli","4.integrations\u002F3.cli","cd-logos-cli","Beta",{"title":258,"path":259,"stem":260,"icon":261},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F4.terraform","cd-logos-terraform",{"title":263,"path":264,"stem":265,"icon":266},"Admin API","\u002Fintegrations\u002Fadmin-api","4.integrations\u002F5.admin-api","i-lucide-blocks",{"title":268,"modifiedAt":269,"defaultOpen":9,"path":270,"stem":271,"children":272,"page":12},"Migration Guides","2026-10-16T17:57:49.000Z","\u002Fmigration-guides","5.migration-guides",[273,278],{"title":274,"path":275,"stem":276,"icon":277},"From LaunchDarkly","\u002Fmigration-guides\u002Flaunchdarkly","5.migration-guides\u002F1.launchdarkly","i-lucide-baggage-claim",{"title":279,"path":280,"stem":281,"icon":277},"From Firebase Remote Config","\u002Fmigration-guides\u002Ffirebase-remote-config","5.migration-guides\u002F2.firebase-remote-config",{"id":283,"title":247,"body":284,"description":691,"extension":692,"links":693,"meta":694,"navigation":696,"path":248,"seo":697,"stem":249,"__hash__":698},"docs\u002F4.integrations\u002F2.agents.md",{"type":285,"value":286,"toc":683},"minimark",[287,291,304,308,319,323,326,355,366,403,421,425,553,557,579,585,617,626,640,644,647,665,669,679],[288,289,5],"h2",{"id":290},"introduction",[292,293,294,295,303],"note",{},"The agent skills are a pre-release. What a skill does may change before 1.0, and the ",[296,297,302],"a",{"href":298,"rel":299,"target":301},"https:\u002F\u002Fgithub.com\u002FConfigDirector\u002Fagent-skills\u002Fblob\u002Fmain\u002FCHANGELOG.md",[300],"noopener","_blank","changelog"," lists every change.",[305,306,307],"p",{},"An agent skill is a set of instructions your coding agent loads to carry out one ConfigDirector task, such as adding an SDK to your project or checking config keys in CI. Once the skills are installed, ask your agent to add feature flags to your app, and it picks the matching skill on its own and does the work the way someone who has read these docs would.",[305,309,310,311,315,316,318],{},"The skills use the shared ",[296,312,247],{"href":313,"rel":314,"target":301},"https:\u002F\u002Fagentskills.io",[300]," format, so they work with any coding agent that reads it. Two of them give your agent rules for writing and testing code that reads configs. They need no API token of their own, and run the ",[296,317,252],{"href":253},"'s checks only when your project already has the CLI set up.",[288,320,322],{"id":321},"install","Install",[305,324,325],{},"Run this in your project:",[327,328,333],"pre",{"className":329,"code":330,"language":331,"meta":332,"style":332},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npx skills add ConfigDirector\u002Fagent-skills\n","bash","",[334,335,336],"code",{"__ignoreMap":332},[337,338,341,345,349,352],"span",{"class":339,"line":340},"line",1,[337,342,344],{"class":343},"sbgvK","npx",[337,346,348],{"class":347},"s_sjI"," skills",[337,350,351],{"class":347}," add",[337,353,354],{"class":347}," ConfigDirector\u002Fagent-skills\n",[305,356,357,358,361,362,365],{},"It asks which skills to install, which of your coding agents to install them into, and whether to install them in the current project, where you can commit them for your team, or for every project on your machine. Add ",[334,359,360],{},"-g"," to install for every project without being asked, or ",[334,363,364],{},"--skill"," with a skill's name to install only that one:",[327,367,369],{"className":329,"code":368,"language":331,"meta":332,"style":332},"npx skills add ConfigDirector\u002Fagent-skills -g\nnpx skills add ConfigDirector\u002Fagent-skills --skill configdirector-setup\n",[334,370,371,386],{"__ignoreMap":332},[337,372,373,375,377,379,382],{"class":339,"line":340},[337,374,344],{"class":343},[337,376,348],{"class":347},[337,378,351],{"class":347},[337,380,381],{"class":347}," ConfigDirector\u002Fagent-skills",[337,383,385],{"class":384},"stzsN"," -g\n",[337,387,389,391,393,395,397,400],{"class":339,"line":388},2,[337,390,344],{"class":343},[337,392,348],{"class":347},[337,394,351],{"class":347},[337,396,381],{"class":347},[337,398,399],{"class":384}," --skill",[337,401,402],{"class":347}," configdirector-setup\n",[305,404,405,408,409,414,415,420],{},[334,406,407],{},"npx skills add"," works with Claude Code, Cursor, Codex, GitHub Copilot, Gemini CLI, Windsurf and ",[296,410,413],{"href":411,"rel":412,"target":301},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills#supported-agents",[300],"the other agents it supports",". The skills live in the ",[296,416,419],{"href":417,"rel":418,"target":301},"https:\u002F\u002Fgithub.com\u002FConfigDirector\u002Fagent-skills",[300],"ConfigDirector\u002Fagent-skills"," repository on GitHub.",[288,422,424],{"id":423},"the-skills","The skills",[426,427,428,444],"table",{},[429,430,431],"thead",{},[432,433,434,438,441],"tr",{},[435,436,437],"th",{},"Skill",[435,439,440],{},"What it does",[435,442,443],{},"API token permissions",[445,446,447,471,486,504,517,529],"tbody",{},[432,448,449,455,458],{},[450,451,452],"td",{},[334,453,454],{},"configdirector-setup",[450,456,457],{},"Adds ConfigDirector to your project: picks the SDK for your framework, installs it, reads the SDK key from an environment variable, creates a first feature flag once you confirm it, and evaluates the flag in your code.",[450,459,460,463,464,463,467,470],{},[334,461,462],{},"Projects: Read",", ",[334,465,466],{},"Configs: Read",[334,468,469],{},"Configs: Create",", for the first flag",[432,472,473,478,481],{},[450,474,475],{},[334,476,477],{},"configdirector-connect",[450,479,480],{},"Sets up your agent's access to your ConfigDirector account, through the MCP server or the CLI, and checks it with one read.",[450,482,483,485],{},[334,484,462],{},", plus the permissions you choose for the agent",[432,487,488,493,496],{},[450,489,490],{},[334,491,492],{},"configdirector-flag-a-change",[450,494,495],{},"Wraps a code change in a new temporary feature flag: proposes a key, creates a boolean flag that is off in every environment once you confirm it, and reads it in your code so the change runs where the flag is on and your app behaves as before where it is off, with a test for each branch.",[450,497,498,463,500,463,502],{},[334,499,462],{},[334,501,466],{},[334,503,469],{},[432,505,506,511,514],{},[450,507,508],{},[334,509,510],{},"configdirector-use-configs-in-code",[450,512,513],{},"Gives your agent the rules for code that reads a config: what the in-code default value is for, the type to read each config as, which SDKs receive it, the evaluation context, keys the CLI can check, and one client per app. Applies when your agent writes or reviews such code.",[450,515,516],{},"None of its own",[432,518,519,524,527],{},[450,520,521],{},[334,522,523],{},"configdirector-test-with-flags",[450,525,526],{},"Gives your agent the rules for testing code that reads a config: the SDK's test client or the OpenFeature in-memory provider instead of a mock, no real SDK key, a test for each branch of a flag, and test values of the config's type. Applies when your agent writes tests around flagged code.",[450,528,516],{},[432,530,531,536,546],{},[450,532,533],{},[334,534,535],{},"configdirector-validate-in-ci",[450,537,538,539,545],{},"Adds ",[296,540,542],{"href":541},"\u002Fintegrations\u002Fcli#validate",[334,543,544],{},"configdirector validate"," to your repository's CI, so the build fails when the code reads a config key that does not exist, was renamed, or has the wrong type.",[450,547,548,463,550,552],{},[334,549,462],{},[334,551,466],{},", for a token used only by CI",[288,554,556],{"id":555},"how-the-skills-reach-your-account","How the skills reach your account",[305,558,559,560,562,563,565,566,568,569,572,573,575,576,578],{},"Besides ",[334,561,477],{},", three skills work with your ConfigDirector account. ",[334,564,454],{}," and ",[334,567,492],{}," create a flag through the ",[296,570,571],{"href":243},"MCP server"," when your agent has it set up, and through the ",[296,574,252],{"href":253}," otherwise. ",[334,577,535],{}," checks your code with the CLI, the same command your CI runs.",[305,580,581,582,584],{},"Each needs access set up with an API token you create. Ask your agent to connect ConfigDirector, and ",[334,583,477],{}," sets it up with you:",[586,587,588,592,600,614],"ol",{},[589,590,591],"li",{},"It asks what you want the agent to do, and names the permissions for it.",[589,593,594,595,599],{},"In the ConfigDirector dashboard, you open ",[596,597,598],"strong",{},"API tokens"," and create a token with those permissions and an expiration.",[589,601,602,603,606,607,613],{},"If your agent supports MCP servers, it adds the MCP server with the configuration the ",[296,604,605],{"href":243},"MCP page"," gives for your agent. Otherwise, it has you install the CLI and sign in with ",[296,608,610],{"href":609},"\u002Fintegrations\u002Fcli#sign-in-on-your-machine",[334,611,612],{},"configdirector login"," in your own terminal.",[589,615,616],{},"It checks the access with one read and tells you what the token can do.",[305,618,619,620,622,623,625],{},"A skill that finds neither set up sends you to ",[334,621,477],{},"; ",[334,624,454],{}," then still adds the SDK to your project, and asks you to create the first flag in the dashboard. You can also set up either one by hand from its page.",[305,627,628,629,633,634,636,637,639],{},"The token's permissions decide what your agent can do. The MCP server offers only the tools they allow, so a read-only token makes a read-only agent, and the CLI refuses a command that needs a permission the token lacks. Changes your agent makes through the MCP server show in the ",[296,630,632],{"href":631},"\u002Fintegrations\u002Fadmin-api#terraform-opentofu-the-cli-and-the-audit-log","audit log"," with the source ",[596,635,242],{}," and the name of the member who created the token, and changes made through the CLI with the source ",[596,638,252],{},".",[288,641,643],{"id":642},"safety","Safety",[305,645,646],{},"The skills follow these rules:",[648,649,650,656,659,662],"ul",{},[589,651,652,653,655],{},"Your agent never sees your API token. The MCP configuration reads the token from an environment variable or your editor's secret prompt, and you sign in to the CLI with ",[334,654,612],{}," in your own terminal. Never paste a token into the chat, where it would stay in the transcript. If you do, the skill asks you to revoke it and create another.",[589,657,658],{},"Every change to your account is confirmed: a skill shows what it will create or change, and waits for your yes.",[589,660,661],{},"Before a skill changes the targeting rules of a live environment, archives a config, or removes code, it shows you the exact change.",[589,663,664],{},"No skill deletes anything in your account.",[288,666,668],{"id":667},"versions","Versions",[305,670,671,672,675,676,639],{},"The skills are released together under one version number, and the ",[296,673,302],{"href":298,"rel":674,"target":301},[300]," lists what each release changed. To update the skills you installed, run ",[334,677,678],{},"npx skills update",[680,681,682],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":332,"searchDepth":388,"depth":388,"links":684},[685,686,687,688,689,690],{"id":290,"depth":388,"text":5},{"id":321,"depth":388,"text":322},{"id":423,"depth":388,"text":424},{"id":555,"depth":388,"text":556},{"id":642,"depth":388,"text":643},{"id":667,"depth":388,"text":668},"Install the ConfigDirector agent skills, so your coding agent adds an SDK to your project, wraps a change in a feature flag, reads and tests configs the way these docs describe, and checks config keys in CI","md",null,{"modifiedAt":695},"2026-10-18T01:22:06.000Z",{"title":247,"icon":250},{"title":247,"description":691},"lWfCvTI6qH5WEN-1XgwT--wpPhTH7J3W6LLJ7ohFGV4",[700,702],{"title":242,"path":243,"stem":244,"description":701,"icon":245,"children":-1},"Manage projects, configs, targeting rules, and segments from AI coding tools through the Model Context Protocol",{"title":252,"path":253,"stem":254,"description":703,"icon":255,"badge":256,"children":-1},"Find where your code reads each config, fail the build when it reads a key that does not exist, was renamed, or has the wrong type, see the value a context gets for a config and why, read a project's configs and targeting rules, create configs, replace a config's targeting rules, and archive configs, with the configdirector command line tool",1792286652537]