[{"data":1,"prerenderedAt":413},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fskills":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":99,"body":125,"description":100,"extension":406,"group":101,"meta":407,"navigation":408,"order":409,"path":98,"seo":410,"stem":411,"__hash__":412},"docs\u002Fdocs\u002Fskills.md",{"type":126,"value":127,"toc":400},"minimark",[128,132,141,198,203,228,239,242,250,254,257,297,303,307,396],[129,130,99],"h1",{"id":131},"agent-skills",[133,134,135,136,140],"p",{},"tunables ships three skills for coding agents. Each is a self-contained\n",[137,138,139],"code",{},"SKILL.md"," with its references, written to the same principles as the library,\nso an agent working in your app holds the same line a careful person would:\none home per value, no fallback defaults, every change a revision, access left\nto your app.",[142,143,144,157],"table",{},[145,146,147],"thead",{},[148,149,150,154],"tr",{},[151,152,153],"th",{},"Skill",[151,155,156],{},"Use it to",[158,159,160,174,186],"tbody",{},[148,161,162,171],{},[163,164,165],"td",{},[166,167,169],"a",{"href":168},".\u002Fskill-adopt",[137,170,104],{},[163,172,173],{},"Bring tunables into an app that has none yet: inventory every value, decide its home, and wire the whole thing after you approve.",[148,175,176,183],{},[163,177,178],{},[166,179,181],{"href":180},".\u002Fskill-define",[137,182,108],{},[163,184,185],{},"Add, change, rename or remove one setting, group, preset set, catalog or deployment value in an app that already uses tunables.",[148,187,188,195],{},[163,189,190],{},[166,191,193],{"href":192},".\u002Fskill-verify",[137,194,112],{},[163,196,197],{},"Audit an app's tunables: report every value still hard-coded, kept in two homes or unguarded, and fix only what you choose.",[199,200,202],"h2",{"id":201},"installing-them","Installing them",[204,205,210],"pre",{"className":206,"code":207,"language":208,"meta":209,"style":209},"language-bash shiki shiki-themes tunables-panel-light tunables-panel-light tunables-panel-dark","npx tunables install\n","bash","",[137,211,212],{"__ignoreMap":209},[213,214,217,221,225],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"sOThN","npx",[213,222,224],{"class":223},"sjCzm"," tunables",[213,226,227],{"class":223}," install\n",[133,229,230,231,234,235,238],{},"It installs the skills for Claude Code, Codex CLI, Cursor, Gemini CLI and\nGitHub Copilot, in the project or for your user. See\n",[166,232,95],{"href":233},".\u002Fcli-skills",". After upgrading tunables, run\n",[137,236,237],{},"npx tunables update"," so the skills match the library.",[133,240,241],{},"In Claude Code you can also add the repository as a plugin marketplace:",[204,243,248],{"className":244,"code":246,"language":247},[245],"language-text","\u002Fplugin marketplace add itai-gendler\u002Ftunables\n\u002Fplugin install tunables@tunables\n","text",[137,249,246],{"__ignoreMap":209},[199,251,253],{"id":252},"using-them","Using them",[133,255,256],{},"Ask in your own words; each skill's description tells the agent when it\napplies. For example:",[258,259,260,271,278,289],"ul",{},[261,262,263,267,268,270],"li",{},[264,265,266],"em",{},"\"Adopt tunables in this app.\""," runs ",[137,269,104],{},".",[261,272,273,267,276,270],{},[264,274,275],{},"\"Make the retry count tunable.\"",[137,277,108],{},[261,279,280,267,283,285,286,270],{},[264,281,282],{},"\"Let each workspace lower its AI suggestions a day, never above its\nplan.\"",[137,284,108],{},", which declares the field's ",[137,287,288],{},"override",[261,290,291,267,294,296],{},[264,292,293],{},"\"Check our settings, report only.\"",[137,295,112],{}," without\nchanging anything.",[133,298,299,300,270],{},"Or name the skill: ",[137,301,302],{},"\u002Ftunables-define add a setting for the export batch size",[199,304,306],{"id":305},"what-they-share","What they share",[258,308,309,316,352,365,390],{},[261,310,311,315],{},[312,313,314],"strong",{},"They propose before they write."," Adopt and define present what they would\nchange, including every choice you did not state, and wait for your approval.\nVerify reports every finding first, and fixes only the ones you choose.",[261,317,318,321,322,325,326,329,330,329,333,336,337,340,341,329,344,347,348,351],{},[312,319,320],{},"They use the CLI."," Each skill runs the ",[137,323,324],{},"tunables"," CLI through its own\nrunner, at the version it was installed with, so its checks are the\nlibrary's own. ",[137,327,328],{},"check",", ",[137,331,332],{},"env",[137,334,335],{},"explain"," and ",[137,338,339],{},"model draft"," need no database;\nthe skills run ",[137,342,343],{},"sync",[137,345,346],{},"set"," or ",[137,349,350],{},"restore"," only as part of a change you\napproved.",[261,353,354,357,358,361,362,270],{},[312,355,356],{},"They never write tunables' tables directly."," Values move through saves\nand ",[137,359,360],{},"tunables set",", with a reason, so the history records each move; a\nworkspace's or a person's own value moves at its scope, with ",[137,363,364],{},"--scope",[261,366,367,370,371,377,378,381,382,385,386,389],{},[312,368,369],{},"They never decide product meaning in code."," What a setting is, who tunes\nit and what it starts at are product decisions. In a repository with a\n",[166,372,376],{"href":373,"rel":374},"https:\u002F\u002Fpdd-kit.dev",[375],"nofollow","pdd-kit"," Product Model, they draft the facts with\n",[137,379,380],{},"tunables model draft"," and bring them to ",[137,383,384],{},"\u002Fpdd-ideate","; they never write\n",[137,387,388],{},"product-model\u002F"," themselves.",[261,391,392,395],{},[312,393,394],{},"They follow your repository."," Each reads your agent instructions first,\nwires into the database client, server, sign-in and UI you already have, and\nnever stages, commits or deploys unless your instructions or you say to.",[397,398,399],"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":209,"searchDepth":401,"depth":401,"links":402},2,[403,404,405],{"id":201,"depth":401,"text":202},{"id":252,"depth":401,"text":253},{"id":305,"depth":401,"text":306},"md",{},true,23,{"title":99,"description":100},"docs\u002Fskills","zimTD7wnkgi-11hCat1uzf8wrco0G3-8w3BInsCk3a0",1792845117972]