[{"data":1,"prerenderedAt":431},["ShallowReactive",2],{"navigation_docs":3,"-examples-label-bot":199,"-examples-label-bot-surround":426},[4,23,65,87,133,159,177],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Guides","i-lucide-compass","\u002Fguides","2.guides",[29,33,37,41,45,49,53,57,61],{"title":30,"path":31,"stem":32},"Authenticate","\u002Fguides\u002Fauthentication","2.guides\u002F1.authentication",{"title":34,"path":35,"stem":36},"Work with several forges","\u002Fguides\u002Fmultiple-forges","2.guides\u002F2.multiple-forges",{"title":38,"path":39,"stem":40},"Configure from the environment","\u002Fguides\u002Fenvironment","2.guides\u002F3.environment",{"title":42,"path":43,"stem":44},"Receive webhooks","\u002Fguides\u002Fwebhooks","2.guides\u002F4.webhooks",{"title":46,"path":47,"stem":48},"Check what a forge supports","\u002Fguides\u002Fcapabilities","2.guides\u002F5.capabilities",{"title":50,"path":51,"stem":52},"Handle errors and rate limits","\u002Fguides\u002Ferrors","2.guides\u002F6.errors",{"title":54,"path":55,"stem":56},"Page through results","\u002Fguides\u002Fpagination","2.guides\u002F7.pagination",{"title":58,"path":59,"stem":60},"Browser bundles","\u002Fguides\u002Fbundling","2.guides\u002F8.bundling",{"title":62,"path":63,"stem":64},"Test your code","\u002Fguides\u002Ftesting","2.guides\u002F9.testing",{"title":66,"icon":67,"path":68,"stem":69,"children":70,"page":22},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[71,75,79,83],{"title":72,"path":73,"stem":74},"Data model","\u002Fconcepts\u002Fdata-model","3.concepts\u002F1.data-model",{"title":76,"path":77,"stem":78},"Capabilities","\u002Fconcepts\u002Fcapabilities","3.concepts\u002F2.capabilities",{"title":80,"path":81,"stem":82},"Providers and factories","\u002Fconcepts\u002Fproviders","3.concepts\u002F3.providers",{"title":84,"path":85,"stem":86},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F4.events",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Providers","i-lucide-server","\u002Fproviders","4.providers",[93,97,101,105,109,113,117,121,125,129],{"title":94,"path":95,"stem":96},"Azure DevOps","\u002Fproviders\u002Fazure-devops","4.providers\u002Fazure-devops",{"title":98,"path":99,"stem":100},"Bitbucket Cloud","\u002Fproviders\u002Fbitbucket","4.providers\u002Fbitbucket",{"title":102,"path":103,"stem":104},"Cursor Origin","\u002Fproviders\u002Fcursor-origin","4.providers\u002Fcursor-origin",{"title":106,"path":107,"stem":108},"Forgejo and Codeberg","\u002Fproviders\u002Fforgejo","4.providers\u002Fforgejo",{"title":110,"path":111,"stem":112},"Gitea","\u002Fproviders\u002Fgitea","4.providers\u002Fgitea",{"title":114,"path":115,"stem":116},"Gitee","\u002Fproviders\u002Fgitee","4.providers\u002Fgitee",{"title":118,"path":119,"stem":120},"GitHub","\u002Fproviders\u002Fgithub","4.providers\u002Fgithub",{"title":122,"path":123,"stem":124},"GitLab","\u002Fproviders\u002Fgitlab","4.providers\u002Fgitlab",{"title":126,"path":127,"stem":128},"pushin.eu","\u002Fproviders\u002Fpushin","4.providers\u002Fpushin",{"title":130,"path":131,"stem":132},"Tangled","\u002Fproviders\u002Ftangled","4.providers\u002Ftangled",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":22},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[139,143,147,151,155],{"title":140,"path":141,"stem":142},"Provider API","\u002Freference\u002Fprovider-api","5.reference\u002F1.provider-api",{"title":144,"path":145,"stem":146},"Capability matrix","\u002Freference\u002Fcapability-matrix","5.reference\u002F2.capability-matrix",{"title":148,"path":149,"stem":150},"Errors","\u002Freference\u002Ferrors","5.reference\u002F3.errors",{"title":152,"path":153,"stem":154},"Environment variables","\u002Freference\u002Fenvironment-variables","5.reference\u002F4.environment-variables",{"title":156,"path":157,"stem":158},"JSON Schemas","\u002Freference\u002Fjson-schemas","5.reference\u002F5.json-schemas",{"title":160,"icon":161,"path":162,"stem":163,"children":164,"page":22},"Examples","i-lucide-boxes","\u002Fexamples","6.examples",[165,169,173],{"title":166,"path":167,"stem":168},"Inbox CLI","\u002Fexamples\u002Finbox-cli","6.examples\u002F1.inbox-cli",{"title":170,"path":171,"stem":172},"Label bot","\u002Fexamples\u002Flabel-bot","6.examples\u002F2.label-bot",{"title":174,"path":175,"stem":176},"Release digest","\u002Fexamples\u002Frelease-digest","6.examples\u002F3.release-digest",{"title":178,"icon":179,"path":180,"stem":181,"children":182,"page":22},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","7.contributing",[183,187,191,195],{"title":184,"path":185,"stem":186},"Contribution guide","\u002Fcontributing\u002Fguidelines","7.contributing\u002F1.guidelines",{"title":188,"path":189,"stem":190},"Write a provider","\u002Fcontributing\u002Fwrite-a-provider","7.contributing\u002F2.write-a-provider",{"title":192,"path":193,"stem":194},"Record fixtures","\u002Fcontributing\u002Frecord-fixtures","7.contributing\u002F3.record-fixtures",{"title":196,"path":197,"stem":198},"Contributors","\u002Fcontributing\u002Fcontributors","7.contributing\u002F4.contributors",{"id":200,"title":170,"body":201,"description":418,"extension":419,"links":420,"meta":421,"navigation":423,"path":171,"seo":424,"stem":172,"__hash__":425},"docs\u002F6.examples\u002F2.label-bot.md",{"type":202,"value":203,"toc":412},"minimark",[204,220,234,245,250,291,305,319,326,343,347,357,361,381,385,394,408],[205,206,207,211,212,219],"p",{},[208,209,210],"code",{},"label-bot"," is a webhook receiver that works with any configured forge. ",[213,214,218],"a",{"href":215,"rel":216},"https:\u002F\u002Fgithub.com\u002Fdanielroe\u002Fforges\u002Ftree\u002Fmain\u002Fexamples\u002Flabel-bot",[217],"nofollow","View the source",". It does two things:",[221,222,223,227],"ul",{},[224,225,226],"li",{},"When an issue or pull request opens with a title that matches a pattern, the bot adds a label and posts a comment.",[224,228,229,230,233],{},"When a comment contains ",[208,231,232],{},"\u002Fclose",", the bot closes the thread if the commenter has write access to the repository.",[205,235,236,237,240,241,244],{},"The bot calls ",[208,238,239],{},"provider.can()"," before each write. On a forge that can't add labels, such as Bitbucket or Tangled, the bot posts the comment and reports the label as ",[208,242,243],{},"unsupported"," in its response.",[246,247,249],"h2",{"id":248},"run-it","Run it",[251,252,257],"pre",{"className":253,"code":254,"language":255,"meta":256,"style":256},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","FORGES_GITHUB_TOKEN=ghp_... \\\nFORGES_GITHUB_WEBHOOK_SECRET=... \\\nLABEL_BOT_PATTERN='^(feat|fix)[(:]' \\\nLABEL_BOT_LABEL=triage \\\npnpm --filter @forges-examples\u002Flabel-bot start\n","sh","",[208,258,259,267,273,279,285],{"__ignoreMap":256},[260,261,264],"span",{"class":262,"line":263},"line",1,[260,265,266],{},"FORGES_GITHUB_TOKEN=ghp_... \\\n",[260,268,270],{"class":262,"line":269},2,[260,271,272],{},"FORGES_GITHUB_WEBHOOK_SECRET=... \\\n",[260,274,276],{"class":262,"line":275},3,[260,277,278],{},"LABEL_BOT_PATTERN='^(feat|fix)[(:]' \\\n",[260,280,282],{"class":262,"line":281},4,[260,283,284],{},"LABEL_BOT_LABEL=triage \\\n",[260,286,288],{"class":262,"line":287},5,[260,289,290],{},"pnpm --filter @forges-examples\u002Flabel-bot start\n",[205,292,293,296,297,300,301,304],{},[208,294,295],{},"LABEL_BOT_COMMENT"," sets the text of the comment. ",[208,298,299],{},"PORT"," sets the port, which defaults to ",[208,302,303],{},"3000",".",[205,306,307,308,311,312,315,316,304],{},"Point the forge's webhook at ",[208,309,310],{},"http:\u002F\u002F\u003Chost>:3000\u002Fwebhooks\u002F\u003Cforge>",", for example ",[208,313,314],{},"\u002Fwebhooks\u002Fgithub",". If you configure several instances of the same forge, add the instance host to the path: ",[208,317,318],{},"\u002Fwebhooks\u002Fgitlab\u002Fgitlab.example.com",[205,320,321,322,325],{},"If a delivery's signature doesn't verify, the bot responds with ",[208,323,324],{},"401",". For any other delivery, it responds with a JSON list of the actions it took.",[205,327,328,331,332,335,336,339,340,304],{},[208,329,330],{},"src\u002Fhandler.ts"," exports a ",[208,333,334],{},"(request: Request) => Promise\u003CResponse>"," handler, so it runs on any runtime that supports the Fetch API. ",[208,337,338],{},"src\u002Fserver.ts"," serves the handler with ",[208,341,342],{},"node:http",[246,344,346],{"id":345},"collaborator-checks","Collaborator checks",[205,348,349,350,353,354,356],{},"Before the bot closes a thread, it calls ",[208,351,352],{},"repos.permissionFor()"," to read the commenter's role. On a forge with no collaborator API, the bot reports ",[208,355,243],{}," and leaves the thread open.",[246,358,360],{"id":359},"what-it-shows","What it shows",[221,362,363,369,375],{},[224,364,365,368],{},[213,366,367],{"href":43},"Receiving webhooks"," for several forges with one handler.",[224,370,371,374],{},[213,372,373],{"href":47},"Checking capabilities"," before each write.",[224,376,377,378,304],{},"Signing deliveries in tests with ",[208,379,380],{},"hmacSha256Hex()",[246,382,384],{"id":383},"run-the-tests","Run the tests",[251,386,388],{"className":253,"code":387,"language":255,"meta":256,"style":256},"pnpm --filter @forges-examples\u002Flabel-bot test\n",[208,389,390],{"__ignoreMap":256},[260,391,392],{"class":262,"line":263},[260,393,387],{},[205,395,396,397,399,400,403,404,407],{},"The tests sign deliveries with ",[208,398,380],{}," from ",[208,401,402],{},"forges",". They serve responses from the fixtures in ",[208,405,406],{},"test\u002Ffixtures\u002Fgithub\u002F",", without a network connection.",[409,410,411],"style",{},"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":256,"searchDepth":269,"depth":269,"links":413},[414,415,416,417],{"id":248,"depth":269,"text":249},{"id":345,"depth":269,"text":346},{"id":359,"depth":269,"text":360},{"id":383,"depth":269,"text":384},"A webhook receiver that labels new threads and closes them from a comment command.","md",null,{"icon":422},"i-lucide-tag",true,{"title":170,"description":418},"QyczjZusVDGbDYc3-n_tcG5K39V9O8V0NHiTlW8g0tA",[427,429],{"title":166,"path":167,"stem":168,"description":428,"children":-1},"A command-line inbox for the notifications of every forge you configure.",{"title":174,"path":175,"stem":176,"description":430,"children":-1},"Print the latest release and the failing pull requests of repositories on any forge.",1791296689727]