@cursor/july 0.1.111 → 0.1.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/dist/bin/agent-serve.js +18 -1
  2. package/dist/channels/github/github-channel.d.ts +29 -19
  3. package/dist/channels/github/github-channel.d.ts.map +1 -1
  4. package/dist/channels/github/github-channel.js +29 -19
  5. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  6. package/dist/channels/slack/agentic-delivery.js +2 -0
  7. package/dist/channels/slack/dispatch.d.ts +11 -1
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +142 -39
  10. package/dist/channels/slack/placeholder.d.ts +26 -0
  11. package/dist/channels/slack/placeholder.d.ts.map +1 -1
  12. package/dist/channels/slack/placeholder.js +28 -0
  13. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  14. package/dist/channels/slack/slack-channel.js +9 -16
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/assets/{app.Drol6mi6.js → app.DxTdhphC.js} +4 -4
  17. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.js +9 -0
  18. package/dist/docs/assets/building-with-agents.md.BBCx0AUo.lean.js +1 -0
  19. package/dist/docs/assets/chunks/@localSearchIndexroot.QmjDU6Jh.js +1 -0
  20. package/dist/docs/assets/chunks/{VPLocalSearchBox.CdqoBZJX.js → VPLocalSearchBox.CR3KTF0X.js} +1 -1
  21. package/dist/docs/assets/chunks/{arc.BVX3ycTn.js → arc.CVVqBOdS.js} +1 -1
  22. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CcChnMxX.js → architectureDiagram-Q4EWVU46.CJHGP4ki.js} +1 -1
  23. package/dist/docs/assets/chunks/{baseUniq.xwtXO-yt.js → baseUniq.r7UVVRBP.js} +1 -1
  24. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.CijZ_taK.js → blockDiagram-DXYQGD6D.DKmMaTre.js} +1 -1
  25. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.0FBvwBvK.js → c4Diagram-AHTNJAMY.DDJsntUO.js} +1 -1
  26. package/dist/docs/assets/chunks/channel.BjpoSbz_.js +1 -0
  27. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CELMmMDA.js → chunk-4BX2VUAB.BK2rKt6W.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C4bhFtSm.js → chunk-4TB4RGXK.DRLV8RnF.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-55IACEB6.ZnQ9gRRQ.js → chunk-55IACEB6.DaKjxtb7.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DPlmglG-.js → chunk-EDXVE4YY.C5sPCIT1.js} +1 -1
  31. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.BrUk8pff.js → chunk-FMBD7UC4.CSGWyNTB.js} +1 -1
  32. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CcmWIncu.js → chunk-OYMX7WX6.D5tK9XEr.js} +1 -1
  33. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D65-cs8I.js → chunk-QZHKN3VN.BeZGd1UZ.js} +1 -1
  34. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.qoXZpG9F.js → chunk-YZCP3GAM.U_tfWwQR.js} +1 -1
  35. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.BgxOlMHw.js +1 -0
  36. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.BgxOlMHw.js +1 -0
  37. package/dist/docs/assets/chunks/clone.DRuGBKZC.js +1 -0
  38. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.8rYtqudO.js → cose-bilkent-S5V4N54A.DVeRXIb6.js} +1 -1
  39. package/dist/docs/assets/chunks/{dagre-KV5264BT.DrRP1fOh.js → dagre-KV5264BT.BpKJAeRZ.js} +1 -1
  40. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DHj_xA2_.js → diagram-5BDNPKRD.BQOtrd1Z.js} +1 -1
  41. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Bz_6nAKj.js → diagram-G4DWMVQ6.CSDAhjPI.js} +1 -1
  42. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BWA0xSW9.js → diagram-MMDJMWI5.Dpztst2S.js} +1 -1
  43. package/dist/docs/assets/chunks/{diagram-TYMM5635.CpTJLNJI.js → diagram-TYMM5635.qJHRizHR.js} +1 -1
  44. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.-7AWWSrP.js → erDiagram-SMLLAGMA.vbDotH3l.js} +1 -1
  45. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BTnQ742_.js → flowDiagram-DWJPFMVM.CqS_ZQr4.js} +1 -1
  46. package/dist/docs/assets/chunks/framework.BNw1pucY.js +19 -0
  47. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B5_HiiQ5.js → ganttDiagram-T4ZO3ILL.DTLdR4pN.js} +1 -1
  48. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CZcNTFZd.js → gitGraphDiagram-UUTBAWPF.D04lnbnr.js} +1 -1
  49. package/dist/docs/assets/chunks/{graph.V2GLaab4.js → graph.BlfqLJsM.js} +1 -1
  50. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.7pZOkCCU.js → infoDiagram-42DDH7IO.tAooImWA.js} +1 -1
  51. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js → ishikawaDiagram-UXIWVN3A.ClUsVqnJ.js} +1 -1
  52. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BNEgWN1S.js → journeyDiagram-VCZTEJTY.C3tUgyCg.js} +1 -1
  53. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B-4d4tC7.js → kanban-definition-6JOO6SKY.CtD9-QCe.js} +1 -1
  54. package/dist/docs/assets/chunks/{layout.Dvbn9nSb.js → layout.D38U-LnT.js} +1 -1
  55. package/dist/docs/assets/chunks/{linear.D2GM4p4b.js → linear.BJmssyhN.js} +1 -1
  56. package/dist/docs/assets/chunks/{min.DVBtLK-B.js → min.DNgXoouU.js} +1 -1
  57. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CnJRI55x.js → mindmap-definition-QFDTVHPH.Dcp6cxeu.js} +1 -1
  58. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.CtoaTFlA.js → pieDiagram-DEJITSTG.CLDw6zIs.js} +1 -1
  59. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DtT24_vN.js → quadrantDiagram-34T5L4WZ.CYaeeY4c.js} +1 -1
  60. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CjSO4o8f.js → requirementDiagram-MS252O5E.gMYuRpq2.js} +1 -1
  61. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.-wWiIVWa.js → sankeyDiagram-XADWPNL6.CZqyHFbc.js} +1 -1
  62. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.DSk8s4gX.js → sequenceDiagram-FGHM5R23.BTsCjUDN.js} +1 -1
  63. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BFKAsdkN.js → stateDiagram-FHFEXIEX.CftT9mLJ.js} +1 -1
  64. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.-43J68xB.js +1 -0
  65. package/dist/docs/assets/chunks/{theme.C0MctGaz.js → theme.B_7J9ZsV.js} +2 -2
  66. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.TUNJbAFe.js → timeline-definition-GMOUNBTQ.DbU3WUNw.js} +1 -1
  67. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.C-RGNnk4.js → vennDiagram-DHZGUBPP.ixsq-q2u.js} +1 -1
  68. package/dist/docs/assets/chunks/wardley-RL74JXVD.WRXz-Dux.js +162 -0
  69. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.DH4zt73Y.js → wardleyDiagram-NUSXRM2D.C0ewvgbp.js} +1 -1
  70. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.B-3k6bF6.js → xychartDiagram-5P7HB3ND.nAEhF4bO.js} +1 -1
  71. package/dist/docs/assets/deployment.md.D2jQZuFx.js +32 -0
  72. package/dist/docs/assets/deployment.md.D2jQZuFx.lean.js +1 -0
  73. package/dist/docs/assets/evals.md.BYvfZ-PO.js +72 -0
  74. package/dist/docs/assets/evals.md.BYvfZ-PO.lean.js +1 -0
  75. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.js +30 -0
  76. package/dist/docs/assets/guides_agent-to-agent.md.8oDTfu-E.lean.js +1 -0
  77. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.js +145 -0
  78. package/dist/docs/assets/guides_bitbucket.md.mpevW-VP.lean.js +1 -0
  79. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.js +15 -0
  80. package/dist/docs/assets/guides_cloud-agents.md.Cp1O3u-X.lean.js +1 -0
  81. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.js +43 -0
  82. package/dist/docs/assets/guides_convert-automation.md.CqEyfP6Y.lean.js +1 -0
  83. package/dist/docs/assets/guides_github.md.BwpBp3ed.js +156 -0
  84. package/dist/docs/assets/guides_github.md.BwpBp3ed.lean.js +1 -0
  85. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.js +153 -0
  86. package/dist/docs/assets/guides_gitlab.md.DaEC3nMk.lean.js +1 -0
  87. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.js +16 -0
  88. package/dist/docs/assets/guides_grokbot-agents.md.CMhZNdEU.lean.js +1 -0
  89. package/dist/docs/assets/guides_improve.md.Bnp4F99w.js +22 -0
  90. package/dist/docs/assets/guides_improve.md.Bnp4F99w.lean.js +1 -0
  91. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.js +50 -0
  92. package/dist/docs/assets/guides_mcp-oauth.md.bSFakfCY.lean.js +1 -0
  93. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.js +35 -0
  94. package/dist/docs/assets/guides_opentelemetry.md.BKDxQmmd.lean.js +1 -0
  95. package/dist/docs/assets/guides_slack.md.Bo96y42E.js +70 -0
  96. package/dist/docs/assets/guides_slack.md.Bo96y42E.lean.js +1 -0
  97. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.js +92 -0
  98. package/dist/docs/assets/guides_webhooks.md.1A72_VEE.lean.js +1 -0
  99. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.js +7 -0
  100. package/dist/docs/assets/hillclimbing.md.D4E1o5Sa.lean.js +1 -0
  101. package/dist/docs/assets/{index.md.BFVyY2KT.js → index.md.C-t81M5J.js} +2 -2
  102. package/dist/docs/assets/{index.md.BFVyY2KT.lean.js → index.md.C-t81M5J.lean.js} +1 -1
  103. package/dist/docs/assets/{quickstart.md.D3MjSZN-.js → quickstart.md.DAvVhuuU.js} +1 -1
  104. package/dist/docs/assets/{quickstart.md.D3MjSZN-.lean.js → quickstart.md.DAvVhuuU.lean.js} +1 -1
  105. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.js → reference_agent-config.md.DGPyw7ms.js} +1 -1
  106. package/dist/docs/assets/{reference_agent-config.md.CfVA-LZJ.lean.js → reference_agent-config.md.DGPyw7ms.lean.js} +1 -1
  107. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.js → reference_artifacts.md.Bu_4HmsD.js} +1 -1
  108. package/dist/docs/assets/{reference_artifacts.md.Vf7qyIZ-.lean.js → reference_artifacts.md.Bu_4HmsD.lean.js} +1 -1
  109. package/dist/docs/assets/{reference_channels.md.icqLKcTc.js → reference_channels.md.nFWbzAic.js} +1 -1
  110. package/dist/docs/assets/{reference_channels.md.icqLKcTc.lean.js → reference_channels.md.nFWbzAic.lean.js} +1 -1
  111. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.js → reference_cli.md.DLWDz9ij.js} +3 -1
  112. package/dist/docs/assets/{reference_cli.md.B2dBL6L8.lean.js → reference_cli.md.DLWDz9ij.lean.js} +1 -1
  113. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.js → reference_connections.md.CmyrlXfY.js} +1 -1
  114. package/dist/docs/assets/{reference_connections.md.Cb3U_c8n.lean.js → reference_connections.md.CmyrlXfY.lean.js} +1 -1
  115. package/dist/docs/assets/reference_evals.md.DNJzM_yf.js +57 -0
  116. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +1 -0
  117. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.js +58 -0
  118. package/dist/docs/assets/reference_extensions.md.Ceq-qT8d.lean.js +1 -0
  119. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.js → reference_hooks.md.B7uzNENk.js} +2 -2
  120. package/dist/docs/assets/{reference_hooks.md.CZuynAxj.lean.js → reference_hooks.md.B7uzNENk.lean.js} +1 -1
  121. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.js → reference_http-api.md.CduHavZ2.js} +1 -1
  122. package/dist/docs/assets/{reference_http-api.md.DTKcYE6L.lean.js → reference_http-api.md.CduHavZ2.lean.js} +1 -1
  123. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.js → reference_instructions.md.CU1My5My.js} +1 -1
  124. package/dist/docs/assets/{reference_instructions.md.D7gkckK-.lean.js → reference_instructions.md.CU1My5My.lean.js} +1 -1
  125. package/dist/docs/assets/{reference_playground.md.D2YExv5K.js → reference_playground.md.Ch2d0Iqi.js} +1 -1
  126. package/dist/docs/assets/{reference_playground.md.D2YExv5K.lean.js → reference_playground.md.Ch2d0Iqi.lean.js} +1 -1
  127. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.js → reference_project-layout.md.BGhgpy9V.js} +1 -1
  128. package/dist/docs/assets/{reference_project-layout.md.DPxbUJyt.lean.js → reference_project-layout.md.BGhgpy9V.lean.js} +1 -1
  129. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.js → reference_prompt.md.Ccp0R53H.js} +1 -1
  130. package/dist/docs/assets/{reference_prompt.md.BQ5uAv1F.lean.js → reference_prompt.md.Ccp0R53H.lean.js} +1 -1
  131. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.js → reference_schedules.md.B2Nm6FaD.js} +1 -1
  132. package/dist/docs/assets/{reference_schedules.md.BasfZWO-.lean.js → reference_schedules.md.B2Nm6FaD.lean.js} +1 -1
  133. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.js → reference_sessions.md.1_6Vyv7x.js} +1 -1
  134. package/dist/docs/assets/{reference_sessions.md.YKvIsWAx.lean.js → reference_sessions.md.1_6Vyv7x.lean.js} +1 -1
  135. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.js → reference_skills.md.DjQkRefx.js} +1 -1
  136. package/dist/docs/assets/{reference_skills.md.rNgpsGd0.lean.js → reference_skills.md.DjQkRefx.lean.js} +1 -1
  137. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.js → reference_subagents.md.BHsSMMyO.js} +1 -1
  138. package/dist/docs/assets/{reference_subagents.md.e5qitjJt.lean.js → reference_subagents.md.BHsSMMyO.lean.js} +1 -1
  139. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.js → reference_tools.md.BYzUTeVA.js} +1 -1
  140. package/dist/docs/assets/{reference_tools.md.BdCO2aHZ.lean.js → reference_tools.md.BYzUTeVA.lean.js} +1 -1
  141. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.js → templates_agentic-owners.md.9M575F5C.js} +1 -1
  142. package/dist/docs/assets/{templates_agentic-owners.md.Da_AGDlH.lean.js → templates_agentic-owners.md.9M575F5C.lean.js} +1 -1
  143. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.js → templates_pr-autofixer.md.ws0DDXDy.js} +1 -1
  144. package/dist/docs/assets/{templates_pr-autofixer.md.DqxocIGh.lean.js → templates_pr-autofixer.md.ws0DDXDy.lean.js} +1 -1
  145. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.js → templates_security-reviewer.md.KEFYXzfK.js} +1 -1
  146. package/dist/docs/assets/{templates_security-reviewer.md.Bhnvd8VE.lean.js → templates_security-reviewer.md.KEFYXzfK.lean.js} +1 -1
  147. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.js +3 -0
  148. package/dist/docs/assets/templates_thermo-quality-review.md.VNJ_mohX.lean.js +1 -0
  149. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.js +3 -0
  150. package/dist/docs/assets/templates_thermo-review.md.Hi3zWOkP.lean.js +1 -0
  151. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.js → templates_triage.md.CVGe_FG6.js} +1 -1
  152. package/dist/docs/assets/{templates_triage.md.BdBWO9Ic.lean.js → templates_triage.md.CVGe_FG6.lean.js} +1 -1
  153. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +1 -0
  154. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.lean.js +1 -0
  155. package/dist/docs/building-with-agents.html +44 -48
  156. package/dist/docs/building-with-agents.md +94 -82
  157. package/dist/docs/deployment.html +59 -78
  158. package/dist/docs/deployment.md +117 -363
  159. package/dist/docs/evals.html +85 -224
  160. package/dist/docs/evals.md +146 -673
  161. package/dist/docs/guides/agent-to-agent.html +58 -42
  162. package/dist/docs/guides/agent-to-agent.md +112 -35
  163. package/dist/docs/guides/bitbucket.html +179 -44
  164. package/dist/docs/guides/bitbucket.md +249 -48
  165. package/dist/docs/guides/cloud-agents.html +46 -40
  166. package/dist/docs/guides/cloud-agents.md +119 -66
  167. package/dist/docs/guides/convert-automation.html +80 -49
  168. package/dist/docs/guides/convert-automation.md +156 -147
  169. package/dist/docs/guides/github.html +184 -92
  170. package/dist/docs/guides/github.md +260 -245
  171. package/dist/docs/guides/gitlab.html +184 -45
  172. package/dist/docs/guides/gitlab.md +249 -50
  173. package/dist/docs/guides/grokbot-agents.html +48 -41
  174. package/dist/docs/guides/grokbot-agents.md +99 -53
  175. package/dist/docs/guides/improve.html +48 -40
  176. package/dist/docs/guides/improve.md +111 -58
  177. package/dist/docs/guides/mcp-oauth.html +74 -52
  178. package/dist/docs/guides/mcp-oauth.md +111 -121
  179. package/dist/docs/guides/opentelemetry.html +63 -54
  180. package/dist/docs/guides/opentelemetry.md +96 -165
  181. package/dist/docs/guides/slack.html +83 -59
  182. package/dist/docs/guides/slack.md +157 -227
  183. package/dist/docs/guides/webhooks.html +97 -230
  184. package/dist/docs/guides/webhooks.md +154 -385
  185. package/dist/docs/hashmap.json +1 -1
  186. package/dist/docs/hillclimbing.html +44 -38
  187. package/dist/docs/hillclimbing.md +101 -55
  188. package/dist/docs/index.html +38 -38
  189. package/dist/docs/index.md +2 -0
  190. package/dist/docs/llms-full.txt +3082 -3104
  191. package/dist/docs/llms.txt +21 -18
  192. package/dist/docs/quickstart.html +37 -37
  193. package/dist/docs/reference/agent-config.html +37 -37
  194. package/dist/docs/reference/artifacts.html +38 -38
  195. package/dist/docs/reference/channels.html +37 -37
  196. package/dist/docs/reference/cli.html +39 -37
  197. package/dist/docs/reference/cli.md +2 -0
  198. package/dist/docs/reference/connections.html +37 -37
  199. package/dist/docs/reference/evals.html +116 -0
  200. package/dist/docs/reference/evals.md +293 -0
  201. package/dist/docs/reference/extensions.html +80 -84
  202. package/dist/docs/reference/extensions.md +127 -199
  203. package/dist/docs/reference/hooks.html +39 -39
  204. package/dist/docs/reference/hooks.md +34 -34
  205. package/dist/docs/reference/http-api.html +37 -37
  206. package/dist/docs/reference/instructions.html +37 -37
  207. package/dist/docs/reference/playground.html +37 -37
  208. package/dist/docs/reference/project-layout.html +37 -37
  209. package/dist/docs/reference/prompt.html +37 -37
  210. package/dist/docs/reference/schedules.html +37 -37
  211. package/dist/docs/reference/sessions.html +37 -37
  212. package/dist/docs/reference/skills.html +37 -37
  213. package/dist/docs/reference/subagents.html +37 -37
  214. package/dist/docs/reference/tools.html +37 -37
  215. package/dist/docs/templates/agentic-owners.html +38 -38
  216. package/dist/docs/templates/pr-autofixer.html +37 -37
  217. package/dist/docs/templates/security-reviewer.html +38 -38
  218. package/dist/docs/templates/thermo-quality-review.html +62 -0
  219. package/dist/docs/templates/thermo-quality-review.md +75 -0
  220. package/dist/docs/templates/thermo-review.html +62 -0
  221. package/dist/docs/templates/thermo-review.md +74 -0
  222. package/dist/docs/templates/triage.html +37 -37
  223. package/dist/docs/troubleshooting.html +38 -38
  224. package/dist/docs/troubleshooting.md +97 -66
  225. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  226. package/dist/extensions/improve/extension.d.ts +3 -1
  227. package/dist/extensions/improve/extension.d.ts.map +1 -1
  228. package/dist/extensions/improve/extension.js +4 -2
  229. package/dist/extensions/improve/skills/yourself.js +1 -1
  230. package/dist/filesystem.d.ts +46 -2
  231. package/dist/filesystem.d.ts.map +1 -1
  232. package/dist/filesystem.js +149 -102
  233. package/dist/index.d.ts +2 -2
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +1 -1
  236. package/dist/internal/cli-ax.d.ts +6 -0
  237. package/dist/internal/cli-ax.d.ts.map +1 -1
  238. package/dist/internal/cli-ax.js +72 -14
  239. package/dist/internal/continuation-identity.d.ts.map +1 -1
  240. package/dist/internal/continuation-identity.js +1 -0
  241. package/dist/internal/cursor-agent-template.d.ts +1 -1
  242. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  243. package/dist/internal/cursor-agent-template.js +2 -0
  244. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  245. package/dist/internal/filesystem/tools.js +2 -2
  246. package/dist/internal/filesystem/walk.d.ts +7 -4
  247. package/dist/internal/filesystem/walk.d.ts.map +1 -1
  248. package/dist/internal/filesystem/walk.js +34 -11
  249. package/dist/internal/hosted-admission-adapter.d.ts +3 -0
  250. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  251. package/dist/internal/hosted-delivery-protocol.d.ts +17 -0
  252. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  253. package/dist/internal/hosted-delivery-protocol.js +50 -1
  254. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  255. package/dist/internal/hosted-delivery.js +8 -0
  256. package/dist/internal/init-project.d.ts.map +1 -1
  257. package/dist/internal/init-project.js +4 -0
  258. package/dist/internal/server.d.ts.map +1 -1
  259. package/dist/internal/server.js +94 -39
  260. package/dist/internal/session-engine.d.ts.map +1 -1
  261. package/dist/internal/session-engine.js +11 -5
  262. package/dist/internal/skill-catalog.d.ts +28 -0
  263. package/dist/internal/skill-catalog.d.ts.map +1 -0
  264. package/dist/internal/skill-catalog.js +44 -0
  265. package/dist/playground/assets/index-B1c1LeIf.js +67 -0
  266. package/dist/playground/assets/index-CK2LX3iD.css +1 -0
  267. package/dist/playground/index.html +2 -2
  268. package/dist/types.d.ts +9 -0
  269. package/dist/types.d.ts.map +1 -1
  270. package/docs/README.md +2 -0
  271. package/docs/building-with-agents.md +96 -84
  272. package/docs/deployment.md +118 -364
  273. package/docs/evals.md +147 -674
  274. package/docs/guides/agent-to-agent.md +113 -36
  275. package/docs/guides/bitbucket.md +250 -49
  276. package/docs/guides/cloud-agents.md +119 -67
  277. package/docs/guides/convert-automation.md +157 -148
  278. package/docs/guides/github.md +261 -246
  279. package/docs/guides/gitlab.md +250 -51
  280. package/docs/guides/grokbot-agents.md +100 -55
  281. package/docs/guides/improve.md +112 -59
  282. package/docs/guides/mcp-oauth.md +112 -122
  283. package/docs/guides/opentelemetry.md +97 -166
  284. package/docs/guides/slack.md +158 -228
  285. package/docs/guides/webhooks.md +155 -386
  286. package/docs/hillclimbing.md +102 -56
  287. package/docs/reference/cli.md +2 -0
  288. package/docs/reference/evals.md +298 -0
  289. package/docs/reference/extensions.md +128 -200
  290. package/docs/reference/hooks.md +34 -34
  291. package/docs/templates/thermo-quality-review.md +80 -0
  292. package/docs/templates/thermo-review.md +79 -0
  293. package/docs/troubleshooting.md +98 -67
  294. package/package.json +1 -1
  295. package/skills/github/SKILL.md +21 -13
  296. package/src/bin/agent-serve.ts +22 -0
  297. package/src/channels/github/github-channel.ts +29 -19
  298. package/src/channels/slack/agentic-delivery.ts +2 -0
  299. package/src/channels/slack/dispatch.ts +126 -4
  300. package/src/channels/slack/placeholder.ts +51 -0
  301. package/src/channels/slack/slack-channel.ts +9 -2
  302. package/src/extensions/cursor-cloud-agents/skills/handoff.md +3 -7
  303. package/src/extensions/improve/extension.ts +4 -2
  304. package/src/extensions/improve/skills/yourself.ts +1 -1
  305. package/src/filesystem.ts +168 -65
  306. package/src/index.ts +3 -0
  307. package/src/internal/cli-ax.ts +88 -15
  308. package/src/internal/continuation-identity.ts +1 -0
  309. package/src/internal/cursor-agent-template.ts +2 -0
  310. package/src/internal/filesystem/tools.ts +2 -0
  311. package/src/internal/filesystem/walk.ts +60 -15
  312. package/src/internal/hosted-admission-adapter.ts +3 -0
  313. package/src/internal/hosted-delivery-protocol.ts +78 -1
  314. package/src/internal/hosted-delivery.ts +8 -0
  315. package/src/internal/init-project.ts +4 -0
  316. package/src/internal/server.ts +104 -41
  317. package/src/internal/session-engine.ts +16 -4
  318. package/src/internal/skill-catalog.ts +69 -0
  319. package/src/types.ts +9 -0
  320. package/templates/thermo-quality-review/README.md +35 -0
  321. package/templates/thermo-quality-review/agent/agent.ts +8 -0
  322. package/templates/thermo-quality-review/agent/channels/github.ts +42 -0
  323. package/templates/thermo-quality-review/agent/instructions.md +43 -0
  324. package/templates/thermo-quality-review/agent/tools/post_findings.ts +70 -0
  325. package/templates/thermo-quality-review/evals/evals.config.ts +5 -0
  326. package/templates/thermo-quality-review/evals/review.eval.ts +62 -0
  327. package/templates/thermo-quality-review/package.json +18 -0
  328. package/templates/thermo-quality-review/tsconfig.json +12 -0
  329. package/templates/thermo-review/README.md +35 -0
  330. package/templates/thermo-review/agent/agent.ts +8 -0
  331. package/templates/thermo-review/agent/channels/github.ts +42 -0
  332. package/templates/thermo-review/agent/instructions.md +40 -0
  333. package/templates/thermo-review/agent/tools/post_findings.ts +70 -0
  334. package/templates/thermo-review/evals/evals.config.ts +5 -0
  335. package/templates/thermo-review/evals/review.eval.ts +53 -0
  336. package/templates/thermo-review/package.json +18 -0
  337. package/templates/thermo-review/tsconfig.json +12 -0
  338. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.js +0 -13
  339. package/dist/docs/assets/building-with-agents.md.CEGVXkmO.lean.js +0 -1
  340. package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +0 -1
  341. package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +0 -1
  342. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +0 -1
  343. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +0 -1
  344. package/dist/docs/assets/chunks/clone.YSt_40_s.js +0 -1
  345. package/dist/docs/assets/chunks/framework.dypDpWZ3.js +0 -19
  346. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +0 -1
  347. package/dist/docs/assets/chunks/wardley-RL74JXVD.g5efOWmT.js +0 -162
  348. package/dist/docs/assets/deployment.md.Dm4Qo3hp.js +0 -51
  349. package/dist/docs/assets/deployment.md.Dm4Qo3hp.lean.js +0 -1
  350. package/dist/docs/assets/evals.md.BLDRt5LH.js +0 -211
  351. package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +0 -1
  352. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +0 -14
  353. package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +0 -1
  354. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +0 -10
  355. package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +0 -1
  356. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.js +0 -9
  357. package/dist/docs/assets/guides_cloud-agents.md.lSE_l7lH.lean.js +0 -1
  358. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.js +0 -12
  359. package/dist/docs/assets/guides_convert-automation.md.Ck6Cr68A.lean.js +0 -1
  360. package/dist/docs/assets/guides_github.md.D6ER29dG.js +0 -64
  361. package/dist/docs/assets/guides_github.md.D6ER29dG.lean.js +0 -1
  362. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +0 -14
  363. package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +0 -1
  364. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +0 -9
  365. package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.lean.js +0 -1
  366. package/dist/docs/assets/guides_improve.md.BKaDuKKK.js +0 -14
  367. package/dist/docs/assets/guides_improve.md.BKaDuKKK.lean.js +0 -1
  368. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.js +0 -28
  369. package/dist/docs/assets/guides_mcp-oauth.md.DMNMpXtO.lean.js +0 -1
  370. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.js +0 -26
  371. package/dist/docs/assets/guides_opentelemetry.md._CRfDyzH.lean.js +0 -1
  372. package/dist/docs/assets/guides_slack.md.DdT8rmsj.js +0 -46
  373. package/dist/docs/assets/guides_slack.md.DdT8rmsj.lean.js +0 -1
  374. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.js +0 -225
  375. package/dist/docs/assets/guides_webhooks.md.aQW10HRe.lean.js +0 -1
  376. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +0 -1
  377. package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +0 -1
  378. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.js +0 -62
  379. package/dist/docs/assets/reference_extensions.md.wlFD3cUR.lean.js +0 -1
  380. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.js +0 -1
  381. package/dist/docs/assets/troubleshooting.md.BcgNoYtJ.lean.js +0 -1
  382. package/dist/playground/assets/index-BLlKgZtI.css +0 -1
  383. package/dist/playground/assets/index-CDS5p9sR.js +0 -67
