[{"data":1,"prerenderedAt":541},["ShallowReactive",2],{"navigation_docs":3,"-contributing-write-a-provider":199,"-contributing-write-a-provider-surround":536},[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":188,"body":201,"description":528,"extension":529,"links":530,"meta":531,"navigation":533,"path":189,"seo":534,"stem":190,"__hash__":535},"docs\u002F7.contributing\u002F2.write-a-provider.md",{"type":202,"value":203,"toc":522},"minimark",[204,221,232,376,406,411,434,444,448,457,461,475,479,490,497,508,518],[205,206,207,208,212,213,216,217,220],"p",{},"A provider is one call to ",[209,210,211],"code",{},"defineForgeProvider()",". You declare each operation once, with ",[209,214,215],{},"verb(support, run)",", or with ",[209,218,219],{},"perKind(kinds, run)"," when support depends on the thread kind. Each declaration produces both the method and its capability entry.",[205,222,223,224,227,228,231],{},"In this excerpt from a provider's ",[209,225,226],{},"setup()",", issue reads are experimental and ",[209,229,230],{},"getMany"," is unsupported:",[233,234,239],"pre",{"className":235,"code":236,"language":237,"meta":238,"style":238},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const threads = {\n  get: perKind({ issue: 'experimental' }, getIssue),\n  listPage: perKind({ issue: 'experimental' }, listIssues),\n  getMany: verb(false, async () => []),\n}\n","ts","",[209,240,241,261,305,336,370],{"__ignoreMap":238},[242,243,246,250,254,258],"span",{"class":244,"line":245},"line",1,[242,247,249],{"class":248},"spNyl","const",[242,251,253],{"class":252},"sTEyZ"," threads ",[242,255,257],{"class":256},"sMK4o","=",[242,259,260],{"class":256}," {\n",[242,262,264,268,271,275,278,281,284,286,289,293,296,299,302],{"class":244,"line":263},2,[242,265,267],{"class":266},"swJcz","  get",[242,269,270],{"class":256},":",[242,272,274],{"class":273},"s2Zo4"," perKind",[242,276,277],{"class":252},"(",[242,279,280],{"class":256},"{",[242,282,283],{"class":266}," issue",[242,285,270],{"class":256},[242,287,288],{"class":256}," '",[242,290,292],{"class":291},"sfazB","experimental",[242,294,295],{"class":256},"'",[242,297,298],{"class":256}," },",[242,300,301],{"class":252}," getIssue)",[242,303,304],{"class":256},",\n",[242,306,308,311,313,315,317,319,321,323,325,327,329,331,334],{"class":244,"line":307},3,[242,309,310],{"class":266},"  listPage",[242,312,270],{"class":256},[242,314,274],{"class":273},[242,316,277],{"class":252},[242,318,280],{"class":256},[242,320,283],{"class":266},[242,322,270],{"class":256},[242,324,288],{"class":256},[242,326,292],{"class":291},[242,328,295],{"class":256},[242,330,298],{"class":256},[242,332,333],{"class":252}," listIssues)",[242,335,304],{"class":256},[242,337,339,342,344,347,349,353,356,359,362,365,368],{"class":244,"line":338},4,[242,340,341],{"class":266},"  getMany",[242,343,270],{"class":256},[242,345,346],{"class":273}," verb",[242,348,277],{"class":252},[242,350,352],{"class":351},"sfNiH","false",[242,354,355],{"class":256},",",[242,357,358],{"class":248}," async",[242,360,361],{"class":256}," ()",[242,363,364],{"class":248}," =>",[242,366,367],{"class":252}," [])",[242,369,304],{"class":256},[242,371,373],{"class":244,"line":372},5,[242,374,375],{"class":256},"}\n",[205,377,378,381,382,385,386,389,390,393,394,397,398,401,402,405],{},[209,379,380],{},"forges"," adds the rest of the provider: ",[209,383,384],{},"capabilities",", ",[209,387,388],{},"can()",", the iterables (",[209,391,392],{},"list"," from ",[209,395,396],{},"listPage",", for example), ",[209,399,400],{},"readOnly",", anonymous handling and a ",[209,403,404],{},"webhooks.ingest()"," that verifies each delivery before it translates it.",[407,408,410],"h2",{"id":409},"declare-operations","Declare operations",[205,412,413,416,417,426,427,430,431,433],{},[209,414,415],{},"ProviderSpec"," in ",[418,419,423],"a",{"href":420,"rel":421},"https:\u002F\u002Fgithub.com\u002Fdanielroe\u002Fforges\u002Fblob\u002Fmain\u002Fsrc\u002Fdefine.ts",[422],"nofollow",[209,424,425],{},"src\u002Fdefine.ts"," lists every operation and marks which ones are required. Declare a required operation that your forge lacks with ",[209,428,429],{},"verb(false, ...)",". Any other operation that you leave out, and any thread kind that you don't list, is ",[209,432,352],{},".",[205,435,436,443],{},[418,437,440],{"href":438,"rel":439},"https:\u002F\u002Fgithub.com\u002Fdanielroe\u002Fforges\u002Fblob\u002Fmain\u002Fsrc\u002Fpushin\u002Findex.ts",[422],[209,441,442],{},"src\u002Fpushin\u002Findex.ts"," is a short provider to read as an example.",[407,445,447],{"id":446},"handle-webhooks","Handle webhooks",[205,449,450,451,454,455,433],{},"Webhook handlers go in the ",[209,452,453],{},"webhooks"," field of the definition. For a Lite variant, define a second factory from the same definition without ",[209,456,453],{},[407,458,460],{"id":459},"send-requests","Send requests",[205,462,463,464,467,468,471,472,474],{},"Use ",[209,465,466],{},"ctx.fetcher"," for requests. It applies the base URL, auth header, user agent, timeout and the caller's ",[209,469,470],{},"fetch",", and it maps rate limits and revoked tokens to ",[209,473,380],{}," errors.",[407,476,478],{"id":477},"run-scripts-without-a-build","Run scripts without a build",[205,480,481,482,485,486,489],{},"Source files import each other with ",[209,483,484],{},".ts"," extensions, so ",[209,487,488],{},"node scripts\u002F\u003Cname>.ts"," runs without a build.",[205,491,492,493,496],{},"After you change a provider's capabilities, regenerate the ",[418,494,495],{"href":145},"capability matrix"," and the table on each provider page:",[233,498,502],{"className":499,"code":500,"language":501,"meta":238,"style":238},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm capability-matrix\n","sh",[209,503,504],{"__ignoreMap":238},[242,505,506],{"class":244,"line":245},[242,507,500],{},[205,509,510,511,514,515,433],{},"Then ",[418,512,513],{"href":193},"record fixtures"," so that capabilities can be ",[209,516,517],{},"true",[519,520,521],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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":238,"searchDepth":263,"depth":263,"links":523},[524,525,526,527],{"id":409,"depth":263,"text":410},{"id":446,"depth":263,"text":447},{"id":459,"depth":263,"text":460},{"id":477,"depth":263,"text":478},"Add a forge by declaring each operation once.","md",null,{"icon":532},"i-lucide-hammer",true,{"title":188,"description":528},"cvaQ-8QTrMPbbVSEMRX2b9_GalNVOCinGIgIddiJUro",[537,539],{"title":184,"path":185,"stem":186,"description":538,"children":-1},"Set up the repository, run the checks and follow the rules that keep providers consistent.",{"title":192,"path":193,"stem":194,"description":540,"children":-1},"Verify a provider's reads against the live forge.",1791296695434]