[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fcli-skills":123},[4,9,13,17,22,26,30,34,38,42,46,50,55,59,63,67,72,76,80,85,89,93,97,102,106,110,114,119],{"path":5,"title":6,"description":7,"group":8},"\u002Fdocs","Introduction","What tunables is, the problem it solves, and the principles it holds to.","Get started",{"path":10,"title":11,"description":12,"group":8},"\u002Fdocs\u002Fquickstart","Quickstart","Take one group of settings from constants to a screen with a history, in a Nuxt app on Postgres.",{"path":14,"title":15,"description":16,"group":8},"\u002Fdocs\u002Fpatterns","What it is for","The kinds of value tunables keeps — live limits, plans, per-workspace and per-person values, model choices, values that bound each other, costly switches — and the feature that does each.",{"path":18,"title":19,"description":20,"group":21},"\u002Fdocs\u002Fsettings-and-groups","Settings and groups","Declare each setting once, in a group edited beside what it affects, and read it with types.","Concepts",{"path":23,"title":24,"description":25,"group":21},"\u002Fdocs\u002Fkinds-and-units","Kinds and units","The eight kinds of setting, the built-in units, your own units, and how values are checked and read.",{"path":27,"title":28,"description":29,"group":21},"\u002Fdocs\u002Fchecks-and-guards","Checks and guards","Rules across settings, guards for what your app keeps, within for presets, confirmations for costly changes, and notes.",{"path":31,"title":32,"description":33,"group":21},"\u002Fdocs\u002Fhistory-and-restore","History and restore","Every change is a revision with who, when, why and each value before and after; restoring one runs the same checks as any save.",{"path":35,"title":36,"description":37,"group":21},"\u002Fdocs\u002Fpresets","Presets","Named, reusable configurations with one default per slot, assigned by reference and bounded by the settings.",{"path":39,"title":40,"description":41,"group":21},"\u002Fdocs\u002Fscopes","Scopes","Values per workspace and per person, through layers — the system, a plan, the workspace, the person — each bounded by what it inherits.",{"path":43,"title":44,"description":45,"group":21},"\u002Fdocs\u002Fcatalogs","Catalogs","Lists of allowed choices, such as permitted models, whose entries are retired rather than deleted and cannot be retired while in use.",{"path":47,"title":48,"description":49,"group":21},"\u002Fdocs\u002Fdeployment-values","Deployment values","Values a deployment sets in its environment and nobody tunes while the app runs, declared once and listed in .env.example.",{"path":51,"title":52,"description":53,"group":54},"\u002Fdocs\u002Fstorage","Storage","Postgres through your own client, the four tables and how to create them, joining your transactions, and the storage contract behind it.","Integrate",{"path":56,"title":57,"description":58,"group":54},"\u002Fdocs\u002Fserver","Server and access","Mount tunables' API as a fetch handler in Nitro, Hono, Bun or Deno, as Express middleware or as an oRPC router, with access decided by your app.",{"path":60,"title":61,"description":62,"group":54},"\u002Fdocs\u002Faccess","Who can do what","End users bound by values they never see, staff who tune groups, owners and members who change only their own scope, and the terminal.",{"path":64,"title":65,"description":66,"group":54},"\u002Fdocs\u002Ftesting","Testing","Your app's tunables in memory for its own tests, with values set where a test needs them, and how to test rules, guards and confirmations.",{"path":68,"title":69,"description":70,"group":71},"\u002Fdocs\u002Fnuxt-layer","The Nuxt layer","Ready screens for a Nuxt UI app — a group's form, All settings, history, presets, assignments and catalogs — placed beside what they affect.","Screens",{"path":73,"title":74,"description":75,"group":71},"\u002Fdocs\u002Fvue-composables","Vue composables","Headless composables for building tunables' screens in any Vue app, on any design system.",{"path":77,"title":78,"description":79,"group":71},"\u002Fdocs\u002Ftheming","Theming","The screens bring no colors, fonts or CSS of their own; they take your Nuxt UI theme.",{"path":81,"title":82,"description":83,"group":84},"\u002Fdocs\u002Fcli","The CLI","The tunables command, tunables.config.ts, and which commands need a database.","CLI",{"path":86,"title":87,"description":88,"group":84},"\u002Fdocs\u002Fcli-check","Check and generate","The commands that need no database — checking definitions, writing .env.example, and keeping explanations and defaults in step with a pdd-kit Product Model.",{"path":90,"title":91,"description":92,"group":84},"\u002Fdocs\u002Fcli-values","Read and change values","The commands that read and change stored values, through the same checks and history as the screens.",{"path":94,"title":95,"description":96,"group":84},"\u002Fdocs\u002Fcli-skills","Install skills","Install tunables' agent skills for Claude Code, Codex CLI, Cursor, Gemini CLI and GitHub Copilot, and keep them current.",{"path":98,"title":99,"description":100,"group":101},"\u002Fdocs\u002Fskills","Agent skills","Three skills that let a coding agent adopt tunables, define settings the right way and verify that every value has one home.","Skills",{"path":103,"title":104,"description":105,"group":101},"\u002Fdocs\u002Fskill-adopt","tunables-adopt","Bring tunables into an app that has none yet, from an inventory of every value to a wired, synced app with the old homes removed.",{"path":107,"title":108,"description":109,"group":101},"\u002Fdocs\u002Fskill-define","tunables-define","Add, change, rename or remove one value in an app that uses tunables, with its home, its checks, its reads and what happens to stored values.",{"path":111,"title":112,"description":113,"group":101},"\u002Fdocs\u002Fskill-verify","tunables-verify","Audit an app's tunables against their rules, report every finding with where it is and the rule it breaks, and fix only the findings you choose.",{"path":115,"title":116,"description":117,"group":118},"\u002Fdocs\u002Fapi","API reference","Every export of the tunables package, by the subpath it is imported from.","Reference",{"path":120,"title":121,"description":122,"group":118},"\u002Fdocs\u002Ftasklane-example","Tasklane, the example app","A todo app with workspaces and people as tunables — two groups, plans as a layer, a catalog of models, scopes, a rule, a confirmation, and the playground that runs it.",{"id":124,"title":95,"body":125,"description":96,"extension":504,"group":84,"meta":505,"navigation":506,"order":507,"path":94,"seo":508,"stem":509,"__hash__":510},"docs\u002Fdocs\u002Fcli-skills.md",{"type":126,"value":127,"toc":499},"minimark",[128,133,151,155,180,192,318,324,388,402,428,431,445,448,492,495],[129,130,132],"h1",{"id":131},"install-skills-install-update","Install skills: install, update",[134,135,136,140,141,146,147,150],"p",{},[137,138,139],"code",{},"tunables install"," puts the three ",[142,143,145],"a",{"href":144},".\u002Fskills","agent skills"," where your\ncoding agents read them. ",[137,148,149],{},"tunables update"," refreshes them to the version of\nthe CLI you run.",[152,153,154],"h2",{"id":154},"install",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-bash shiki shiki-themes tunables-panel-light tunables-panel-light tunables-panel-dark","npx tunables install\n","bash","",[137,163,164],{"__ignoreMap":161},[165,166,169,173,177],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sOThN","npx",[165,174,176],{"class":175},"sjCzm"," tunables",[165,178,179],{"class":175}," install\n",[134,181,182,183,185,186,188,189,191],{},"It finds the agent harnesses on your machine or in the project, asks which to\ninstall for and where, and copies ",[137,184,104],{},", ",[137,187,108],{}," and\n",[137,190,112],{}," into each.",[193,194,195,214],"table",{},[196,197,198],"thead",{},[199,200,201,205,208,211],"tr",{},[202,203,204],"th",{},"Provider",[202,206,207],{},"Id",[202,209,210],{},"Project",[202,212,213],{},"Global",[215,216,217,238,258,278,298],"tbody",{},[199,218,219,223,228,233],{},[220,221,222],"td",{},"Claude Code",[220,224,225],{},[137,226,227],{},"claude",[220,229,230],{},[137,231,232],{},".claude\u002Fskills",[220,234,235],{},[137,236,237],{},"~\u002F.claude\u002Fskills",[199,239,240,243,248,253],{},[220,241,242],{},"Codex CLI",[220,244,245],{},[137,246,247],{},"codex",[220,249,250],{},[137,251,252],{},".agents\u002Fskills",[220,254,255],{},[137,256,257],{},"~\u002F.agents\u002Fskills",[199,259,260,263,268,273],{},[220,261,262],{},"Cursor",[220,264,265],{},[137,266,267],{},"cursor",[220,269,270],{},[137,271,272],{},".cursor\u002Fskills",[220,274,275],{},[137,276,277],{},"~\u002F.cursor\u002Fskills",[199,279,280,283,288,293],{},[220,281,282],{},"Gemini CLI",[220,284,285],{},[137,286,287],{},"gemini",[220,289,290],{},[137,291,292],{},".gemini\u002Fskills",[220,294,295],{},[137,296,297],{},"~\u002F.gemini\u002Fskills",[199,299,300,303,308,313],{},[220,301,302],{},"GitHub Copilot",[220,304,305],{},[137,306,307],{},"github",[220,309,310],{},[137,311,312],{},".github\u002Fskills",[220,314,315],{},[137,316,317],{},"~\u002F.copilot\u002Fskills",[134,319,320,323],{},[137,321,322],{},"CLAUDE_CONFIG_DIR"," moves Claude Code's global directory, as it does for\nClaude Code itself.",[193,325,326,336],{},[196,327,328],{},[199,329,330,333],{},[202,331,332],{},"Option",[202,334,335],{},"Does",[215,337,338,351,368,378],{},[199,339,340,345],{},[220,341,342],{},[137,343,344],{},"--providers \u003Clist>",[220,346,347,348],{},"Install for these, comma-separated: ",[137,349,350],{},"claude,codex,cursor,gemini,github",[199,352,353,358],{},[220,354,355],{},[137,356,357],{},"--scope \u003Cscope>",[220,359,360,363,364,367],{},[137,361,362],{},"project",", in this repository, or ",[137,365,366],{},"global",", for your user",[199,369,370,375],{},[220,371,372],{},[137,373,374],{},"--yes",[220,376,377],{},"Accept the detected providers (Claude Code and Codex when none is found) and the project scope, without asking",[199,379,380,385],{},[220,381,382],{},[137,383,384],{},"--force",[220,386,387],{},"Replace a skill directory of the same name that tunables did not install",[134,389,390,391,393,394,397,398,401],{},"Without a terminal, pass ",[137,392,374],{}," or both ",[137,395,396],{},"--providers"," and ",[137,399,400],{},"--scope",". Every\ntarget is checked before anything is written, so a refusal leaves nothing half\ninstalled. Commit the project skills with your repository, so everyone working\non the app gets them.",[156,403,405],{"className":158,"code":404,"language":160,"meta":161,"style":161},"npx tunables install --providers claude,codex --scope project\n",[137,406,407],{"__ignoreMap":161},[165,408,409,411,413,416,419,422,425],{"class":167,"line":168},[165,410,172],{"class":171},[165,412,176],{"class":175},[165,414,415],{"class":175}," install",[165,417,418],{"class":175}," --providers",[165,420,421],{"class":175}," claude,codex",[165,423,424],{"class":175}," --scope",[165,426,427],{"class":175}," project\n",[152,429,430],{"id":430},"update",[156,432,434],{"className":158,"code":433,"language":160,"meta":161,"style":161},"npx tunables update\n",[137,435,436],{"__ignoreMap":161},[165,437,438,440,442],{"class":167,"line":168},[165,439,172],{"class":171},[165,441,176],{"class":175},[165,443,444],{"class":175}," update\n",[134,446,447],{},"Finds the skill installations tunables made, in the project and for your user,\nand refreshes each to this CLI's version. It names, but never touches, a\nskills directory it did not install.",[193,449,450,458],{},[196,451,452],{},[199,453,454,456],{},[202,455,332],{},[202,457,335],{},[215,459,460,469,483],{},[199,461,462,466],{},[220,463,464],{},[137,465,344],{},[220,467,468],{},"Only look for these providers",[199,470,471,475],{},[220,472,473],{},[137,474,357],{},[220,476,477,478,480,481],{},"Only look in ",[137,479,362],{}," or ",[137,482,366],{},[199,484,485,489],{},[220,486,487],{},[137,488,384],{},[220,490,491],{},"Replace an unmarked collision inside a managed installation",[134,493,494],{},"Run it after upgrading the package, so the skills and the library they\ndescribe agree.",[496,497,498],"style",{},"html pre.shiki code .sOThN, html code.shiki .sOThN{--shiki-light:#2A3439;--shiki-light-font-weight:bold;--shiki-default:#2A3439;--shiki-default-font-weight:bold;--shiki-dark:#F6F8F8;--shiki-dark-font-weight:bold}html pre.shiki code .sjCzm, html code.shiki .sjCzm{--shiki-light:#92400E;--shiki-default:#92400E;--shiki-dark:#FCD34D}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);}",{"title":161,"searchDepth":500,"depth":500,"links":501},2,[502,503],{"id":154,"depth":500,"text":154},{"id":430,"depth":500,"text":430},"md",{},true,22,{"title":95,"description":96},"docs\u002Fcli-skills","2kPOntkxZQI1fkv31joX8CzMqFCzUV3PU-5ENGyvUvQ",1792845119188]