@@ -1,316 +1,331 @@
1
1
  ---
2
2
  title: "GitHub"
3
- description: "Wake your agent from pull requests, CI, and comments by pulling Cursor SCM events, with fixtures and replay for local tests."
3
+ description: "Let your agent read pull requests and CI, then write back reviews, comments, and checks."
4
4
  ---
5
5
 
6
6
  # GitHub agents
7
7
 
8
- Wake your agent from repository events without exposing a public webhook
9
- URL. Prefer `serve --cursor-events`: the host long-polls Cursor's SCM
10
- event stream for repos you've connected to Cursor. You still declare a
11
- `githubChannel` so hooks decide what each event does.
8
+ GitHub agents work both directions. They wake from repo events, read the
9
+ latest PR and CI state, then write back reviews, comments, checks, or
10
+ pushes. Pull events from Cursor, so you don't expose a public webhook
11
+ URL.
12
12
 
13
- The companion skill for coding agents is
14
- [`skills/github/SKILL.md`](../../skills/github/SKILL.md).
13
+ Connect GitHub in Cursor for the repos you care about (Settings or
14
+ [cursor.com/dashboard](https://cursor.com/dashboard)). Sign the host in
15
+ with `agent-sdk login`. `cursorAccount` reuses that connection for
16
+ events and API calls. You don't set up a GitHub App or a PAT.
15
17
 
16
- ## Pull events from Cursor
18
+ Start from a template when one fits:
19
+ [security reviewer](../templates/security-reviewer.md),
20
+ [PR autofixer](../templates/pr-autofixer.md), or
21
+ [issue triager](../templates/triage.md).
17
22
 
18
- Connect GitHub in Cursor for the repositories you care about (Settings or
19
- [cursor.com/dashboard](https://cursor.com/dashboard)). That gives your
20
- account access and lets Cursor receive the repo's webhooks. Sign the host
21
- in (`agent-sdk login`, `CURSOR_API_KEY`, or
22
- `CURSOR_SERVICE_ACCOUNT_KEY`), then opt the channel into the
23
- Cursor account connection:
23
+ ## Review a pull request
24
+
25
+ Wake when a PR is ready for review. Fetch the latest diff in a tool,
26
+ then post a verdict.
24
27
 
25
28
  ```ts
29
+ // agent/channels/github.ts
30
+ import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
31
+
26
32
  export default githubChannel({
27
- cursorAccount: {
28
- repos: ["owner/repo"],
29
- // permissions?: "read" | "pr-write" | "contents-write"
30
- // default "pr-write" (comments / PR writes, no contents:write)
33
+ // Skip the agent's own comments so replies don't re-trigger it.
34
+ botName: "my-agent",
35
+ cursorAccount: { repos: ["acme/checkout"] },
36
+ onPullRequest: (ctx, pr) => {
37
+ if (pr.draft) {
38
+ return null;
39
+ }
40
+ if (pr.action !== "opened" && pr.action !== "ready_for_review") {
41
+ return null;
42
+ }
43
+ // `auth` starts a model turn running as the sender.
44
+ return { auth: defaultGitHubAuth(ctx) };
31
45
  },
32
- // hooks...
33
46
  });
34
47
  ```
35
48
 
36
- `cursorAccount` starts the event relay and mints one short-lived GitHub
37
- credential scoped to those repositories. `ctx.github`, `ctx.host.github`,
38
- and child `gh` commands share it. The Agent SDK refreshes the credential before
39
- expiry. No GitHub App key, PAT, or separate `gh auth login` is needed on
40
- the host.
41
-
42
- Choose `permissions` by what the agent needs:
43
-
44
- | `permissions` | Use when |
45
- | --- | --- |
46
- | `"read"` | Inspect PRs / issues / statuses only |
47
- | `"pr-write"` (default) | Comment, review, update PR/issue metadata |
48
- | `"contents-write"` | Push code, or post merge-box checks |
49
+ ```ts
50
+ // agent/tools/submit_review.ts
51
+ import { parseGitHubPrContinuationKey } from "@cursor/july/channels/github";
52
+ import { defineTool } from "@cursor/july/tools";
53
+ import { z } from "zod";
54
+
55
+ export default defineTool({
56
+ description:
57
+ "Post the review decision on this session's pull request. Call once.",
58
+ inputSchema: z.object({
59
+ verdict: z.enum(["approve", "request_changes"]),
60
+ summary: z
61
+ .string()
62
+ .describe("One or two sentences explaining the verdict."),
63
+ }),
64
+ async execute({ verdict, summary }, ctx) {
65
+ if (ctx.session.purpose === "eval") {
66
+ return { posted: false, reason: "eval" };
67
+ }
68
+ const ref = parseGitHubPrContinuationKey(ctx.session.continuationKey ?? "");
69
+ if (ref === undefined) {
70
+ throw new Error("submit_review requires a GitHub pull request session");
71
+ }
72
+
73
+ let event: "APPROVE" | "REQUEST_CHANGES" = "REQUEST_CHANGES";
74
+ if (verdict === "approve") {
75
+ event = "APPROVE";
76
+ }
77
+ const octokit = await ctx.host.github.getOctokit();
78
+ await octokit.rest.pulls.createReview({
79
+ owner: ref.owner,
80
+ repo: ref.repo,
81
+ pull_number: ref.number,
82
+ event,
83
+ body: summary,
84
+ });
85
+ return { posted: true, pr: `${ref.owner}/${ref.repo}#${ref.number}` };
86
+ },
87
+ });
88
+ ```
49
89
 
50
- `contents-write` is an explicit opt-up. `progress.commitStatus` posts a
51
- GitHub check run (`checks:write`). Hosted `cursorAccount` mints that
52
- permission on `"contents-write"` tokens. Enabling `commitStatus` opts a
53
- `"pr-write"` channel up to that tier because it needs check-write
54
- permission. `"pr-write"` without `commitStatus` is enough for comments
55
- and banners.
56
- Prefer `"pr-write"` unless the agent must push or post a merge-box check.
90
+ The wake tells you the PR changed. Fetch title, files, and checks inside
91
+ the turn or a tool.
57
92
 
58
- Set `checks: true` when channel code posts its own Checks API runs through
59
- `ctx.github.createCheck`. The flag grants access. It does not post a check.
93
+ ## Answer a mention
60
94
 
61
- Selected repositories must share one GitHub owner (one App installation).
62
- Configuration that spans owners fails at startup / mint time.
95
+ `onComment` replaces the default `@botName` gate. Return a turn when the
96
+ comment is for this agent, then post the reply from a tool.
63
97
 
64
- To keep repository scope in deployment config instead, use
65
- `cursorAccount: true` and pass it at serve time:
98
+ ```ts
99
+ onComment: (ctx, comment) => {
100
+ if (!comment.body.includes("@my-agent")) {
101
+ return null;
102
+ }
103
+ return { auth: defaultGitHubAuth(ctx) };
104
+ },
105
+ ```
66
106
 
67
- ```bash
68
- agent-sdk serve --dir . --cursor-events --repo owner/repo
107
+ ```ts
108
+ // agent/tools/reply.ts
109
+ import { parseGitHubPrContinuationKey } from "@cursor/july/channels/github";
110
+ import { defineTool } from "@cursor/july/tools";
111
+ import { z } from "zod";
112
+
113
+ export default defineTool({
114
+ description: "Post a comment on this session's pull request.",
115
+ inputSchema: z.object({
116
+ body: z.string().describe("Markdown to post on the PR timeline."),
117
+ }),
118
+ async execute({ body }, ctx) {
119
+ if (ctx.session.purpose === "eval") {
120
+ return { posted: false, reason: "eval" };
121
+ }
122
+ const ref = parseGitHubPrContinuationKey(ctx.session.continuationKey ?? "");
123
+ if (ref === undefined) {
124
+ throw new Error("reply requires a GitHub pull request session");
125
+ }
126
+
127
+ const octokit = await ctx.host.github.getOctokit();
128
+ await octokit.rest.issues.createComment({
129
+ owner: ref.owner,
130
+ repo: ref.repo,
131
+ issue_number: ref.number,
132
+ body,
133
+ });
134
+ return { posted: true };
135
+ },
136
+ });
69
137
  ```
70
138
 
71
- Repeat `--repo` for each repository. The stream and credential are
72
- resolved as the signed-in Cursor principal. `serve` refuses to start
73
- signed out.
139
+ Resolve owner, repo, and number from the session. Do not take a PR URL
140
+ from the model. A later mention on the same PR resumes this
141
+ conversation.
74
142
 
75
- The stream carries event metadata, not full webhook bodies, so your
76
- agent should re-read the PR or checks from GitHub instead of trusting a
77
- snapshot in the wake.
143
+ ## Triage a failing check
78
144
 
79
- This is the preferred production path: no public URL, no repo admin
80
- webhook, and no inbound network for GitHub deliveries.
145
+ Start a model turn when CI fails. Run host code when the next step is
146
+ already decided.
81
147
 
82
- ## Connect GitHub Enterprise Server
148
+ ```ts
149
+ onCheckSuite: (ctx, suite) => {
150
+ if (suite.conclusion !== "failure") {
151
+ return null;
152
+ }
153
+ // `auth` starts a model turn to read logs and comment.
154
+ return { auth: defaultGitHubAuth(ctx) };
155
+ },
156
+ ```
83
157
 
84
- GitHub Enterprise Server uses the same `githubChannel()` hooks and normalized
85
- events. Connect it through the direct webhook route. Set the REST API base and
86
- credentials for your server:
158
+ ```ts
159
+ onCheckSuite: (ctx, suite) => {
160
+ if (suite.conclusion !== "failure") {
161
+ return null;
162
+ }
163
+ // `task` runs host code instead of a model turn. No chat session.
164
+ return { task: () => labelFailure(ctx, suite) };
165
+ },
166
+ ```
87
167
 
88
168
  ```ts
89
- export default githubChannel({
90
- api: {
91
- apiBaseUrl: "https://github.example.com/api/v3",
92
- },
93
- credentials: {
94
- token: () => process.env.GITHUB_TOKEN,
95
- webhookSecret: () => process.env.GITHUB_WEBHOOK_SECRET,
96
- },
97
- onPullRequest: (ctx, pr) =>
98
- pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
99
- });
169
+ async function labelFailure(ctx, suite) {
170
+ const pr = suite.pullRequests[0];
171
+ if (pr === undefined) {
172
+ return;
173
+ }
174
+ const octokit = await ctx.github.getOctokit();
175
+ await octokit.rest.issues.addLabels({
176
+ owner: ctx.repository.owner,
177
+ repo: ctx.repository.name,
178
+ issue_number: pr.number,
179
+ labels: ["ci-failed"],
180
+ });
181
+ }
100
182
  ```
101
183
 
102
- Add a repository webhook for
103
- `https://<your-host>/<slug>/v1/channels/github`. Use the same webhook secret
104
- on the server and in `GITHUB_WEBHOOK_SECRET`. The channel verifies
105
- `X-Hub-Signature-256` before it parses the payload.
184
+ ## Events
106
185
 
107
- Cursor account event pull, `github replay`, and `github forward` target
108
- GitHub.com. Test Enterprise Server integrations by posting saved webhook
109
- fixtures to a local `--dev` server. Leave `GITHUB_WEBHOOK_SECRET` unset for
110
- this local test so the channel admits unsigned loopback deliveries. Use a real
111
- delivery from your server so the fixture matches its version.
186
+ Declare a hook for each event that should wake the agent:
187
+ `onPullRequest`, `onComment`, `onIssue`, `onCheckSuite`, `onCheckRun`,
188
+ `onWorkflowRun`, `onStatus`, and the catch-all `onEvent`.
112
189
 
113
- ## Define the channel
190
+ Each hook returns one of three outcomes:
114
191
 
115
- Author `agent/channels/github.ts` with `githubChannel()` from
116
- `@cursor/july/channels/github`. It mounts
117
- `POST /<slug>/v1/channels/github` and publishes the events it
118
- dispatches on. That event set comes from the hooks you declare, or you
119
- pin it with `webhookEvents`. Cursor event pull and local replay both use
120
- it.
192
+ | Return | Use when |
193
+ | ---------- | ----------------------------------------------------------------------------- |
194
+ | `{ auth }` | The model should reason about the event. The turn shows up in the playground. |
195
+ | `{ task }` | Host code can handle the wake. No chat session. |
196
+ | `null` | Skip the event. |
121
197
 
122
- ```ts
123
- import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
198
+ [Channels](../reference/channels.md) covers the shared session behavior.
124
199
 
125
- export default githubChannel({
126
- botName: "my-agent", // or GITHUB_APP_SLUG; used to ignore self-comments
127
- cursorAccount: { repos: ["owner/repo"] },
128
- onPullRequest: (ctx, pr) =>
129
- pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
130
- onCheckSuite: (ctx, suite) =>
131
- suite.conclusion === "failure" ? { task: () => triage(ctx) } : null,
132
- });
133
- ```
200
+ ## PR and agent affinity
134
201
 
135
- The hooks are `onPullRequest`, `onComment`, `onIssue`, `onCheckSuite`,
136
- `onCheckRun`, `onWorkflowRun`, `onStatus`, the catch-all `onEvent`, and
137
- the lifecycle pair `onStart` / `onStop`. Each hook returns one of three
138
- things:
202
+ Every wake for the same repo and PR number resumes the same session. The
203
+ channel keys turns as `github-pr:acme/checkout#42`. Opens, comments, and
204
+ CI results share that conversation.
139
205
 
140
- | Return | Meaning |
141
- | --- | --- |
142
- | `{ auth }` | Start or continue a model turn as that actor. A chat session exists and shows up in the playground. |
143
- | `{ task }` | Host-side work. The delivery is 202-ACKed immediately and the task runs past GitHub's ~10-second timeout. No chat session. |
144
- | `null` | Skip this delivery. |
206
+ ## Call GitHub from determistic code via `ctx`
145
207
 
146
- `{ auth }` may also carry `workspaceFiles`, the same session seed Slack
147
- and `send()` use. Pass a function to fetch after a 202 so I/O can miss
148
- GitHub's ~10s window.
208
+ `cursorAccount` puts one credential on both surfaces:
149
209
 
150
- Return `{ task }` when the wake drives deterministic code. A security
151
- reviewer can run its whole review loop this way and report
152
- through PR comments. Return `{ auth }` when the model needs to reason
153
- about the event.
210
+ - Channel hooks: `ctx.github.getOctokit()`, `ctx.thread.post()`,
211
+ `ctx.repository`, and `ctx.conversation`
154
212
 
155
- Without `cursorAccount`, outbound GitHub API calls prefer App installation tokens when
156
- `GITHUB_APP_ID` and `GITHUB_APP_PRIVATE_KEY` are set (with an
157
- installation id from the event or `GITHUB_APP_INSTALLATION_ID`). On
158
- serve warmup, App-backed hosts also export a short-lived installation
159
- token as `GH_TOKEN` so tools that shell out to `gh` (a host-side
160
- `prepare_review` tool, say) authenticate without a PAT. For
161
- local testing, skip the App credentials and use `GITHUB_TOKEN`,
162
- `GH_TOKEN`, or `gh auth login`.
213
+ - Tools: `ctx.host.github.getOctokit()`
163
214
 
164
- ## Test wakes locally
215
+ ```ts
216
+ onPullRequest: async (ctx, pr) => {
217
+ if (pr.action !== "opened") {
218
+ return null;
219
+ }
220
+ const octokit = await ctx.github.getOctokit();
221
+ const { data } = await octokit.rest.pulls.get({
222
+ owner: ctx.repository.owner,
223
+ repo: ctx.repository.name,
224
+ pull_number: pr.number,
225
+ });
226
+ if (data.draft) {
227
+ return null;
228
+ }
229
+ await ctx.thread.post(`Reviewing ${pr.url}`);
230
+ return { auth: defaultGitHubAuth(ctx) };
231
+ },
232
+ ```
165
233
 
166
- Use fixtures and `github replay` so you can develop without waiting on
167
- live pushes. Both target the same channel route the Cursor relay uses.
234
+ Re-read the PR here when the hook must decide. Tools use the host
235
+ client for the same API during the turn.
168
236
 
169
- ### Post a saved fixture
237
+ ## Batch events
170
238
 
171
- For offline tests, POST a saved payload with an `x-github-event` header.
172
- A `--dev` server does not require a signature:
239
+ A change to a single request typically fans out multiple events, sometimes hundreds. A push can fire `synchronize`, several check runs,
240
+ and comments in a few seconds. By default, individual channel hooks or webhooks do not debounce for you.
173
241
 
174
- ```bash
175
- curl -s -X POST http://127.0.0.1:3000/<slug>/v1/channels/github \
176
- -H 'content-type: application/json' \
177
- -H 'x-github-event: pull_request' \
178
- -d @fixtures/github/pull_request.synchronize.json
242
+ Coalesce per PR. Flush the latest wake. Skip a flush when a turn for
243
+ that PR is already running.
244
+
245
+ ```ts
246
+ const pending = new Map();
247
+
248
+ function enqueue(pr, flush) {
249
+ const key = `${pr.owner}/${pr.repo}#${pr.number}`;
250
+ const existing = pending.get(key);
251
+ if (existing !== undefined) {
252
+ clearTimeout(existing);
253
+ }
254
+ pending.set(
255
+ key,
256
+ setTimeout(() => {
257
+ pending.delete(key);
258
+ flush();
259
+ }, 3_000)
260
+ );
261
+ }
179
262
  ```
180
263
 
181
- Don't hand-write payloads. Snapshot real ones with replay's
182
- `--dry-run --out`, below.
264
+ The [PR autofixer](../templates/pr-autofixer.md) ships a buffer that
265
+ persists across restarts and drops the queue when the PR closes.
183
266
 
184
- ### Test with `github replay`
267
+ ## Test with replay
185
268
 
186
- Use `replay` for deterministic tests and
187
- [hillclimbing](../hillclimbing.md). It reads a real PR with `gh api`,
188
- synthesizes GitHub-shaped payloads, signs them when a secret is
189
- configured, and POSTs them at the channel. Pull access is enough: no
190
- admin, and an env `GITHUB_TOKEN` is fine here. The same input produces
191
- the same delivery.
269
+ The AgentSDK makes it convenient for you to replay a PR you can read.
192
270
 
193
271
  ```bash
194
- # Replay a pull_request delivery for a PR
195
- agent-sdk github replay https://github.com/owner/repo/pull/123 --dir .
272
+ agent-sdk github replay https://github.com/acme/checkout/pull/42 --dir . --action opened
196
273
 
197
274
  # Replay everything the channel listens for, with CI failing
198
- agent-sdk github replay owner/repo#123 --dir . --events '*' --conclusion failure
275
+ agent-sdk github replay acme/checkout#42 --dir . --events '*' --conclusion failure
199
276
 
200
- # Inspect payloads without POSTing, and snapshot them as fixtures
201
- agent-sdk github replay owner/repo#123 --dir . --events '*' --dry-run --out fixtures/github
277
+ # Snapshot payloads as fixtures instead of POSTing
278
+ agent-sdk github replay acme/checkout#42 --dir . --events '*' --dry-run --out fixtures/github
202
279
  ```
203
280
 
204
- `--events` defaults to `pull_request`. `'*'` replays the events the channel
205
- declares and the CLI can synthesize. `--action`, `--conclusion`, `--comment`,
206
- and `--context` shape each event. `--secret` or `GITHUB_WEBHOOK_SECRET` signs
207
- them.
208
-
209
- ## Receive webhooks directly
210
-
211
- Most hosts should pull events from Cursor instead. Use the HTTP channel
212
- route when you already terminate GitHub webhooks yourself, or when you
213
- are POSTing fixtures and replay locally.
214
-
215
- With a webhook secret configured, the route admits everyone
216
- (`allowAll()`) and the channel verifies `X-Hub-Signature-256` before
217
- parsing. The HMAC becomes the request principal. Without a secret, the
218
- route is loopback-only. The exception is `serve --dev`, which admits
219
- unsigned loopback deliveries so fixtures and replay work with zero
220
- config. Non-dev targets that accept real GitHub POSTs always need the
221
- secret, and the same value must live on the server and on whatever signs
222
- deliveries.
223
-
224
- ## Handle high event volume
225
-
226
- These patterns come from running a PR agent against real traffic:
227
-
228
- - Debounce per PR (~3 seconds, latest event wins), and re-buffer while
229
- CI settles. Skip a flush when a turn for that PR is already running.
230
- - Persist the buffer in `host.kv` before you acknowledge a wake, and
231
- restore it on channel start. A restart must not drop buffered wakes.
232
- - Key sessions with a stable continuation token (`pr:owner/repo#N`) so
233
- every wake resumes the PR's conversation.
234
- - Keep payload details out of wake prompts. Send a generic "re-check
235
- the PR" and let the agent re-read source of truth instead of trusting a
236
- stale snapshot.
237
- - Cancel PR-scoped reminders on `pull_request.closed`.
238
- - Decide explicitly which repos the agent may act on. Without an
239
- allowlist the channel wakes for whatever deliveries reach it, and
240
- every wake spends real model budget.
241
-
242
- ## Show PR progress
243
-
244
- Autofix-style agents need a deterministic merge-box check and a sticky
245
- PR comment that converges when the turn ends. Configure that on the
246
- channel with `progress.commitStatus` and `progress.banner`. A hook can
247
- read and write `ctx.host.kv` and `ctx.host.files` after a turn. Use
248
- that for derived state. Keep GitHub check-run and banner writes on the
249
- channel.
281
+ ## Practices
250
282
 
251
- ```ts
252
- import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
283
+ - Re-read GitHub in the turn or a tool. Do not stuff the event payload
284
+ into the prompt.
285
+
286
+ - Set `botName` so replies do not re-wake the agent.
287
+
288
+ - Watch an explicit repo list (`cursorAccount.repos`). Repos under one
289
+ channel must share one GitHub owner.
290
+
291
+ - Cancel leftover work on `pull_request.closed`.
253
292
 
293
+
294
+ ## Other hosts
295
+
296
+ The same hooks work on GitHub Enterprise Server. Point the channel at
297
+ your server and add a repo webhook:
298
+
299
+ ```ts
254
300
  export default githubChannel({
255
- botName: "autofix",
256
- deliverReplies: false,
257
- progress: {
258
- reactions: false,
259
- commitStatus: {
260
- context: "autofix",
261
- pending: "Autofix running",
262
- success: "Autofix finished",
263
- failure: "Autofix failed",
264
- },
265
- banner: {
266
- pending: "Autofix running…",
267
- success: "Autofix finished",
268
- failure: "Autofix failed",
269
- },
301
+ api: {
302
+ apiBaseUrl: "https://github.example.com/api/v3",
270
303
  },
271
- // commitStatus posts a Checks API run. Hosted cursorAccount opts the
272
- // minted token up to contents-write (checks:write). Banner also works
273
- // on pr-write without commitStatus.
274
- cursorAccount: {
275
- repos: ["owner/repo"],
304
+ credentials: {
305
+ token: () => process.env.GITHUB_TOKEN,
306
+ webhookSecret: () => process.env.GITHUB_WEBHOOK_SECRET,
276
307
  },
277
- onPullRequest: (ctx, pr) =>
278
- pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
279
308
  });
280
309
  ```
281
310
 
282
- Default stream events drive the lifecycle:
283
-
284
- | Event | Check run | Banner |
285
- | --- | --- | --- |
286
- | `turn.started` | `in_progress` | create (or keep) the sticky comment |
287
- | `turn.completed` | `completed` / `success` | PATCH the same comment |
288
- | `turn.failed` / `session.failed` | `completed` / `failure` | PATCH the same comment |
289
-
290
- Omit `commitStatus` / `banner`, or set them to `false`, to keep today's
291
- behavior. Reactions still default on; set `reactions: false` when the
292
- eyes emoji is noise. Descriptions are optional; defaults derive from
293
- `botName` or the check `context`.
294
-
295
- To match dashboard automations, set `detailsUrl(sessionId)`,
296
- `summaryLinkText: "View agent"`, and `outputTitle: "context"` so the
297
- check title is the check name, the summary includes `[View agent](…)`,
298
- and Details opens the session.
299
-
300
- A comment-only first wake has no head SHA, so the check waits for a
301
- PR or CI event. The banner still posts. A later turn on the same SHA
302
- creates a new check run; GitHub cannot reopen a completed run.
311
+ Add a repository webhook for
312
+ `https://<your-host>/<slug>/v1/channels/github` with the same secret.
313
+ Event pull and `github replay` target GitHub.com, so test Enterprise
314
+ Server with saved fixtures.
303
315
 
304
- Override `events` when the mapping is custom. A handler can post commit
305
- status from `turn.started` / `action.result` / `turn.failed` and stay
306
- never-red; that pattern still wins when you replace a default handler
307
- key. Handlers you author replace the matching defaults (same as
308
- `progress.reactions` composition today).
316
+ Prefer event pull on github.com. Use the channel route directly when
317
+ you already terminate GitHub webhooks yourself. Set a webhook secret on
318
+ both sides. The [Webhooks guide](./webhooks.md) covers the shared
319
+ mechanism.
309
320
 
310
321
  ## Related
311
322
 
312
- - [Webhooks and custom channels](./webhooks.md): the HTTP mechanism under
313
- this pack
323
+ - [Build a PR reviewer](../quickstart.md): the full read and write
324
+ loop, one step at a time
325
+ - [PR autofixer](../templates/pr-autofixer.md): push fixes and show
326
+ progress on the PR
327
+ - [Webhooks and custom channels](./webhooks.md): the HTTP mechanism
328
+ under this pack
314
329
  - [Evals](../evals.md): turn replay snapshots into regression fixtures
315
- - [Hooks](../reference/hooks.md): observe-only; use channel `progress` for
316
- GitHub surfaces
330
+ - [`skills/github/SKILL.md`](../../skills/github/SKILL.md): the companion
331
+ skill for coding agents