[{"data":1,"prerenderedAt":1772},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-repos-detectors":520,"-reference-configuration-repos-detectors-surround":1767},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,117,138,187],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109,113],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":118,"path":119,"stem":120,"children":121,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[122,126,130,134],{"title":123,"path":124,"stem":125},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":127,"path":128,"stem":129},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":131,"path":132,"stem":133},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":135,"path":136,"stem":137},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":139,"path":140,"stem":141,"children":142,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[143,147,151,155,159,163,167,171,175,179,183],{"title":144,"path":145,"stem":146},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":148,"path":149,"stem":150},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":152,"path":153,"stem":154},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":156,"path":157,"stem":158},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":160,"path":161,"stem":162},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":164,"path":165,"stem":166},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":168,"path":169,"stem":170},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":172,"path":173,"stem":174},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":176,"path":177,"stem":178},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":180,"path":181,"stem":182},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":184,"path":185,"stem":186},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":188,"path":189,"stem":190},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":192,"path":193,"stem":194,"children":195},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[196,198,202,206,210,214,218],{"title":10,"path":193,"stem":197},"4.troubleshooting\u002Findex",{"title":199,"path":200,"stem":201},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":203,"path":204,"stem":205},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":207,"path":208,"stem":209},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":211,"path":212,"stem":213},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":215,"path":216,"stem":217},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":219,"path":220,"stem":221},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":223,"path":224,"stem":225,"children":226},"Reference","\u002Freference","5.reference",[227,229,267,289,293,391,409,435,439,443,477,481],{"title":10,"path":224,"stem":228},"5.reference\u002Findex",{"title":230,"path":231,"stem":232,"children":233},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[234,235,239,243,247,251,255,259,263],{"title":10,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":240,"path":241,"stem":242},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":244,"path":245,"stem":246},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":248,"path":249,"stem":250},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":252,"path":253,"stem":254},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":256,"path":257,"stem":258},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":260,"path":261,"stem":262},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":264,"path":265,"stem":266},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":268,"path":269,"stem":270,"children":271},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[272,273,277,281,285],{"title":10,"path":269,"stem":270},{"title":274,"path":275,"stem":276},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":278,"path":279,"stem":280},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":282,"path":283,"stem":284},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":286,"path":287,"stem":288},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":290,"path":291,"stem":292},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":294,"path":295,"stem":296,"children":297},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[298,299,317,321,325,329,333,337,341,345,379,383,387],{"title":10,"path":295,"stem":296},{"title":300,"path":301,"stem":302,"children":303},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[304,305,309,313],{"title":10,"path":301,"stem":302},{"title":306,"path":307,"stem":308},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":310,"path":311,"stem":312},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":314,"path":315,"stem":316},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":318,"path":319,"stem":320},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":322,"path":323,"stem":324},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":326,"path":327,"stem":328},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":330,"path":331,"stem":332},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":334,"path":335,"stem":336},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":338,"path":339,"stem":340},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":342,"path":343,"stem":344},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":346,"path":347,"stem":348,"children":349},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[350,351,355,359,363,367,371,375],{"title":10,"path":347,"stem":348},{"title":352,"path":353,"stem":354},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":356,"path":357,"stem":358},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":360,"path":361,"stem":362},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":364,"path":365,"stem":366},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":368,"path":369,"stem":370},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":372,"path":373,"stem":374},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":376,"path":377,"stem":378},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":380,"path":381,"stem":382},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":384,"path":385,"stem":386},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":388,"path":389,"stem":390},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":392,"path":393,"stem":394,"children":395},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[396,397,401,405],{"title":10,"path":393,"stem":394},{"title":398,"path":399,"stem":400},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":402,"path":403,"stem":404},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":406,"path":407,"stem":408},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":410,"path":411,"stem":412,"children":413},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[414,415,419,423,427,431],{"title":10,"path":411,"stem":412},{"title":416,"path":417,"stem":418},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":420,"path":421,"stem":422},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":424,"path":425,"stem":426},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":428,"path":429,"stem":430},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":432,"path":433,"stem":434},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":436,"path":437,"stem":438},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":440,"path":441,"stem":442},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":444,"path":445,"stem":446,"children":447},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[448,449,453,457,461,465,469,473],{"title":10,"path":445,"stem":446},{"title":450,"path":451,"stem":452},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":454,"path":455,"stem":456},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":458,"path":459,"stem":460},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":462,"path":463,"stem":464},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":466,"path":467,"stem":468},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":470,"path":471,"stem":472},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":474,"path":475,"stem":476},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":478,"path":479,"stem":480},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":482,"path":483,"stem":484},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":486,"path":487,"stem":488,"children":489},"Security and project","\u002Fproject","6.project",[490,492,496,500,504,508,512,516],{"title":10,"path":487,"stem":491},"6.project\u002Findex",{"title":493,"path":494,"stem":495},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":497,"path":498,"stem":499},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":501,"path":502,"stem":503},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":505,"path":506,"stem":507},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":509,"path":510,"stem":511},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":513,"path":514,"stem":515},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":517,"path":518,"stem":519},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":521,"title":310,"body":522,"description":1760,"extension":1761,"links":1762,"meta":1763,"navigation":1764,"path":311,"seo":1765,"stem":312,"__hash__":1766},"docs\u002F5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors.md",{"type":523,"value":524,"toc":1750},"minimark",[525,541,552,784,791,794,924,940,945,1039,1043,1438,1450,1457,1460,1526,1529,1537,1560,1580,1584,1587,1705,1709,1746],[526,527,528,529,532,533,536,537,540],"p",{},"This page lists the keys of ",[530,531,310],"code",{},", where you teach ",[530,534,535],{},"kraft repo connect"," your own conventions, and the toolchains Kraft ships. ",[538,539,306],"a",{"href":307}," says how a proposal is made from them.",[526,542,543,544,547,548,551],{},"The shipped table is data. Kraft ships it with each release, and you can layer your own on top of it in ",[530,545,546],{},"$KRAFT_HOME\u002Fconfig\u002Fdetectors.yaml"," (default ",[530,549,550],{},"~\u002F.kraft\u002Fconfig\u002F","). This file is optional and is not seeded, so a newer Kraft's detectors still reach you after you write one.",[553,554,560],"pre",{"className":555,"code":556,"filename":557,"language":558,"meta":559,"style":559},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","max_depth: 3                 # how far below the root a scope can be (default 2, at most 4)\nignore_dirs: [playground]    # added to the shipped list\ndisable: [tox]               # shipped detectors to switch off, by id\ndetectors:\n  # A detector of your own: tried before the shipped ones.\n  - id: earthly\n    tier: runner\n    files: [Earthfile]\n    test:\n      - run: \"earthly +test\"\n  # The same id as a shipped detector replaces it, in its place.\n  - id: go\n    tier: toolchain\n    family: go\n    files: [go.mod]\n    test:\n      - run: \"gotestsum .\u002F...\"\n    setup:\n      - run: \"go mod download\"\n","~\u002F.kraft\u002Fconfig\u002Fdetectors.yaml","yaml","",[530,561,562,583,602,619,628,634,648,659,673,681,695,701,713,723,733,745,752,764,772],{"__ignoreMap":559},[563,564,567,571,575,579],"span",{"class":565,"line":566},"line",1,[563,568,570],{"class":569},"sb7M8","max_depth",[563,572,574],{"class":573},"s7iLA",": ",[563,576,578],{"class":577},"ssYy9","3",[563,580,582],{"class":581},"sq92B","                 # how far below the root a scope can be (default 2, at most 4)\n",[563,584,586,589,592,596,599],{"class":565,"line":585},2,[563,587,588],{"class":569},"ignore_dirs",[563,590,591],{"class":573},": [",[563,593,595],{"class":594},"semJd","playground",[563,597,598],{"class":573},"]    ",[563,600,601],{"class":581},"# added to the shipped list\n",[563,603,605,608,610,613,616],{"class":565,"line":604},3,[563,606,607],{"class":569},"disable",[563,609,591],{"class":573},[563,611,612],{"class":594},"tox",[563,614,615],{"class":573},"]               ",[563,617,618],{"class":581},"# shipped detectors to switch off, by id\n",[563,620,622,625],{"class":565,"line":621},4,[563,623,624],{"class":569},"detectors",[563,626,627],{"class":573},":\n",[563,629,631],{"class":565,"line":630},5,[563,632,633],{"class":581},"  # A detector of your own: tried before the shipped ones.\n",[563,635,637,640,643,645],{"class":565,"line":636},6,[563,638,639],{"class":573},"  - ",[563,641,642],{"class":569},"id",[563,644,574],{"class":573},[563,646,647],{"class":594},"earthly\n",[563,649,651,654,656],{"class":565,"line":650},7,[563,652,653],{"class":569},"    tier",[563,655,574],{"class":573},[563,657,658],{"class":594},"runner\n",[563,660,662,665,667,670],{"class":565,"line":661},8,[563,663,664],{"class":569},"    files",[563,666,591],{"class":573},[563,668,669],{"class":594},"Earthfile",[563,671,672],{"class":573},"]\n",[563,674,676,679],{"class":565,"line":675},9,[563,677,678],{"class":569},"    test",[563,680,627],{"class":573},[563,682,684,687,690,692],{"class":565,"line":683},10,[563,685,686],{"class":573},"      - ",[563,688,689],{"class":569},"run",[563,691,574],{"class":573},[563,693,694],{"class":594},"\"earthly +test\"\n",[563,696,698],{"class":565,"line":697},11,[563,699,700],{"class":581},"  # The same id as a shipped detector replaces it, in its place.\n",[563,702,704,706,708,710],{"class":565,"line":703},12,[563,705,639],{"class":573},[563,707,642],{"class":569},[563,709,574],{"class":573},[563,711,712],{"class":594},"go\n",[563,714,716,718,720],{"class":565,"line":715},13,[563,717,653],{"class":569},[563,719,574],{"class":573},[563,721,722],{"class":594},"toolchain\n",[563,724,726,729,731],{"class":565,"line":725},14,[563,727,728],{"class":569},"    family",[563,730,574],{"class":573},[563,732,712],{"class":594},[563,734,736,738,740,743],{"class":565,"line":735},15,[563,737,664],{"class":569},[563,739,591],{"class":573},[563,741,742],{"class":594},"go.mod",[563,744,672],{"class":573},[563,746,748,750],{"class":565,"line":747},16,[563,749,678],{"class":569},[563,751,627],{"class":573},[563,753,755,757,759,761],{"class":565,"line":754},17,[563,756,686],{"class":573},[563,758,689],{"class":569},[563,760,574],{"class":573},[563,762,763],{"class":594},"\"gotestsum .\u002F...\"\n",[563,765,767,770],{"class":565,"line":766},18,[563,768,769],{"class":569},"    setup",[563,771,627],{"class":573},[563,773,775,777,779,781],{"class":565,"line":774},19,[563,776,686],{"class":573},[563,778,689],{"class":569},[563,780,574],{"class":573},[563,782,783],{"class":594},"\"go mod download\"\n",[526,785,786,787,790],{},"The file is read on every probe, with no restart. A file that does not parse fails the probe, naming the file, and ",[530,788,789],{},"kraft admin doctor"," reports it. Connecting a repo that is already connected reads it only for what the entry left undecided.",[526,792,793],{},"A detector for a task runner names the tasks to look for, and a condition for a command that depends on what else is in the directory:",[553,795,797],{"className":555,"code":796,"filename":557,"language":558,"meta":559,"style":559},"detectors:\n  - id: bin-tools\n    tier: runner\n    files: [bin\u002Fcheck]\n    unless: [bin\u002Frails]\n    tasks: script\n    test:\n      - {tasks: [bin\u002Fcheck], run: \".\u002F{task}\"}\n    setup:\n      - {when: [{files: [package.json]}], run: \"npm ci\"}\n",[530,798,799,805,816,824,835,847,857,863,888,894],{"__ignoreMap":559},[563,800,801,803],{"class":565,"line":566},[563,802,624],{"class":569},[563,804,627],{"class":573},[563,806,807,809,811,813],{"class":565,"line":585},[563,808,639],{"class":573},[563,810,642],{"class":569},[563,812,574],{"class":573},[563,814,815],{"class":594},"bin-tools\n",[563,817,818,820,822],{"class":565,"line":604},[563,819,653],{"class":569},[563,821,574],{"class":573},[563,823,658],{"class":594},[563,825,826,828,830,833],{"class":565,"line":621},[563,827,664],{"class":569},[563,829,591],{"class":573},[563,831,832],{"class":594},"bin\u002Fcheck",[563,834,672],{"class":573},[563,836,837,840,842,845],{"class":565,"line":630},[563,838,839],{"class":569},"    unless",[563,841,591],{"class":573},[563,843,844],{"class":594},"bin\u002Frails",[563,846,672],{"class":573},[563,848,849,852,854],{"class":565,"line":636},[563,850,851],{"class":569},"    tasks",[563,853,574],{"class":573},[563,855,856],{"class":594},"script\n",[563,858,859,861],{"class":565,"line":650},[563,860,678],{"class":569},[563,862,627],{"class":573},[563,864,865,868,871,873,875,878,880,882,885],{"class":565,"line":661},[563,866,867],{"class":573},"      - {",[563,869,870],{"class":569},"tasks",[563,872,591],{"class":573},[563,874,832],{"class":594},[563,876,877],{"class":573},"], ",[563,879,689],{"class":569},[563,881,574],{"class":573},[563,883,884],{"class":594},"\".\u002F{task}\"",[563,886,887],{"class":573},"}\n",[563,889,890,892],{"class":565,"line":675},[563,891,769],{"class":569},[563,893,627],{"class":573},[563,895,896,898,901,904,907,909,912,915,917,919,922],{"class":565,"line":683},[563,897,867],{"class":573},[563,899,900],{"class":569},"when",[563,902,903],{"class":573},": [{",[563,905,906],{"class":569},"files",[563,908,591],{"class":573},[563,910,911],{"class":594},"package.json",[563,913,914],{"class":573},"]}], ",[563,916,689],{"class":569},[563,918,574],{"class":573},[563,920,921],{"class":594},"\"npm ci\"",[563,923,887],{"class":573},[526,925,926,927,930,931,939],{},"The VS Code extension validates your file against ",[530,928,929],{},"detectors.schema.json",". The shipped table, with a comment on each choice, is ",[538,932,936],{"href":933,"rel":934},"https:\u002F\u002Fgithub.com\u002FitsOmidKarami\u002Fkraft\u002Fblob\u002Fmain\u002Fsrc\u002Fkraft\u002Fdetectors.yaml",[935],"nofollow",[530,937,938],{},"src\u002Fkraft\u002Fdetectors.yaml",".",[941,942,944],"h2",{"id":943},"top-level-keys","Top-level keys",[946,947,948,967],"table",{},[949,950,951],"thead",{},[952,953,954,958,961,964],"tr",{},[955,956,957],"th",{},"Key",[955,959,960],{},"Type",[955,962,963],{},"Default",[955,965,966],{},"Meaning",[968,969,970,988,1005,1023],"tbody",{},[952,971,972,977,980,985],{},[973,974,975],"td",{},[530,976,570],{},[973,978,979],{},"integer, 0 to 4",[973,981,982],{},[530,983,984],{},"2",[973,986,987],{},"How far below the root a scope can be.",[952,989,990,994,997,1002],{},[973,991,992],{},[530,993,588],{},[973,995,996],{},"list of strings",[973,998,999],{},[530,1000,1001],{},"[]",[973,1003,1004],{},"Directory names added to the shipped list of non-project names.",[952,1006,1007,1011,1013,1017],{},[973,1008,1009],{},[530,1010,607],{},[973,1012,996],{},[973,1014,1015],{},[530,1016,1001],{},[973,1018,1019,1020,1022],{},"Shipped detectors to switch off, by ",[530,1021,642],{},". An id the shipped table does not have is refused.",[952,1024,1025,1029,1032,1036],{},[973,1026,1027],{},[530,1028,624],{},[973,1030,1031],{},"list of detectors",[973,1033,1034],{},[530,1035,1001],{},[973,1037,1038],{},"Your own detectors, tried before the shipped ones.",[941,1040,1042],{"id":1041},"detector-fields","Detector fields",[946,1044,1045,1058],{},[949,1046,1047],{},[952,1048,1049,1052,1054,1056],{},[955,1050,1051],{},"Field",[955,1053,960],{},[955,1055,963],{},[955,1057,966],{},[968,1059,1060,1084,1109,1129,1145,1163,1226,1254,1280,1304,1325,1351,1369,1405],{},[952,1061,1062,1066,1072,1078],{},[973,1063,1064],{},[530,1065,642],{},[973,1067,1068,1069],{},"string, ",[530,1070,1071],{},"[a-z][a-z0-9_-]*",[973,1073,1074],{},[1075,1076,1077],"em",{},"(required)",[973,1079,1080,1081,1083],{},"Once per file. Shown as where a proposal came from, and what ",[530,1082,607],{}," names.",[952,1085,1086,1091,1100,1104],{},[973,1087,1088],{},[530,1089,1090],{},"tier",[973,1092,1093,1096,1097],{},[530,1094,1095],{},"runner"," or ",[530,1098,1099],{},"toolchain",[973,1101,1102],{},[1075,1103,1077],{},[973,1105,1106,1108],{},[530,1107,1095],{}," outranks a toolchain. Both outrank CI.",[952,1110,1111,1115,1118,1122],{},[973,1112,1113],{},[530,1114,906],{},[973,1116,1117],{},"list of globs",[973,1119,1120],{},[1075,1121,1077],{},[973,1123,1124,1125,1128],{},"At least one, relative to the directory. The detector applies when any matches. A glob without ",[530,1126,1127],{},"\u002F"," matches only the directory's own files.",[952,1130,1131,1136,1138,1142],{},[973,1132,1133],{},[530,1134,1135],{},"unless",[973,1137,1117],{},[973,1139,1140],{},[530,1141,1001],{},[973,1143,1144],{},"The detector does not apply when any of them matches.",[952,1146,1147,1152,1155,1160],{},[973,1148,1149],{},[530,1150,1151],{},"contains",[973,1153,1154],{},"mapping of glob to regex",[973,1156,1157],{},[530,1158,1159],{},"{}",[973,1161,1162],{},"Each regex must match some file its glob names.",[952,1164,1165,1169,1172,1177],{},[973,1166,1167],{},[530,1168,870],{},[973,1170,1171],{},"string",[973,1173,1174],{},[530,1175,1176],{},"null",[973,1178,1179,1180,1183,1184,1183,1187,1183,1190,1183,1193,1196,1197,1183,1200,1183,1203,1183,1206,1183,1209,1096,1212,1215,1216,1183,1219,1183,1222,1225],{},"Which reader lists the runner's tasks: ",[530,1181,1182],{},"just",", ",[530,1185,1186],{},"make",[530,1188,1189],{},"taskfile",[530,1191,1192],{},"mise",[530,1194,1195],{},"npm"," (package.json scripts), ",[530,1198,1199],{},"composer",[530,1201,1202],{},"deno",[530,1204,1205],{},"rake",[530,1207,1208],{},"pdm",[530,1210,1211],{},"poe",[530,1213,1214],{},"script"," (executables under ",[530,1217,1218],{},"script\u002F",[530,1220,1221],{},"scripts\u002F",[530,1223,1224],{},"bin\u002F",").",[952,1227,1228,1236,1239,1243],{},[973,1229,1230,1183,1233],{},[530,1231,1232],{},"test",[530,1234,1235],{},"setup",[973,1237,1238],{},"list of commands",[973,1240,1241],{},[530,1242,1001],{},[973,1244,1245,1246,939],{},"Tried in order. The first one that holds is the proposal. See ",[538,1247,1249,1251,1252],{"href":1248},"#test-and-setup",[530,1250,1232],{}," and ",[530,1253,1235],{},[952,1255,1256,1261,1263,1267],{},[973,1257,1258],{},[530,1259,1260],{},"family",[973,1262,1171],{},[973,1264,1265],{},[530,1266,1176],{},[973,1268,1269,1270,1183,1273,1096,1276,1279],{},"The ecosystem, such as ",[530,1271,1272],{},"js",[530,1274,1275],{},"python",[530,1277,1278],{},"jvm",". A workspace root covers members of its own family.",[952,1281,1282,1287,1290,1295],{},[973,1283,1284],{},[530,1285,1286],{},"lockfile",[973,1288,1289],{},"boolean",[973,1291,1292],{},[530,1293,1294],{},"false",[973,1296,1297,1300,1301,1303],{},[530,1298,1299],{},"true"," when ",[530,1302,906],{}," are lockfiles: a workspace member this detector matches installs on its own, and its install still stands in a stopped directory.",[952,1305,1306,1311,1314,1318],{},[973,1307,1308],{},[530,1309,1310],{},"workspace",[973,1312,1313],{},"list of conditions",[973,1315,1316],{},[530,1317,1001],{},[973,1319,1320,1321,939],{},"When any one holds, the directory is a workspace root. See ",[538,1322,1324],{"href":1323},"#conditions","Conditions",[952,1326,1327,1332,1334,1338],{},[973,1328,1329],{},[530,1330,1331],{},"stop",[973,1333,1289],{},[973,1335,1336],{},[530,1337,1294],{},[973,1339,1340,1342,1343,1346,1347,939],{},[530,1341,1299],{}," marks a project Kraft has no safe command for, as the shipped ",[530,1344,1345],{},"pyproject"," detector does. Where it matches and no other detector of its family does, the directory is stopped as in ",[538,1348,1350],{"href":1349},"\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals#a-python-project-with-no-lockfile","A Python project with no lockfile",[952,1352,1353,1358,1360,1364],{},[973,1354,1355],{},[530,1356,1357],{},"reason",[973,1359,1171],{},[973,1361,1362],{},[530,1363,1176],{},[973,1365,1366,1367,939],{},"What connect says about a stopped directory. Required with ",[530,1368,1331],{},[952,1370,1371,1376,1382,1386],{},[973,1372,1373],{},[530,1374,1375],{},"wrap",[973,1377,1378,1379],{},"string with ",[530,1380,1381],{},"{command}",[973,1383,1384],{},[530,1385,1176],{},[973,1387,1388,1389,1392,1393,1395,1396,1183,1399,1096,1401,1404],{},"How a command runs in this toolchain's environment: ",[530,1390,1391],{},"uv run {command}",". A runner's ",[530,1394,1232],{}," task in the same directory that runs ",[530,1397,1398],{},"pytest",[530,1400,1275],{},[530,1402,1403],{},"coverage"," bare is proposed through it.",[952,1406,1407,1412,1415,1419],{},[973,1408,1409],{},[530,1410,1411],{},"venv",[973,1413,1414],{},"string, a relative path",[973,1416,1417],{},[530,1418,1176],{},[973,1420,1421,1422,1425,1426,1429,1430,1433,1434,1437],{},"The virtualenv this detector's setup makes, relative to the directory: ",[530,1423,1424],{},".venv",". A test command another detector proposes beside it (",[530,1427,1428],{},"make test",", CI's ",[530,1431,1432],{},"python -m unittest",") runs with it active, so it imports the project's dependencies, not a worker's ",[530,1435,1436],{},"PATH"," Python.",[526,1439,1440,1441,1443,1444,1446,1447,1449],{},"A detector applies to a directory when any ",[530,1442,906],{}," glob matches, no ",[530,1445,1135],{}," glob does, and every ",[530,1448,1151],{}," regex matches a file its glob names.",[941,1451,1453,1251,1455],{"id":1452},"test-and-setup",[530,1454,1232],{},[530,1456,1235],{},[526,1458,1459],{},"Each command in the list has these keys:",[946,1461,1462,1472],{},[949,1463,1464],{},[952,1465,1466,1468,1470],{},[955,1467,957],{},[955,1469,960],{},[955,1471,966],{},[968,1473,1474,1489,1500,1511],{},[952,1475,1476,1480,1482],{},[973,1477,1478],{},[530,1479,689],{},[973,1481,1171],{},[973,1483,1484,1485,1488],{},"Required. The command, with ",[530,1486,1487],{},"{task}"," replaced by the task found.",[952,1490,1491,1495,1497],{},[973,1492,1493],{},[530,1494,870],{},[973,1496,996],{},[973,1498,1499],{},"Names to look for, first present wins.",[952,1501,1502,1506,1508],{},[973,1503,1504],{},[530,1505,900],{},[973,1507,1313],{},[973,1509,1510],{},"Any one of them must hold.",[952,1512,1513,1518,1520],{},[973,1514,1515],{},[530,1516,1517],{},"reads",[973,1519,996],{},[973,1521,1522,1523,1525],{},"The files the command reads, shown as where the proposal came from. Left out, it is the first of the detector's ",[530,1524,906],{}," that is there.",[941,1527,1324],{"id":1528},"conditions",[526,1530,1531,1532,1096,1534,1536],{},"A condition, in ",[530,1533,900],{},[530,1535,1310],{},", holds when all of what it gives holds:",[1538,1539,1540,1546,1551],"ul",{},[1541,1542,1543,1545],"li",{},[530,1544,906],{},": any glob matches.",[1541,1547,1548,1550],{},[530,1549,1151],{},": each glob names a file its regex matches.",[1541,1552,1553,574,1556,1559],{},[530,1554,1555],{},"toml",[530,1557,1558],{},"{glob: {dotted.key: regex}}","; the value at that key of a TOML file, as JSON, matches.",[526,1561,1562,1564,1565,1568,1569,1571,1572,1575,1576,1579],{},[530,1563,1555],{}," reads one table, such as ",[530,1566,1567],{},"project.optional-dependencies",", where a regex over the whole file would run on into the tables after it. Keep a ",[530,1570,1151],{}," regex to one line (",[530,1573,1574],{},"[ \\t]"," rather than ",[530,1577,1578],{},"\\s","): one that backtracks across a large file runs the probe into its time limit.",[941,1581,1583],{"id":1582},"toolchains-in-the-shipped-table","Toolchains in the shipped table",[526,1585,1586],{},"The shipped table covers:",[1538,1588,1589,1665,1671,1681,1687],{},[1541,1590,1591,1595,1596,1599,1600,1603,1604,1607,1608,1611,1612,1096,1615,1618,1619,1622],{},[1592,1593,1594],"strong",{},"Python:"," uv, Poetry, PDM, Pipenv, Hatch (a ",[530,1597,1598],{},"[tool.hatch.envs]"," table or a ",[530,1601,1602],{},"hatch.toml","), ",[530,1605,1606],{},"requirements.txt",", tox (its ",[530,1609,1610],{},"py"," environment, also beside a ",[530,1613,1614],{},"pyproject.toml",[530,1616,1617],{},"setup.py"," with no lockfile); Django's ",[530,1620,1621],{},"manage.py test",[1538,1623,1624],{},[1541,1625,1626,1627,1629,1630,1632,1633,1636,1637,1640,1641,1644,1645,1183,1648,1651,1652,1655,1656,1658,1659,1662,1663,939],{},"A ",[530,1628,1606],{}," is set up in a ",[530,1631,1424],{},", which ignores itself (a ",[530,1634,1635],{},".gitignore"," of ",[530,1638,1639],{},"*"," inside it), so no work item commits it. A ",[530,1642,1643],{},"requirements-dev.txt"," (or ",[530,1646,1647],{},"requirements_dev.txt",[530,1649,1650],{},"dev-requirements.txt",") beside it is installed too, after the base file unless it includes it with ",[530,1653,1654],{},"-r",". A task runner's or CI's test command there runs inside that venv: a ",[530,1657,1275],{}," line as ",[530,1660,1661],{},".venv\u002Fbin\u002Fpython",", anything else with the venv first on ",[530,1664,1436],{},[1541,1666,1667,1670],{},[1592,1668,1669],{},"JavaScript and TypeScript:"," npm, pnpm, Yarn classic and Berry, Bun, Deno; Nx and Turborepo; npm, pnpm, Yarn and Deno workspaces",[1541,1672,1673,1676,1677,1680],{},[1592,1674,1675],{},"JVM:"," Gradle (Android included), Maven (a multi-module build's setup installs its modules, ",[530,1678,1679],{},"-DskipTests install","), sbt",[1541,1682,1683,1686],{},[1592,1684,1685],{},"Ruby:"," Rails, RSpec, Rake",[1541,1688,1689,1692,1693,1696,1697,1700,1701,1704],{},[1592,1690,1691],{},"Others:"," Cargo (workspaces included), Go, .NET, Composer (its install only beside a ",[530,1694,1695],{},"composer.lock",", which it would otherwise write), Mix (umbrellas included), Swift, Flutter and Dart, Zig, Stack and Cabal, Julia, Bazel, CMake (a ",[530,1698,1699],{},"CMakeLists.txt"," with a ",[530,1702,1703],{},"project("," of its own), Meson",[941,1706,1708],{"id":1707},"related","Related",[1538,1710,1711,1716,1731,1738],{},[1541,1712,1713,1715],{},[538,1714,306],{"href":307},": what connect reads, and how it ranks what it finds.",[1541,1717,1718,1720,1721,1183,1724,1251,1727,1730],{},[538,1719,300],{"href":301},": the ",[530,1722,1723],{},"setup_command",[530,1725,1726],{},"test_command",[530,1728,1729],{},"test_scopes"," fields a proposal fills in.",[1541,1732,1733,1720,1735,1737],{},[538,1734,282],{"href":283},[530,1736,535],{}," flags.",[1541,1739,1740,1742,1743,1745],{},[538,1741,211],{"href":212},": the fix when your ",[530,1744,310],{}," does not load.",[1747,1748,1749],"style",{},"html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}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":559,"searchDepth":585,"depth":585,"links":1751},[1752,1754,1755,1757,1758,1759],{"id":943,"depth":585,"text":1753},"Top-​level keys",{"id":1041,"depth":585,"text":1042},{"id":1452,"depth":585,"text":1756},"test and setup",{"id":1528,"depth":585,"text":1324},{"id":1582,"depth":585,"text":1583},{"id":1707,"depth":585,"text":1708},"The keys of detectors.yaml, the file that teaches kraft repo connect your own setup and test conventions, and the toolchains Kraft ships.","md",null,{},true,{"title":310,"description":1760},"3n6aihlf7PvhOABPnUOnXIOWsjLhWKzq1gpfMdolvFs",[1768,1770],{"title":306,"path":307,"stem":308,"description":1769,"children":-1},"What kraft repo connect reads in a repo, where each proposed setup and test command comes from, and what it does when it finds none.",{"title":314,"path":315,"stem":316,"description":1771,"children":-1},"Declare a root repository with member submodules in repos.yaml, and what it means for sandboxing and publication.",1791801179782]