[{"data":1,"prerenderedAt":1187},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fcli":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":82,"body":125,"description":83,"extension":1182,"group":84,"meta":1183,"navigation":654,"order":804,"path":81,"seo":1184,"stem":1185,"__hash__":1186},"docs\u002Fdocs\u002Fcli.md",{"type":126,"value":127,"toc":1176},"minimark",[128,132,141,166,171,370,373,429,479,482,485,501,971,1100,1109,1113,1144,1158,1162,1172],[129,130,82],"h1",{"id":131},"the-cli",[133,134,135,136,140],"p",{},"The ",[137,138,139],"code",{},"tunables"," command checks your definitions, writes the files generated\nfrom them, reads and changes stored values through the same checks as the\nscreens, and installs the agent skills. It is installed with the package:",[142,143,148],"pre",{"className":144,"code":145,"language":146,"meta":147,"style":147},"language-bash shiki shiki-themes tunables-panel-light tunables-panel-light tunables-panel-dark","npx tunables --help\n","bash","",[137,149,150],{"__ignoreMap":147},[151,152,155,159,163],"span",{"class":153,"line":154},"line",1,[151,156,158],{"class":157},"sOThN","npx",[151,160,162],{"class":161},"sjCzm"," tunables",[151,164,165],{"class":161}," --help\n",[167,168,170],"h2",{"id":169},"commands","Commands",[172,173,174,190],"table",{},[175,176,177],"thead",{},[178,179,180,184,187],"tr",{},[181,182,183],"th",{},"Command",[181,185,186],{},"Does",[181,188,189],{},"Needs a database",[191,192,193,215,233,248,263,279,295,310,325,340,355],"tbody",{},[178,194,195,205,212],{},[196,197,198],"td",{},[199,200,202],"a",{"href":201},".\u002Fcli-check#check",[137,203,204],{},"check",[196,206,207,208,211],{},"Check definitions, ",[137,209,210],{},".env.example"," and the Product Model",[196,213,214],{},"No",[178,216,217,225,231],{},[196,218,219],{},[199,220,222],{"href":221},".\u002Fcli-check#env",[137,223,224],{},"env",[196,226,227,228,230],{},"Write ",[137,229,210],{}," from the deployment values",[196,232,214],{},[178,234,235,243,246],{},[196,236,237],{},[199,238,240],{"href":239},".\u002Fcli-check#explain",[137,241,242],{},"explain",[196,244,245],{},"Write field explanations from the Product Model",[196,247,214],{},[178,249,250,258,261],{},[196,251,252],{},[199,253,255],{"href":254},".\u002Fcli-check#model-draft",[137,256,257],{},"model draft",[196,259,260],{},"Draft the facts the Product Model lacks",[196,262,214],{},[178,264,265,273,276],{},[196,266,267],{},[199,268,270],{"href":269},".\u002Fcli-values#sync",[137,271,272],{},"sync",[196,274,275],{},"Seed new settings with their defaults",[196,277,278],{},"Yes",[178,280,281,289,292],{},[196,282,283],{},[199,284,286],{"href":285},".\u002Fcli-values#get",[137,287,288],{},"get",[196,290,291],{},"Print stored values, for the system or a scope",[196,293,294],{},"Yes, or the app's API",[178,296,297,305,308],{},[196,298,299],{},[199,300,302],{"href":301},".\u002Fcli-values#set",[137,303,304],{},"set",[196,306,307],{},"Change values, checked and recorded",[196,309,294],{},[178,311,312,320,323],{},[196,313,314],{},[199,315,317],{"href":316},".\u002Fcli-values#history",[137,318,319],{},"history",[196,321,322],{},"Show a group's revisions",[196,324,294],{},[178,326,327,335,338],{},[196,328,329],{},[199,330,332],{"href":331},".\u002Fcli-values#restore",[137,333,334],{},"restore",[196,336,337],{},"Restore a group to an earlier revision",[196,339,294],{},[178,341,342,350,353],{},[196,343,344],{},[199,345,347],{"href":346},".\u002Fcli-skills#install",[137,348,349],{},"install",[196,351,352],{},"Install the agent skills",[196,354,214],{},[178,356,357,365,368],{},[196,358,359],{},[199,360,362],{"href":361},".\u002Fcli-skills#update",[137,363,364],{},"update",[196,366,367],{},"Update installed skills",[196,369,214],{},[133,371,372],{},"Every command takes:",[172,374,375,384],{},[175,376,377],{},[178,378,379,382],{},[181,380,381],{},"Option",[181,383,186],{},[191,385,386,396,409,419],{},[178,387,388,393],{},[196,389,390],{},[137,391,392],{},"-c, --cwd \u003Cpath>",[196,394,395],{},"Run from another directory",[178,397,398,403],{},[196,399,400],{},[137,401,402],{},"--config \u003Cfile>",[196,404,405,406],{},"Use this config instead of ",[137,407,408],{},"tunables.config.ts",[178,410,411,416],{},[196,412,413],{},[137,414,415],{},"-h, --help",[196,417,418],{},"Show help for the command",[178,420,421,426],{},[196,422,423],{},[137,424,425],{},"-V, --version",[196,427,428],{},"Show the CLI version",[133,430,431,433,434,436,437,439,440,443,444,448,449,433,451,433,453,436,455,457,458,461,462,465,466,469,470,473,474,478],{},[137,432,288],{},", ",[137,435,304],{}," and ",[137,438,319],{}," take ",[137,441,442],{},"--scope workspace=acme,user=dana"," to work at\na ",[199,445,447],{"href":446},".\u002Fscopes","scope",". ",[137,450,288],{},[137,452,304],{},[137,454,319],{},[137,456,334],{}," take\n",[137,459,460],{},"--url \u003Curl>",", or read ",[137,463,464],{},"TUNABLES_URL",", to go through your app's tunables API\nwith ",[137,467,468],{},"TUNABLES_TOKEN"," as a bearer token instead of through ",[137,471,472],{},"connect","; see\n",[199,475,477],{"href":476},".\u002Fcli-values#through-your-apps-api","Through your app's API",".",[133,480,481],{},"A command exits 0 when it succeeds, 1 when what it checked does not hold or a\nchange was refused, and 2 for a usage mistake, such as a missing config or an\nunknown group.",[167,483,408],{"id":484},"tunablesconfigts",[133,486,487,488,490,491,433,494,433,497,500],{},"The commands read ",[137,489,408],{}," (or ",[137,492,493],{},".mts",[137,495,496],{},".js",[137,498,499],{},".mjs",") at the root\nof your app. It is TypeScript, loaded as it is; nothing needs building first.",[142,502,506],{"className":503,"code":504,"filename":408,"language":505,"meta":147,"style":147},"language-ts shiki shiki-themes tunables-panel-light tunables-panel-light tunables-panel-dark","import pg from 'pg'\nimport { defineConfig } from 'tunables\u002Fconfig'\nimport { fromPg, migrate } from 'tunables\u002Fpostgres'\nimport { catalogs, effects, environment, groups, presets, units } from '.\u002Fserver\u002Fsettings'\nimport { makeTunables } from '.\u002Fserver\u002Ftunables'\n\nlet pool: pg.Pool | undefined\n\nexport default defineConfig({\n  groups,\n  presets,\n  catalogs,\n  units,\n  effects,\n  environment,\n  envExample: '.env.example',\n  envHeader: 'Deployment values. Settings an administrator tunes live in the database.',\n  productModel: 'product-model',\n  explanations: 'server\u002Ftunables-explanations.ts',\n  async connect() {\n    pool = new pg.Pool({ connectionString: environment.get('DATABASE_URL') })\n    await migrate(fromPg(pool))\n    return makeTunables(fromPg(pool))\n  },\n  async disconnect() {\n    await pool?.end()\n  }\n})\n","ts",[137,507,508,531,555,582,628,649,656,682,687,702,711,719,727,735,743,751,768,785,802,819,834,884,906,925,931,943,959,965],{"__ignoreMap":147},[151,509,510,514,518,521,525,528],{"class":153,"line":154},[151,511,513],{"class":512},"sZ4mS","import",[151,515,517],{"class":516},"sVz71"," pg ",[151,519,520],{"class":512},"from",[151,522,524],{"class":523},"sp9ci"," '",[151,526,527],{"class":161},"pg",[151,529,530],{"class":523},"'\n",[151,532,534,536,539,542,545,548,550,553],{"class":153,"line":533},2,[151,535,513],{"class":512},[151,537,538],{"class":523}," {",[151,540,541],{"class":516}," defineConfig ",[151,543,544],{"class":523},"}",[151,546,547],{"class":512}," from",[151,549,524],{"class":523},[151,551,552],{"class":161},"tunables\u002Fconfig",[151,554,530],{"class":523},[151,556,558,560,562,565,568,571,573,575,577,580],{"class":153,"line":557},3,[151,559,513],{"class":512},[151,561,538],{"class":523},[151,563,564],{"class":516}," fromPg",[151,566,567],{"class":523},",",[151,569,570],{"class":516}," migrate ",[151,572,544],{"class":523},[151,574,547],{"class":512},[151,576,524],{"class":523},[151,578,579],{"class":161},"tunables\u002Fpostgres",[151,581,530],{"class":523},[151,583,585,587,589,592,594,597,599,602,604,607,609,612,614,617,619,621,623,626],{"class":153,"line":584},4,[151,586,513],{"class":512},[151,588,538],{"class":523},[151,590,591],{"class":516}," catalogs",[151,593,567],{"class":523},[151,595,596],{"class":516}," effects",[151,598,567],{"class":523},[151,600,601],{"class":516}," environment",[151,603,567],{"class":523},[151,605,606],{"class":516}," groups",[151,608,567],{"class":523},[151,610,611],{"class":516}," presets",[151,613,567],{"class":523},[151,615,616],{"class":516}," units ",[151,618,544],{"class":523},[151,620,547],{"class":512},[151,622,524],{"class":523},[151,624,625],{"class":161},".\u002Fserver\u002Fsettings",[151,627,530],{"class":523},[151,629,631,633,635,638,640,642,644,647],{"class":153,"line":630},5,[151,632,513],{"class":512},[151,634,538],{"class":523},[151,636,637],{"class":516}," makeTunables ",[151,639,544],{"class":523},[151,641,547],{"class":512},[151,643,524],{"class":523},[151,645,646],{"class":161},".\u002Fserver\u002Ftunables",[151,648,530],{"class":523},[151,650,652],{"class":153,"line":651},6,[151,653,655],{"emptyLinePlaceholder":654},true,"\n",[151,657,659,662,665,668,671,673,676,679],{"class":153,"line":658},7,[151,660,661],{"class":512},"let",[151,663,664],{"class":516}," pool",[151,666,667],{"class":523},":",[151,669,670],{"class":157}," pg",[151,672,478],{"class":523},[151,674,675],{"class":157},"Pool",[151,677,678],{"class":523}," |",[151,680,681],{"class":157}," undefined\n",[151,683,685],{"class":153,"line":684},8,[151,686,655],{"emptyLinePlaceholder":654},[151,688,690,693,696,699],{"class":153,"line":689},9,[151,691,692],{"class":512},"export",[151,694,695],{"class":512}," default",[151,697,698],{"class":157}," defineConfig",[151,700,701],{"class":523},"({\n",[151,703,705,708],{"class":153,"line":704},10,[151,706,707],{"class":516},"  groups",[151,709,710],{"class":523},",\n",[151,712,714,717],{"class":153,"line":713},11,[151,715,716],{"class":516},"  presets",[151,718,710],{"class":523},[151,720,722,725],{"class":153,"line":721},12,[151,723,724],{"class":516},"  catalogs",[151,726,710],{"class":523},[151,728,730,733],{"class":153,"line":729},13,[151,731,732],{"class":516},"  units",[151,734,710],{"class":523},[151,736,738,741],{"class":153,"line":737},14,[151,739,740],{"class":516},"  effects",[151,742,710],{"class":523},[151,744,746,749],{"class":153,"line":745},15,[151,747,748],{"class":516},"  environment",[151,750,710],{"class":523},[151,752,754,757,759,761,763,766],{"class":153,"line":753},16,[151,755,756],{"class":516},"  envExample",[151,758,667],{"class":523},[151,760,524],{"class":523},[151,762,210],{"class":161},[151,764,765],{"class":523},"'",[151,767,710],{"class":523},[151,769,771,774,776,778,781,783],{"class":153,"line":770},17,[151,772,773],{"class":516},"  envHeader",[151,775,667],{"class":523},[151,777,524],{"class":523},[151,779,780],{"class":161},"Deployment values. Settings an administrator tunes live in the database.",[151,782,765],{"class":523},[151,784,710],{"class":523},[151,786,788,791,793,795,798,800],{"class":153,"line":787},18,[151,789,790],{"class":516},"  productModel",[151,792,667],{"class":523},[151,794,524],{"class":523},[151,796,797],{"class":161},"product-model",[151,799,765],{"class":523},[151,801,710],{"class":523},[151,803,805,808,810,812,815,817],{"class":153,"line":804},19,[151,806,807],{"class":516},"  explanations",[151,809,667],{"class":523},[151,811,524],{"class":523},[151,813,814],{"class":161},"server\u002Ftunables-explanations.ts",[151,816,765],{"class":523},[151,818,710],{"class":523},[151,820,822,825,828,831],{"class":153,"line":821},20,[151,823,824],{"class":512},"  async",[151,826,827],{"class":157}," connect",[151,829,830],{"class":523},"()",[151,832,833],{"class":523}," {\n",[151,835,837,840,843,846,849,852,854,857,860,862,864,866,868,871,873,876,878,881],{"class":153,"line":836},21,[151,838,839],{"class":516},"    pool ",[151,841,842],{"class":523},"=",[151,844,845],{"class":512}," new",[151,847,670],{"class":848},"sq0K3",[151,850,478],{"class":851},"sBd0f",[151,853,675],{"class":157},[151,855,856],{"class":523},"({",[151,858,859],{"class":516}," connectionString",[151,861,667],{"class":523},[151,863,601],{"class":848},[151,865,478],{"class":851},[151,867,288],{"class":157},[151,869,870],{"class":523},"(",[151,872,765],{"class":523},[151,874,875],{"class":161},"DATABASE_URL",[151,877,765],{"class":523},[151,879,880],{"class":523},")",[151,882,883],{"class":523}," })\n",[151,885,887,890,893,895,898,900,903],{"class":153,"line":886},22,[151,888,889],{"class":512},"    await",[151,891,892],{"class":157}," migrate",[151,894,870],{"class":523},[151,896,897],{"class":157},"fromPg",[151,899,870],{"class":523},[151,901,902],{"class":516},"pool",[151,904,905],{"class":523},"))\n",[151,907,909,912,915,917,919,921,923],{"class":153,"line":908},23,[151,910,911],{"class":512},"    return",[151,913,914],{"class":157}," makeTunables",[151,916,870],{"class":523},[151,918,897],{"class":157},[151,920,870],{"class":523},[151,922,902],{"class":516},[151,924,905],{"class":523},[151,926,928],{"class":153,"line":927},24,[151,929,930],{"class":523},"  },\n",[151,932,934,936,939,941],{"class":153,"line":933},25,[151,935,824],{"class":512},[151,937,938],{"class":157}," disconnect",[151,940,830],{"class":523},[151,942,833],{"class":523},[151,944,946,948,950,953,956],{"class":153,"line":945},26,[151,947,889],{"class":512},[151,949,664],{"class":848},[151,951,952],{"class":851},"?.",[151,954,955],{"class":157},"end",[151,957,958],{"class":523},"()\n",[151,960,962],{"class":153,"line":961},27,[151,963,964],{"class":523},"  }\n",[151,966,968],{"class":153,"line":967},28,[151,969,970],{"class":523},"})\n",[172,972,973,982],{},[175,974,975],{},[178,976,977,979],{},[181,978,381],{},[181,980,981],{},"What it is",[191,983,984,1010,1024,1043,1056,1075,1087],{},[178,985,986,1003],{},[196,987,988,433,991,433,994,433,997,433,1000],{},[137,989,990],{},"groups",[137,992,993],{},"presets",[137,995,996],{},"catalogs",[137,998,999],{},"units",[137,1001,1002],{},"effects",[196,1004,1005,1006,1009],{},"Your definitions, as you pass them to ",[137,1007,1008],{},"createTunables",". Enough for every command that needs no database.",[178,1011,1012,1017],{},[196,1013,1014],{},[137,1015,1016],{},"environment",[196,1018,1019,1020,478],{},"Your ",[199,1021,1023],{"href":1022},".\u002Fdeployment-values","deployment values",[178,1025,1026,1034],{},[196,1027,1028,433,1031],{},[137,1029,1030],{},"envExample",[137,1032,1033],{},"envHeader",[196,1035,1036,1037,1039,1040,1042],{},"Where ",[137,1038,210],{}," is (",[137,1041,210],{}," by default) and the lines it starts with.",[178,1044,1045,1050],{},[196,1046,1047],{},[137,1048,1049],{},"productModel",[196,1051,1052,1053,1055],{},"Your pdd-kit Product Model. Defaults to ",[137,1054,797],{}," when that directory exists.",[178,1057,1058,1066],{},[196,1059,1060,433,1063],{},[137,1061,1062],{},"explanations",[137,1064,1065],{},"explanationsImport",[196,1067,1036,1068,1071,1072,1074],{},[137,1069,1070],{},"tunables explain"," writes the explanations module, and what it imports its type from (",[137,1073,139],{}," by default).",[178,1076,1077,1081],{},[196,1078,1079],{},[137,1080,472],{},[196,1082,1083,1084,478],{},"Your app's tunables over its own store. Called only by the commands that read or change stored values, unless they are given ",[137,1085,1086],{},"--url",[178,1088,1089,1094],{},[196,1090,1091],{},[137,1092,1093],{},"disconnect",[196,1095,1096,1097,1099],{},"Close what ",[137,1098,472],{}," opened, so the command can exit.",[133,1101,1102,1103,1105,1106,1108],{},"Importing the config must not connect to anything: open the connection inside\n",[137,1104,472],{},", so ",[137,1107,204],{}," and the other offline commands, and the agent skills that\nrun them, work without a database.",[167,1110,1112],{"id":1111},"who-a-change-is-recorded-as","Who a change is recorded as",[133,1114,1115,1116,1119,1120,1123,1124,1127,1128,1130,1131,1134,1135,1137,1138,1140,1141,1143],{},"A change from the terminal is recorded with your username and\n",[137,1117,1118],{},"(terminal)",", such as ",[137,1121,1122],{},"ada (terminal)",", and needs a ",[137,1125,1126],{},"--reason",", which is kept\nin the history. Through ",[137,1129,472],{},", the commands reach everything the database\ndoes, and your ",[137,1132,1133],{},"authorize"," is not asked. With ",[137,1136,1086],{},", the change is recorded\nas the actor your app names for ",[137,1139,468],{},", and your ",[137,1142,1133],{}," decides\nwhat it may do.",[133,1145,1146,1154,1155,1157],{},[199,1147,1151],{"href":1148,"rel":1149},"https:\u002F\u002Fgithub.com\u002Fitai-gendler\u002Ftunables\u002Fblob\u002Fmain\u002Fexamples\u002Ftasklane\u002Ftunables.config.ts",[1150],"nofollow",[137,1152,1153],{},"examples\u002Ftasklane\u002Ftunables.config.ts","\nis a complete config: in memory, or on Postgres when ",[137,1156,875],{}," is set.",[167,1159,1161],{"id":1160},"update-checks","Update checks",[133,1163,1164,1165,1167,1168,1171],{},"A globally installed CLI checks npm for a newer version at most once a day, in\nthe background, and asks once per new version whether to update. It never\nchecks in CI, without a terminal, when run through ",[137,1166,158],{},", or as a project\ndependency, whose version your lockfile decides. Set\n",[137,1169,1170],{},"TUNABLES_NO_UPDATE_CHECK=1"," to turn it off.",[1173,1174,1175],"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);}html pre.shiki code .sZ4mS, html code.shiki .sZ4mS{--shiki-light:#115E59;--shiki-default:#115E59;--shiki-dark:#5EEAD4}html pre.shiki code .sVz71, html code.shiki .sVz71{--shiki-light:#182025;--shiki-default:#182025;--shiki-dark:#E6EBEC}html pre.shiki code .sp9ci, html code.shiki .sp9ci{--shiki-light:#4F5D63;--shiki-default:#4F5D63;--shiki-dark:#A3AFB4}html pre.shiki code .sq0K3, html code.shiki .sq0K3{--shiki-light:#182025;--shiki-light-font-weight:bold;--shiki-default:#182025;--shiki-default-font-weight:bold;--shiki-dark:#E6EBEC;--shiki-dark-font-weight:bold}html pre.shiki code .sBd0f, html code.shiki .sBd0f{--shiki-light:#4F5D63;--shiki-light-font-weight:bold;--shiki-default:#4F5D63;--shiki-default-font-weight:bold;--shiki-dark:#A3AFB4;--shiki-dark-font-weight:bold}",{"title":147,"searchDepth":533,"depth":533,"links":1177},[1178,1179,1180,1181],{"id":169,"depth":533,"text":170},{"id":484,"depth":533,"text":408},{"id":1111,"depth":533,"text":1112},{"id":1160,"depth":533,"text":1161},"md",{},{"title":82,"description":83},"docs\u002Fcli","HlzrxUbluiwGraVfI46lSwOvKFqsQXxkWhF2tX04rMc",1792845117978]