[{"data":1,"prerenderedAt":1488},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fintegrations\u002Flinear":90,"docs-surround-\u002Fdocs\u002Fintegrations\u002Flinear":1483},[4],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Docs","\u002Fdocs","docs",[9,35,56,77],{"title":10,"path":11,"stem":12,"children":13,"page":34},"Get Started","\u002Fdocs\u002Fget-started","docs\u002F1.get-started",[14,18,22,26,30],{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fget-started\u002Fintroduction","docs\u002F1.get-started\u002F1.introduction",{"title":19,"path":20,"stem":21},"Concepts","\u002Fdocs\u002Fget-started\u002Fconcepts","docs\u002F1.get-started\u002F2.concepts",{"title":23,"path":24,"stem":25},"Installation","\u002Fdocs\u002Fget-started\u002Finstallation","docs\u002F1.get-started\u002F3.installation",{"title":27,"path":28,"stem":29},"Setup","\u002Fdocs\u002Fget-started\u002Fsetup","docs\u002F1.get-started\u002F4.setup",{"title":31,"path":32,"stem":33},"Maintenance","\u002Fdocs\u002Fget-started\u002Fmaintenance","docs\u002F1.get-started\u002F5.maintenance",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Usage","\u002Fdocs\u002Fusage","docs\u002F2.usage",[40,44,48,52],{"title":41,"path":42,"stem":43},"Projects","\u002Fdocs\u002Fusage\u002Fprojects","docs\u002F2.usage\u002F1.projects",{"title":45,"path":46,"stem":47},"Workflows","\u002Fdocs\u002Fusage\u002Fworkflows","docs\u002F2.usage\u002F2.workflows",{"title":49,"path":50,"stem":51},"Triggers","\u002Fdocs\u002Fusage\u002Ftriggers","docs\u002F2.usage\u002F3.triggers",{"title":53,"path":54,"stem":55},"AI Agent","\u002Fdocs\u002Fusage\u002Fagent","docs\u002F2.usage\u002F4.agent",{"title":57,"path":58,"stem":59,"children":60,"page":34},"Integrations","\u002Fdocs\u002Fintegrations","docs\u002F3.integrations",[61,65,69,73],{"title":62,"path":63,"stem":64},"GitHub","\u002Fdocs\u002Fintegrations\u002Fgithub","docs\u002F3.integrations\u002F1.github",{"title":66,"path":67,"stem":68},"Jira","\u002Fdocs\u002Fintegrations\u002Fjira","docs\u002F3.integrations\u002F2.jira",{"title":70,"path":71,"stem":72},"Plane","\u002Fdocs\u002Fintegrations\u002Fplane","docs\u002F3.integrations\u002F3.plane",{"title":74,"path":75,"stem":76},"Linear","\u002Fdocs\u002Fintegrations\u002Flinear","docs\u002F3.integrations\u002F4.linear",{"title":78,"path":79,"stem":80,"children":81,"page":34},"Resources","\u002Fdocs\u002Fresources","docs\u002F4.resources",[82,86],{"title":83,"path":84,"stem":85},"Beta Testers","\u002Fdocs\u002Fresources\u002Fbeta-testers","docs\u002F4.resources\u002F1.beta-testers",{"title":87,"path":88,"stem":89},"Troubleshooting","\u002Fdocs\u002Fresources\u002Ftroubleshooting","docs\u002F4.resources\u002F2.troubleshooting",{"id":91,"title":74,"body":92,"description":1478,"extension":1479,"meta":1480,"navigation":839,"path":75,"seo":1481,"stem":76,"__hash__":1482},"docs_en\u002Fdocs\u002F3.integrations\u002F4.linear.md",{"type":93,"value":94,"toc":1458},"minimark",[95,99,103,106,294,298,301,312,318,323,386,390,393,407,417,421,484,489,493,541,545,553,557,564,590,596,600,603,613,619,622,628,632,635,639,650,657,668,672,698,874,878,907,1019,1023,1049,1160,1163,1168,1172,1175,1202,1321,1325,1328,1351,1454],[96,97,98],"p",{},"The Linear integration connects a Linear workspace to your instance. Issues start workflows, the agent reads and answers on them, moves them between statuses, and Knecht reports the finished pull request back on the issue.",[100,101,27],"h2",{"id":102},"setup",[96,104,105],{},"You need a Linear workspace and an account Knecht acts as. A dedicated account named \"Knecht\" is worth the extra seat: comments show up under its name, \"assign it to Knecht\" becomes a normal assignment in Linear, and the account's team memberships limit what Knecht can see. Creating the webhook in step three needs workspace admin rights, once.",[107,108,110,115,118,135,142,150,154,157,160,166,170,173,176,212,218,221,228,232,235,239,242],"steps",{"level":109},"3",[111,112,114],"h3",{"id":113},"create-a-personal-api-key","Create a Personal API Key",[96,116,117],{},"Sign in to Linear as the account Knecht should use and open Settings, \"Security & access\". Under \"Personal API keys\", create a new key. Give it a name such as \"Knecht\" and fill in the form:",[119,120,121,129],"ul",{},[122,123,124,128],"li",{},[125,126,127],"strong",{},"Permissions."," \"Full access\", or under \"Only select permissions\" at least Read and Write. Knecht reads issues and comments, writes comments, and changes labels and statuses.",[122,130,131,134],{},[125,132,133],{},"Team access."," \"All teams you have access to\", or under \"Only select teams\" the teams you want to link to projects.",[96,136,137],{},[138,139],"img",{"alt":140,"src":141},"The Create API key form in the Linear security settings, with the key name Knecht, Full access, and All teams you have access to selected","\u002Fassets\u002Flinear-api-key.png",[96,143,144,145,149],{},"\"Create\" shows the key. Copy it, it starts with ",[146,147,148],"code",{},"lin_api_"," and is shown only once. Everything Knecht does with the key is attributed to this account.",[111,151,153],{"id":152},"connect-the-account","Connect the Account",[96,155,156],{},"In your instance, open Settings, Integrations. The Linear panel has one field, \"API key\", for the key from step one.",[96,158,159],{},"\"Connect\" checks the key against Linear before anything is stored and shows \"Connected as\" with the account's name on success. The key is stored encrypted and not shown again. \"Reconnect\" replaces the key later, \"Disconnect\" removes the connection.",[96,161,162],{},[138,163],{"alt":164,"src":165},"The Linear panel under Settings, Integrations, connected to an account, with the API key field, and the webhook URL and secret below","\u002Fassets\u002Fknecht-integration-settings-linear.png",[111,167,169],{"id":168},"create-the-webhook-in-linear","Create the Webhook in Linear",[96,171,172],{},"Linear does not call Knecht until you tell it to. After connecting, the panel shows the webhook URL with a copy button. \"Set up in Linear\" opens the API settings of your workspace. By hand it is Settings, then \"API\" under Administration, then \"Webhooks\".",[96,174,175],{},"Fill in the form:",[119,177,178,184,194,200,206],{},[122,179,180,183],{},[125,181,182],{},"Label."," Anything, for example \"Knecht\".",[122,185,186,189,190,193],{},[125,187,188],{},"URL."," The webhook URL from the panel, it ends in ",[146,191,192],{},"\u002Fapi\u002Flinear\u002Fwebhook",".",[122,195,196,199],{},[125,197,198],{},"Data change events."," Tick \"Issues\" and \"Comments\". Everything else stays empty.",[122,201,202,205],{},[125,203,204],{},"Other events."," Leave \"Issue SLA\" unticked.",[122,207,208,211],{},[125,209,210],{},"Team selection."," \"All public teams\", or the one team you link. It cannot be changed after creation. Knecht drops events of teams that are not linked.",[96,213,214],{},[138,215],{"alt":216,"src":217},"The Create webhook form in the Linear API settings, with the Knecht webhook URL and the data change events Comments and Issues ticked","\u002Fassets\u002Flinear-webhook-events.png",[96,219,220],{},"Knecht uses the issue events create, update, and remove, and the comment event create. Updated and removed comments arrive as well and are ignored.",[96,222,223,224,227],{},"The form already shows the signing secret, it starts with ",[146,225,226],{},"lin_wh_",". Copy it, click \"Create webhook\", paste the secret into the Secret field of the Linear panel in Knecht, and click \"Save\". Unlike Jira, the secret comes from Linear, not from Knecht. Knecht keeps one signing secret, so use one webhook for all linked teams. The pencil next to the secret replaces it later. The status line switches to \"Waiting for Linear\".",[111,229,231],{"id":230},"link-a-project-to-its-linear-team","Link a Project to Its Linear Team",[96,233,234],{},"Open the settings of a project in Knecht. The Linear panel has one field, \"Linear team\", listing the teams the account can access. Pick the one whose issues belong to this repository. One Linear team links to one repository and the other way round. Only linked projects can have Linear triggers.",[111,236,238],{"id":237},"check-that-events-arrive","Check That Events Arrive",[96,240,241],{},"Edit any issue of the linked team. The status line in the Linear panel under Settings, Integrations switches to \"Receiving events\" with the last event and issue identifier. If it does not:",[243,244,245,258],"table",{},[246,247,248],"thead",{},[249,250,251,255],"tr",{},[252,253,254],"th",{},"Status line says",[252,256,257],{},"What to do",[259,260,261,270,278,286],"tbody",{},[249,262,263,267],{},[264,265,266],"td",{},"Wrong secret",[264,268,269],{},"Replace the secret in the panel with the signing secret of the webhook.",[249,271,272,275],{},[264,273,274],{},"Without a body",[264,276,277],{},"Create the webhook again, Linear sent an empty delivery.",[249,279,280,283],{},[264,281,282],{},"No project is linked",[264,284,285],{},"Link the Linear team in the project settings, see step four. Events Knecht does not use show up here as well.",[249,287,288,291],{},[264,289,290],{},"Still \"Waiting for Linear\"",[264,292,293],{},"Check that the webhook URL is reachable from the internet, that the events are ticked, and that the team selection covers the linked team.",[100,295,297],{"id":296},"capabilities","Capabilities",[111,299,49],{"id":300},"triggers",[96,302,303,304,308,309,193],{},"A Linear trigger watches the Linear teams linked to the selected projects and starts one run for the project whose team the issue belongs to. The project field only lists projects that are linked. In the form, \"Fires when any of these happens\" lists the events and \"But only if\" the conditions. Any ticked event fires the trigger, and one group of conditions has to hold. How the two sections work in general is on ",[305,306,49],"a",{"href":307},"\u002Fdocs\u002Fusage\u002Ftriggers#events-and-conditions",". What all issue trackers share, such as issues that are created with the label already set, is on ",[305,310,49],{"href":311},"\u002Fdocs\u002Fusage\u002Ftriggers#issue-trackers",[96,313,314],{},[138,315],{"alt":316,"src":317},"The trigger dialog with Linear selected as source, one linked project, the event Created ticked, and the condition Status is Any Triage","\u002Fassets\u002Fknecht-trigger-linear.png",[319,320,322],"h4",{"id":321},"events","Events",[243,324,325,338],{},[246,326,327],{},[249,328,329,332,335],{},[252,330,331],{},"Event",[252,333,334],{},"Fires when",[252,336,337],{},"Notes",[259,339,340,350,364,375],{},[249,341,342,345,348],{},[264,343,344],{},"Created",[264,346,347],{},"A new issue appears in the team.",[264,349],{},[249,351,352,355,358],{},[264,353,354],{},"Assigned to Knecht",[264,356,357],{},"The issue is assigned to the account behind the connection.",[264,359,360,361,193],{},"Ticked by default. Makes \"give it to Knecht\" a normal assignment in Linear. Knecht taking the issue itself does not fire, see ",[305,362,49],{"href":363},"\u002Fdocs\u002Fusage\u002Ftriggers#knecht-holds-the-issue",[249,365,366,369,372],{},[264,367,368],{},"Label added",[264,370,371],{},"One of the picked labels is added to an issue.",[264,373,374],{},"The labels are picked from the labels of the team and the workspace. Label groups are not listed, they cannot be applied themselves.",[249,376,377,380,383],{},[264,378,379],{},"Status reached",[264,381,382],{},"An issue moves into one of the picked statuses or status categories.",[264,384,385],{},"The default is \"Any Completed\". An issue created in a status does not fire.",[319,387,389],{"id":388},"status-reached","Status Reached",[96,391,392],{},"The status list has two groups.",[119,394,395,401],{},[122,396,397,400],{},[125,398,399],{},"Category."," \"Any Triage\", \"Any Backlog\", \"Any Unstarted\", \"Any Started\", \"Any Completed\", and \"Any Canceled\" stand for Linear's six status categories, whatever the statuses of a team are called.",[122,402,403,406],{},[125,404,405],{},"Exact status."," The statuses of the selected teams.",[96,408,409,411,412,416],{},[305,410,49],{"href":311}," explains when a category and when an exact status fires, ",[305,413,415],{"href":414},"\u002Fdocs\u002Fusage\u002Ftriggers#matching","Matching"," what happens with several projects. If the form warns about a missing status, pick a category, a status all teams share, or create a second trigger.",[319,418,420],{"id":419},"conditions","Conditions",[243,422,423,433],{},[246,424,425],{},[249,426,427,430],{},[252,428,429],{},"Field",[252,431,432],{},"Compares against",[259,434,435,443,451,459],{},[249,436,437,440],{},[264,438,439],{},"Status",[264,441,442],{},"The status the issue is in, as a category such as \"Any Triage\" or an exact status.",[249,444,445,448],{},[264,446,447],{},"Assignee",[264,449,450],{},"\"Knecht\", the account behind the connection.",[249,452,453,456],{},[264,454,455],{},"Label",[264,457,458],{},"The labels on the issue, read from the team and the workspace.",[249,460,461,464],{},[264,462,463],{},"Priority",[264,465,466,467,470,471,470,474,470,477,480,481,193],{},"The priority of the issue: ",[146,468,469],{},"urgent",", ",[146,472,473],{},"high",[146,475,476],{},"medium",[146,478,479],{},"low",", or ",[146,482,483],{},"none",[96,485,486,487,193],{},"Each condition takes \"is\" or \"is not\". Every value is picked from a list and compared exactly, upper and lower case included. The rules are the same for every source, see ",[305,488,415],{"href":414},[319,490,492],{"id":491},"inputs","Inputs",[96,494,495,496,499,500,470,503,506,507,510,511,514,515,518,519,522,523,526,527,530,531,534,535,538,539,193],{},"The issue fills the run inputs: ",[146,497,498],{},"identifier"," is the key such as ",[146,501,502],{},"ENG-42",[146,504,505],{},"title"," the title, ",[146,508,509],{},"body"," the description as Markdown, ",[146,512,513],{},"url"," the issue link, ",[146,516,517],{},"status"," the status name, ",[146,520,521],{},"labels"," the labels, ",[146,524,525],{},"assignee"," and ",[146,528,529],{},"author"," the names of the assignee and the creator. ",[146,532,533],{},"event"," is ",[146,536,537],{},"issue",". Pausing, versioning, and shared behavior are on ",[305,540,49],{"href":50},[111,542,544],{"id":543},"sessions-on-issues","Sessions on Issues",[96,546,547,548,552],{},"A run started by an issue joins the ",[305,549,551],{"href":550},"\u002Fdocs\u002Fget-started\u002Fconcepts#sessions","session"," of that issue, like a run on a GitHub issue. The session keeps the checkout, the environment, and the agent conversation, so a second trigger on the same issue or a mention continues the work. The session closes when the issue reaches a status in the Completed or Canceled category, is archived, or is deleted, its environment stops once no run needs it any more, and it opens again when the issue is moved back.",[111,554,556],{"id":555},"the-agent-on-issues","The Agent on Issues",[96,558,559,560,563],{},"When the run's session belongs to an issue, the ",[305,561,562],{"href":54},"agent"," gets four commands inside the environment. The prompt of an AI step only has to name what to do with them.",[119,565,566,572,578,584],{},[122,567,568,571],{},[125,569,570],{},"Read the issue."," Priority, status, creator, assignee, labels, the description, and the last ten comments, live from Linear.",[122,573,574,577],{},[125,575,576],{},"Reply."," Posts a comment on the issue. The agent writes Markdown, which Linear takes as it is, and Knecht appends the preview link and, when one exists, the pull request link.",[122,579,580,583],{},[125,581,582],{},"Set labels."," Adds or removes labels of the team and the workspace. Knecht never creates labels. If a name does not exist, the agent gets the list of existing labels instead.",[122,585,586,589],{},[125,587,588],{},"Move the issue."," Sets the status by name, for example \"In Review\". Linear has no transition rules, so every status of the team is reachable.",[96,591,592,593,193],{},"Opening a pull request works through the git steps or the agent's own command, see ",[305,594,62],{"href":595},"\u002Fdocs\u002Fintegrations\u002Fgithub#workflow-steps",[111,597,599],{"id":598},"mentions","Mentions",[96,601,602],{},"Write a comment on an issue of a linked Linear team, mention the Knecht account the way you mention a colleague, and add the instruction:",[604,605,610],"pre",{"className":606,"code":608,"language":609},[607],"language-text","@Knecht fix the broken footer link\n","text",[146,611,608],{"__ignoreMap":612},"",[96,614,615,618],{},[146,616,617],{},"@knecht"," typed as plain text works as well. Knecht runs the comment as a follow-up and posts the answer as a comment.",[96,620,621],{},"Whoever can comment on the issue can mention Knecht, the Linear workspace is the gate.",[96,623,624,625,193],{},"The one-time setup, what happens step by step, and what to check when Knecht stays silent is on ",[305,626,599],{"href":627},"\u002Fdocs\u002Fusage\u002Fagent#mentions",[100,629,631],{"id":630},"examples","Examples",[96,633,634],{},"The workflows below can be built in the editor or imported from YAML under Workflows, \"Import\". Triggers are added in the editor after the import. All of them assume the project is linked to its Linear team.",[111,636,638],{"id":637},"software-factory","Software Factory",[96,640,641,642,645,646,649],{},"Three workflows that hand an issue from one to the next. The triage checks every new issue, sets the label ",[146,643,644],{},"Bug"," or ",[146,647,648],{},"Feature",", and moves it to \"Todo\". That move fires the trigger of the workflow whose label condition matches. A bug comes back with a pull request and an issue in review, a feature with a plan that a mention in the comments turns into a pull request.",[96,651,652,653,656],{},"All of it runs in the ",[305,654,551],{"href":655},"#sessions-on-issues"," of the issue. The triage boots the site once and every later run finds it running, so only the triage has a boot step. The prompts do not repeat title or description, because the agent reads the issue of its session itself.",[658,659,660],"note",{},[96,661,662,663,526,665,667],{},"Make sure the labels ",[146,664,644],{},[146,666,648],{}," exist in the team or the workspace first. Knecht only applies labels that exist, and a trigger only offers labels that exist.",[319,669,671],{"id":670},"triage","Triage",[243,673,674,687],{},[246,675,676],{},[249,677,678,681,684],{},[252,679,680],{},"Source",[252,682,683],{},"Fires When",[252,685,686],{},"But Only If",[259,688,689],{},[249,690,691,693,695],{},[264,692,74],{},[264,694,344],{},[264,696,697],{},"No conditions",[699,700,702],"docs-workflow-yaml",{"filename":701},"linear-issue-triage.yaml",[604,703,707],{"className":704,"code":705,"language":706,"meta":612,"style":612},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","version: 1\nname: Linear Issue Triage\ndescription: Check every new issue and label it as bug or feature.\nsteps:\n  - type: ddev-start\n    id: boot_project\n  - type: ai\n    prompt: >-\n      Read the issue of this session. Try to reproduce it in the preview and in\n      the code. Do not fix anything. Then apply exactly one label: \"Bug\" if\n      something is broken, \"Feature\" if it was never built and then move it to\n      \"Todo\".\n\n      If the issue lacks the details to decide, apply no label and ask the\n      creator in a comment for clarification.\n    id: triage\n    label: Triage\n","yaml",[146,708,709,726,738,749,757,771,782,794,810,816,822,828,834,841,847,853,863],{"__ignoreMap":612},[710,711,714,718,722],"span",{"class":712,"line":713},"line",1,[710,715,717],{"class":716},"swJcz","version",[710,719,721],{"class":720},"sMK4o",":",[710,723,725],{"class":724},"sbssI"," 1\n",[710,727,729,732,734],{"class":712,"line":728},2,[710,730,731],{"class":716},"name",[710,733,721],{"class":720},[710,735,737],{"class":736},"sfazB"," Linear Issue Triage\n",[710,739,741,744,746],{"class":712,"line":740},3,[710,742,743],{"class":716},"description",[710,745,721],{"class":720},[710,747,748],{"class":736}," Check every new issue and label it as bug or feature.\n",[710,750,752,754],{"class":712,"line":751},4,[710,753,107],{"class":716},[710,755,756],{"class":720},":\n",[710,758,760,763,766,768],{"class":712,"line":759},5,[710,761,762],{"class":720},"  -",[710,764,765],{"class":716}," type",[710,767,721],{"class":720},[710,769,770],{"class":736}," ddev-start\n",[710,772,774,777,779],{"class":712,"line":773},6,[710,775,776],{"class":716},"    id",[710,778,721],{"class":720},[710,780,781],{"class":736}," boot_project\n",[710,783,785,787,789,791],{"class":712,"line":784},7,[710,786,762],{"class":720},[710,788,765],{"class":716},[710,790,721],{"class":720},[710,792,793],{"class":736}," ai\n",[710,795,797,800,802,806],{"class":712,"line":796},8,[710,798,799],{"class":716},"    prompt",[710,801,721],{"class":720},[710,803,805],{"class":804},"s7zQu"," >",[710,807,809],{"class":808},"spNyl","-\n",[710,811,813],{"class":712,"line":812},9,[710,814,815],{"class":736},"      Read the issue of this session. Try to reproduce it in the preview and in\n",[710,817,819],{"class":712,"line":818},10,[710,820,821],{"class":736},"      the code. Do not fix anything. Then apply exactly one label: \"Bug\" if\n",[710,823,825],{"class":712,"line":824},11,[710,826,827],{"class":736},"      something is broken, \"Feature\" if it was never built and then move it to\n",[710,829,831],{"class":712,"line":830},12,[710,832,833],{"class":736},"      \"Todo\".\n",[710,835,837],{"class":712,"line":836},13,[710,838,840],{"emptyLinePlaceholder":839},true,"\n",[710,842,844],{"class":712,"line":843},14,[710,845,846],{"class":736},"      If the issue lacks the details to decide, apply no label and ask the\n",[710,848,850],{"class":712,"line":849},15,[710,851,852],{"class":736},"      creator in a comment for clarification.\n",[710,854,856,858,860],{"class":712,"line":855},16,[710,857,776],{"class":716},[710,859,721],{"class":720},[710,861,862],{"class":736}," triage\n",[710,864,866,869,871],{"class":712,"line":865},17,[710,867,868],{"class":716},"    label",[710,870,721],{"class":720},[710,872,873],{"class":736}," Triage\n",[319,875,877],{"id":876},"bug-fix","Bug Fix",[243,879,880,890],{},[246,881,882],{},[249,883,884,886,888],{},[252,885,680],{},[252,887,683],{},[252,889,686],{},[259,891,892],{},[249,893,894,896,902],{},[264,895,74],{},[264,897,898,899],{},"Status reached: ",[146,900,901],{},"Todo",[264,903,904,905],{},"Label is ",[146,906,644],{},[699,908,910],{"filename":909},"linear-bug-fix.yaml",[604,911,913],{"className":704,"code":912,"language":706,"meta":612,"style":612},"version: 1\nname: Linear Bug Fix\ndescription: Fix an issue labeled as bug and open a pull request.\nsteps:\n  - type: ai\n    prompt: >-\n      The issue of this session was confirmed as a bug. When you are beginning\n      your work move the issue to \"In Progress\". Then fix it on a work branch,\n      verify the fix on the preview, commit in logical batches, and open a pull\n      request.\n\n      Comment a short summary of the change on the issue and move it to \"In\n      Review\".\n    id: bug_fix\n    label: Bug Fix\n",[146,914,915,923,932,941,947,957,967,972,977,982,987,991,996,1001,1010],{"__ignoreMap":612},[710,916,917,919,921],{"class":712,"line":713},[710,918,717],{"class":716},[710,920,721],{"class":720},[710,922,725],{"class":724},[710,924,925,927,929],{"class":712,"line":728},[710,926,731],{"class":716},[710,928,721],{"class":720},[710,930,931],{"class":736}," Linear Bug Fix\n",[710,933,934,936,938],{"class":712,"line":740},[710,935,743],{"class":716},[710,937,721],{"class":720},[710,939,940],{"class":736}," Fix an issue labeled as bug and open a pull request.\n",[710,942,943,945],{"class":712,"line":751},[710,944,107],{"class":716},[710,946,756],{"class":720},[710,948,949,951,953,955],{"class":712,"line":759},[710,950,762],{"class":720},[710,952,765],{"class":716},[710,954,721],{"class":720},[710,956,793],{"class":736},[710,958,959,961,963,965],{"class":712,"line":773},[710,960,799],{"class":716},[710,962,721],{"class":720},[710,964,805],{"class":804},[710,966,809],{"class":808},[710,968,969],{"class":712,"line":784},[710,970,971],{"class":736},"      The issue of this session was confirmed as a bug. When you are beginning\n",[710,973,974],{"class":712,"line":796},[710,975,976],{"class":736},"      your work move the issue to \"In Progress\". Then fix it on a work branch,\n",[710,978,979],{"class":712,"line":812},[710,980,981],{"class":736},"      verify the fix on the preview, commit in logical batches, and open a pull\n",[710,983,984],{"class":712,"line":818},[710,985,986],{"class":736},"      request.\n",[710,988,989],{"class":712,"line":824},[710,990,840],{"emptyLinePlaceholder":839},[710,992,993],{"class":712,"line":830},[710,994,995],{"class":736},"      Comment a short summary of the change on the issue and move it to \"In\n",[710,997,998],{"class":712,"line":836},[710,999,1000],{"class":736},"      Review\".\n",[710,1002,1003,1005,1007],{"class":712,"line":843},[710,1004,776],{"class":716},[710,1006,721],{"class":720},[710,1008,1009],{"class":736}," bug_fix\n",[710,1011,1012,1014,1016],{"class":712,"line":849},[710,1013,868],{"class":716},[710,1015,721],{"class":720},[710,1017,1018],{"class":736}," Bug Fix\n",[319,1020,1022],{"id":1021},"plan-feature","Plan Feature",[243,1024,1025,1035],{},[246,1026,1027],{},[249,1028,1029,1031,1033],{},[252,1030,680],{},[252,1032,683],{},[252,1034,686],{},[259,1036,1037],{},[249,1038,1039,1041,1045],{},[264,1040,74],{},[264,1042,898,1043],{},[146,1044,901],{},[264,1046,904,1047],{},[146,1048,648],{},[699,1050,1052],{"filename":1051},"linear-plan-feature.yaml",[604,1053,1055],{"className":704,"code":1054,"language":706,"meta":612,"style":612},"version: 1\nname: Linear Plan Feature\ndescription: Plan an issue labeled as feature and post the plan.\nsteps:\n  - type: ai\n    prompt: >-\n      The issue of this session is a feature.\n\n      Work out how it would be built in this project: the files to touch, the\n      steps in order, and what is open.\n\n      Do not change any files or the status. Just post the plan as a comment,\n      written for the person who created the issue.\n    id: plan_feature\n    label: Plan Feature\n",[146,1056,1057,1065,1074,1083,1089,1099,1109,1114,1118,1123,1128,1132,1137,1142,1151],{"__ignoreMap":612},[710,1058,1059,1061,1063],{"class":712,"line":713},[710,1060,717],{"class":716},[710,1062,721],{"class":720},[710,1064,725],{"class":724},[710,1066,1067,1069,1071],{"class":712,"line":728},[710,1068,731],{"class":716},[710,1070,721],{"class":720},[710,1072,1073],{"class":736}," Linear Plan Feature\n",[710,1075,1076,1078,1080],{"class":712,"line":740},[710,1077,743],{"class":716},[710,1079,721],{"class":720},[710,1081,1082],{"class":736}," Plan an issue labeled as feature and post the plan.\n",[710,1084,1085,1087],{"class":712,"line":751},[710,1086,107],{"class":716},[710,1088,756],{"class":720},[710,1090,1091,1093,1095,1097],{"class":712,"line":759},[710,1092,762],{"class":720},[710,1094,765],{"class":716},[710,1096,721],{"class":720},[710,1098,793],{"class":736},[710,1100,1101,1103,1105,1107],{"class":712,"line":773},[710,1102,799],{"class":716},[710,1104,721],{"class":720},[710,1106,805],{"class":804},[710,1108,809],{"class":808},[710,1110,1111],{"class":712,"line":784},[710,1112,1113],{"class":736},"      The issue of this session is a feature.\n",[710,1115,1116],{"class":712,"line":796},[710,1117,840],{"emptyLinePlaceholder":839},[710,1119,1120],{"class":712,"line":812},[710,1121,1122],{"class":736},"      Work out how it would be built in this project: the files to touch, the\n",[710,1124,1125],{"class":712,"line":818},[710,1126,1127],{"class":736},"      steps in order, and what is open.\n",[710,1129,1130],{"class":712,"line":824},[710,1131,840],{"emptyLinePlaceholder":839},[710,1133,1134],{"class":712,"line":830},[710,1135,1136],{"class":736},"      Do not change any files or the status. Just post the plan as a comment,\n",[710,1138,1139],{"class":712,"line":836},[710,1140,1141],{"class":736},"      written for the person who created the issue.\n",[710,1143,1144,1146,1148],{"class":712,"line":843},[710,1145,776],{"class":716},[710,1147,721],{"class":720},[710,1149,1150],{"class":736}," plan_feature\n",[710,1152,1153,1155,1157],{"class":712,"line":849},[710,1154,868],{"class":716},[710,1156,721],{"class":720},[710,1158,1159],{"class":736}," Plan Feature\n",[96,1161,1162],{},"When the team agrees with the plan, a comment that mentions the Knecht account, such as \"implement it and open a PR\", is enough. Knecht continues in the same session and answers with the pull request.",[658,1164,1165],{},[96,1166,1167],{},"An issue that a person labels and moves to \"Todo\" without the triage having seen it starts these workflows without a booted site. Add a boot step to them if that happens in your team.",[111,1169,1171],{"id":1170},"urgent-bugs-to-knecht","Urgent Bugs to Knecht",[96,1173,1174],{},"No triage: the team assigns an issue to the Knecht account like to any colleague, and Knecht implements it. The conditions keep it to urgent bugs, everything else assigned to Knecht stays untouched. This workflow stands on its own, so it boots the site itself.",[243,1176,1177,1187],{},[246,1178,1179],{},[249,1180,1181,1183,1185],{},[252,1182,680],{},[252,1184,683],{},[252,1186,686],{},[259,1188,1189],{},[249,1190,1191,1193,1195],{},[264,1192,74],{},[264,1194,354],{},[264,1196,904,1197,1199,1200],{},[146,1198,644],{}," and Priority is ",[146,1201,469],{},[699,1203,1205],{"filename":1204},"linear-assigned-issue.yaml",[604,1206,1208],{"className":704,"code":1207,"language":706,"meta":612,"style":612},"version: 1\nname: Linear Assigned Issue\ndescription: Implement an issue that was assigned to Knecht.\nsteps:\n  - type: ddev-start\n    id: boot_project\n    label: Boot the Site\n  - type: ai\n    prompt: The issue of this session was assigned to you. Read it with its\n      comments, implement it on a work branch, verify it on the preview, commit,\n      and open a pull request. Comment a short summary on the issue and move it\n      to \"In Review\".\n    id: implement\n    label: Implement\n",[146,1209,1210,1218,1227,1236,1242,1252,1260,1269,1279,1288,1293,1298,1303,1312],{"__ignoreMap":612},[710,1211,1212,1214,1216],{"class":712,"line":713},[710,1213,717],{"class":716},[710,1215,721],{"class":720},[710,1217,725],{"class":724},[710,1219,1220,1222,1224],{"class":712,"line":728},[710,1221,731],{"class":716},[710,1223,721],{"class":720},[710,1225,1226],{"class":736}," Linear Assigned Issue\n",[710,1228,1229,1231,1233],{"class":712,"line":740},[710,1230,743],{"class":716},[710,1232,721],{"class":720},[710,1234,1235],{"class":736}," Implement an issue that was assigned to Knecht.\n",[710,1237,1238,1240],{"class":712,"line":751},[710,1239,107],{"class":716},[710,1241,756],{"class":720},[710,1243,1244,1246,1248,1250],{"class":712,"line":759},[710,1245,762],{"class":720},[710,1247,765],{"class":716},[710,1249,721],{"class":720},[710,1251,770],{"class":736},[710,1253,1254,1256,1258],{"class":712,"line":773},[710,1255,776],{"class":716},[710,1257,721],{"class":720},[710,1259,781],{"class":736},[710,1261,1262,1264,1266],{"class":712,"line":784},[710,1263,868],{"class":716},[710,1265,721],{"class":720},[710,1267,1268],{"class":736}," Boot the Site\n",[710,1270,1271,1273,1275,1277],{"class":712,"line":796},[710,1272,762],{"class":720},[710,1274,765],{"class":716},[710,1276,721],{"class":720},[710,1278,793],{"class":736},[710,1280,1281,1283,1285],{"class":712,"line":812},[710,1282,799],{"class":716},[710,1284,721],{"class":720},[710,1286,1287],{"class":736}," The issue of this session was assigned to you. Read it with its\n",[710,1289,1290],{"class":712,"line":818},[710,1291,1292],{"class":736},"      comments, implement it on a work branch, verify it on the preview, commit,\n",[710,1294,1295],{"class":712,"line":824},[710,1296,1297],{"class":736},"      and open a pull request. Comment a short summary on the issue and move it\n",[710,1299,1300],{"class":712,"line":830},[710,1301,1302],{"class":736},"      to \"In Review\".\n",[710,1304,1305,1307,1309],{"class":712,"line":836},[710,1306,776],{"class":716},[710,1308,721],{"class":720},[710,1310,1311],{"class":736}," implement\n",[710,1313,1314,1316,1318],{"class":712,"line":843},[710,1315,868],{"class":716},[710,1317,721],{"class":720},[710,1319,1320],{"class":736}," Implement\n",[111,1322,1324],{"id":1323},"estimate-the-triage-inbox","Estimate the Triage Inbox",[96,1326,1327],{},"With Triage switched on for a team, issues from other tools and from people outside the team land in the Triage status first. This workflow gives each of them an estimate and moves it to \"Backlog\". A new issue is created in Triage and does not move there, so the trigger fires on \"Created\" with a condition on the status instead of on \"Status reached\". The agent reads the issue, looks up the code it touches, and comments how big the work is and why. An estimate needs the code, not the running site, so there is no boot step.",[243,1329,1330,1340],{},[246,1331,1332],{},[249,1333,1334,1336,1338],{},[252,1335,680],{},[252,1337,683],{},[252,1339,686],{},[259,1341,1342],{},[249,1343,1344,1346,1348],{},[264,1345,74],{},[264,1347,344],{},[264,1349,1350],{},"Status is Any Triage",[699,1352,1354],{"filename":1353},"linear-estimate-issue.yaml",[604,1355,1357],{"className":704,"code":1356,"language":706,"meta":612,"style":612},"version: 1\nname: Linear Estimate Issue\ndescription: Estimate an issue in triage and move it to Backlog.\nsteps:\n  - type: ai\n    prompt: 'Estimate the issue of this session. Find the code it touches and judge\n      the effort. Do not change any files. Comment the estimate on the issue: a\n      size (S, M, L, or XL), the hours you expect, what drives the effort, and\n      what is unclear. Then move the issue to \"Backlog\". If it is too vague to\n      estimate, comment your questions and leave it where it is.'\n    id: estimate\n    label: Estimate\n",[146,1358,1359,1367,1376,1385,1391,1401,1413,1418,1423,1428,1436,1445],{"__ignoreMap":612},[710,1360,1361,1363,1365],{"class":712,"line":713},[710,1362,717],{"class":716},[710,1364,721],{"class":720},[710,1366,725],{"class":724},[710,1368,1369,1371,1373],{"class":712,"line":728},[710,1370,731],{"class":716},[710,1372,721],{"class":720},[710,1374,1375],{"class":736}," Linear Estimate Issue\n",[710,1377,1378,1380,1382],{"class":712,"line":740},[710,1379,743],{"class":716},[710,1381,721],{"class":720},[710,1383,1384],{"class":736}," Estimate an issue in triage and move it to Backlog.\n",[710,1386,1387,1389],{"class":712,"line":751},[710,1388,107],{"class":716},[710,1390,756],{"class":720},[710,1392,1393,1395,1397,1399],{"class":712,"line":759},[710,1394,762],{"class":720},[710,1396,765],{"class":716},[710,1398,721],{"class":720},[710,1400,793],{"class":736},[710,1402,1403,1405,1407,1410],{"class":712,"line":773},[710,1404,799],{"class":716},[710,1406,721],{"class":720},[710,1408,1409],{"class":720}," '",[710,1411,1412],{"class":736},"Estimate the issue of this session. Find the code it touches and judge\n",[710,1414,1415],{"class":712,"line":784},[710,1416,1417],{"class":736},"      the effort. Do not change any files. Comment the estimate on the issue: a\n",[710,1419,1420],{"class":712,"line":796},[710,1421,1422],{"class":736},"      size (S, M, L, or XL), the hours you expect, what drives the effort, and\n",[710,1424,1425],{"class":712,"line":812},[710,1426,1427],{"class":736},"      what is unclear. Then move the issue to \"Backlog\". If it is too vague to\n",[710,1429,1430,1433],{"class":712,"line":818},[710,1431,1432],{"class":736},"      estimate, comment your questions and leave it where it is.",[710,1434,1435],{"class":720},"'\n",[710,1437,1438,1440,1442],{"class":712,"line":824},[710,1439,776],{"class":716},[710,1441,721],{"class":720},[710,1443,1444],{"class":736}," estimate\n",[710,1446,1447,1449,1451],{"class":712,"line":830},[710,1448,868],{"class":716},[710,1450,721],{"class":720},[710,1452,1453],{"class":736}," Estimate\n",[1455,1456,1457],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":612,"searchDepth":728,"depth":728,"links":1459},[1460,1467,1473],{"id":102,"depth":728,"text":27,"children":1461},[1462,1463,1464,1465,1466],{"id":113,"depth":740,"text":114},{"id":152,"depth":740,"text":153},{"id":168,"depth":740,"text":169},{"id":230,"depth":740,"text":231},{"id":237,"depth":740,"text":238},{"id":296,"depth":728,"text":297,"children":1468},[1469,1470,1471,1472],{"id":300,"depth":740,"text":49},{"id":543,"depth":740,"text":544},{"id":555,"depth":740,"text":556},{"id":598,"depth":740,"text":599},{"id":630,"depth":728,"text":631,"children":1474},[1475,1476,1477],{"id":637,"depth":740,"text":638},{"id":1170,"depth":740,"text":1171},{"id":1323,"depth":740,"text":1324},"Everything you need to know about the Linear integration. What it can do and how to set it up.","md",{},{"title":74,"description":1478},"8YejPUaiNQIhPDaaZf2m6QNdbJQzgMltv4NCmwBwzAQ",[1484,1486],{"title":70,"path":71,"stem":72,"description":1485,"children":-1},"Everything you need to know about the Plane integration. What it can do and how to set it up.",{"title":83,"path":84,"stem":85,"description":1487,"children":-1},"How to get your instance, set it up, and redeem your OpenCode credit.",1790265016580]