@cursor/july 0.1.90 → 0.1.91

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 (266) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +8 -7
  3. package/dist/channels/slack/channel-watch.d.ts +1 -1
  4. package/dist/channels/slack/channel-watch.js +1 -1
  5. package/dist/channels/slack/slack-channel.js +1 -1
  6. package/dist/channels/slack/types.d.ts +2 -4
  7. package/dist/channels/slack/types.d.ts.map +1 -1
  8. package/dist/docs/404.html +3 -3
  9. package/dist/docs/ab.html +7 -7
  10. package/dist/docs/assets/{ab.md.DYjwREAP.js → ab.md.CVzWxLoB.js} +1 -1
  11. package/dist/docs/assets/{ab.md.DYjwREAP.lean.js → ab.md.CVzWxLoB.lean.js} +1 -1
  12. package/dist/docs/assets/{app.wiNkt6G7.js → app.Bci6CM9E.js} +1 -1
  13. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.js → building-with-agents.md.DH8A_cHA.js} +1 -1
  14. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.lean.js → building-with-agents.md.DH8A_cHA.lean.js} +1 -1
  15. package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +1 -0
  16. package/dist/docs/assets/chunks/{VPLocalSearchBox.ByhUGu47.js → VPLocalSearchBox.BCPT6xA-.js} +1 -1
  17. package/dist/docs/assets/chunks/{framework.CAZyNGu9.js → framework.BCISBCiQ.js} +1 -1
  18. package/dist/docs/assets/chunks/theme.BEA8BF3c.js +2 -0
  19. package/dist/docs/assets/{concepts.md.2NfkGjqM.js → concepts.md.CRfU3bVg.js} +1 -1
  20. package/dist/docs/assets/{concepts.md.2NfkGjqM.lean.js → concepts.md.CRfU3bVg.lean.js} +1 -1
  21. package/dist/docs/assets/{deployment.md.B8kW-h7P.js → deployment.md.DX_hc3ze.js} +6 -5
  22. package/dist/docs/assets/{deployment.md.B8kW-h7P.lean.js → deployment.md.DX_hc3ze.lean.js} +1 -1
  23. package/dist/docs/assets/{evals.md.CVe_O75-.js → evals.md.a0SMN6r9.js} +3 -3
  24. package/dist/docs/assets/{evals.md.CVe_O75-.lean.js → evals.md.a0SMN6r9.lean.js} +1 -1
  25. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.js → example-agents_approval-buddy.md.DNL83puR.js} +1 -1
  26. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.lean.js → example-agents_approval-buddy.md.DNL83puR.lean.js} +1 -1
  27. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.js → example-agents_benny.md.C40vHRLc.js} +1 -1
  28. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.lean.js → example-agents_benny.md.C40vHRLc.lean.js} +1 -1
  29. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.js → example-agents_bugbot.md.BRGMi9O2.js} +1 -1
  30. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.lean.js → example-agents_bugbot.md.BRGMi9O2.lean.js} +1 -1
  31. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.js → example-agents_codebase-wiki.md.Dftj_tPp.js} +1 -1
  32. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.lean.js → example-agents_codebase-wiki.md.Dftj_tPp.lean.js} +1 -1
  33. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.js → example-agents_codeowners-review.md.Bfta-lBU.js} +1 -1
  34. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.lean.js → example-agents_codeowners-review.md.Bfta-lBU.lean.js} +1 -1
  35. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.js → example-agents_concierge.md.MrKpQndp.js} +1 -1
  36. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.lean.js → example-agents_concierge.md.MrKpQndp.lean.js} +1 -1
  37. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.js → example-agents_fsd.md.ZWHWWZPE.js} +1 -1
  38. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.lean.js → example-agents_fsd.md.ZWHWWZPE.lean.js} +1 -1
  39. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +2 -0
  40. package/dist/docs/assets/{example-agents_index.md.xmJ87d_3.lean.js → example-agents_index.md.QZ8mhr6n.lean.js} +1 -1
  41. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.js → example-agents_knowledge-base.md.DqKqHQ9u.js} +1 -1
  42. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.lean.js → example-agents_knowledge-base.md.DqKqHQ9u.lean.js} +1 -1
  43. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.js → example-agents_oncall.md.DK4XkYTd.js} +1 -1
  44. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.lean.js → example-agents_oncall.md.DK4XkYTd.lean.js} +1 -1
  45. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.js → example-agents_security-reviewer.md.Bai6D0Ee.js} +4 -4
  46. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.lean.js → example-agents_security-reviewer.md.Bai6D0Ee.lean.js} +1 -1
  47. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.js → example-agents_slack-agent.md.D7Kdj5BV.js} +1 -1
  48. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.lean.js → example-agents_slack-agent.md.D7Kdj5BV.lean.js} +1 -1
  49. package/dist/docs/assets/{example-agents_weather-agent.md.DC3lINjo.js → example-agents_weather-agent.md.lVEAbWFf.js} +5 -5
  50. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +1 -0
  51. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.js → guides_agent-to-agent.md.BCeVdJRJ.js} +1 -1
  52. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.lean.js → guides_agent-to-agent.md.BCeVdJRJ.lean.js} +1 -1
  53. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.js → guides_cloud-runtime.md.BSMLIBHr.js} +1 -1
  54. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.lean.js → guides_cloud-runtime.md.BSMLIBHr.lean.js} +1 -1
  55. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.js → guides_convert-automation.md.D06eIzea.js} +1 -1
  56. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.lean.js → guides_convert-automation.md.D06eIzea.lean.js} +1 -1
  57. package/dist/docs/assets/{guides_github.md.CLLQJKRB.js → guides_github.md.Cdt1s2QC.js} +4 -4
  58. package/dist/docs/assets/{guides_github.md.CLLQJKRB.lean.js → guides_github.md.Cdt1s2QC.lean.js} +1 -1
  59. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.js → guides_human-in-the-loop.md.By1G2T3_.js} +1 -1
  60. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.lean.js → guides_human-in-the-loop.md.By1G2T3_.lean.js} +1 -1
  61. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.js → guides_mcp-oauth.md.Du0f7pGU.js} +1 -1
  62. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.lean.js → guides_mcp-oauth.md.Du0f7pGU.lean.js} +1 -1
  63. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.js → guides_opentelemetry.md.bmPmkvJu.js} +1 -1
  64. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.lean.js → guides_opentelemetry.md.bmPmkvJu.lean.js} +1 -1
  65. package/dist/docs/assets/{guides_slack.md.DP4H75WP.js → guides_slack.md.DiUmk_Oi.js} +5 -5
  66. package/dist/docs/assets/{guides_slack.md.DP4H75WP.lean.js → guides_slack.md.DiUmk_Oi.lean.js} +1 -1
  67. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.js → guides_webhooks.md.BpnIdO0i.js} +5 -6
  68. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.lean.js → guides_webhooks.md.BpnIdO0i.lean.js} +1 -1
  69. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.js → hillclimbing.md.ywF3yDAd.js} +1 -1
  70. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.lean.js → hillclimbing.md.ywF3yDAd.lean.js} +1 -1
  71. package/dist/docs/assets/index.md.BAaMXLFd.js +5 -0
  72. package/dist/docs/assets/{index.md.DhRHS_-L.lean.js → index.md.BAaMXLFd.lean.js} +1 -1
  73. package/dist/docs/assets/{quickstart.md.DZxBu44y.js → quickstart.md.DsrarzEg.js} +1 -1
  74. package/dist/docs/assets/{quickstart.md.DZxBu44y.lean.js → quickstart.md.DsrarzEg.lean.js} +1 -1
  75. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.js → reference_agent-config.md.Bqylgw50.js} +1 -1
  76. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.lean.js → reference_agent-config.md.Bqylgw50.lean.js} +1 -1
  77. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.js → reference_artifacts.md.Dior32Qw.js} +1 -1
  78. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.lean.js → reference_artifacts.md.Dior32Qw.lean.js} +1 -1
  79. package/dist/docs/assets/{reference_channels.md.CboFd5IH.js → reference_channels.md.DQZjCnyh.js} +2 -2
  80. package/dist/docs/assets/{reference_channels.md.CboFd5IH.lean.js → reference_channels.md.DQZjCnyh.lean.js} +1 -1
  81. package/dist/docs/assets/{reference_cli.md.TAaYU8br.js → reference_cli.md.B7GkAJRC.js} +8 -7
  82. package/dist/docs/assets/{reference_cli.md.TAaYU8br.lean.js → reference_cli.md.B7GkAJRC.lean.js} +1 -1
  83. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.js → reference_connections.md.DYidrb-j.js} +5 -5
  84. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.lean.js → reference_connections.md.DYidrb-j.lean.js} +1 -1
  85. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.js → reference_hooks.md.B9FSgdDe.js} +1 -1
  86. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.lean.js → reference_hooks.md.B9FSgdDe.lean.js} +1 -1
  87. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.js → reference_http-api.md.CSHVobzG.js} +4 -4
  88. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.lean.js → reference_http-api.md.CSHVobzG.lean.js} +1 -1
  89. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.js → reference_instructions.md.DhNCOl7r.js} +1 -1
  90. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.lean.js → reference_instructions.md.DhNCOl7r.lean.js} +1 -1
  91. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.js → reference_playground.md.Dfb92yQf.js} +1 -1
  92. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.lean.js → reference_playground.md.Dfb92yQf.lean.js} +1 -1
  93. package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.js → reference_project-layout.md.CwkSbEWT.js} +1 -1
  94. package/dist/docs/assets/{reference_project-layout.md.CueaKpjr.lean.js → reference_project-layout.md.CwkSbEWT.lean.js} +1 -1
  95. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.js → reference_prompt.md.DZUMtLPD.js} +1 -1
  96. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.lean.js → reference_prompt.md.DZUMtLPD.lean.js} +1 -1
  97. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.js → reference_schedules.md.DNipebiG.js} +1 -1
  98. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.lean.js → reference_schedules.md.DNipebiG.lean.js} +1 -1
  99. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.js → reference_sessions.md.tUFzz98S.js} +1 -1
  100. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.lean.js → reference_sessions.md.tUFzz98S.lean.js} +1 -1
  101. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.js → reference_skills.md.B5ZEuHfG.js} +1 -1
  102. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.lean.js → reference_skills.md.B5ZEuHfG.lean.js} +1 -1
  103. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.js → reference_subagents.md.Xoav0AII.js} +1 -1
  104. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.lean.js → reference_subagents.md.Xoav0AII.lean.js} +1 -1
  105. package/dist/docs/assets/{reference_tools.md.XmeFP_3d.js → reference_tools.md.wpaJtHn6.js} +2 -3
  106. package/dist/docs/assets/{reference_tools.md.XmeFP_3d.lean.js → reference_tools.md.wpaJtHn6.lean.js} +1 -1
  107. package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.js → scaffolding-agents.md.CRDDUtYJ.js} +1 -1
  108. package/dist/docs/assets/{scaffolding-agents.md.BpMFXv2J.lean.js → scaffolding-agents.md.CRDDUtYJ.lean.js} +1 -1
  109. package/dist/docs/assets/{storage.md.ks1u64_R.js → storage.md.JbjlHWZ6.js} +1 -1
  110. package/dist/docs/assets/{storage.md.ks1u64_R.lean.js → storage.md.JbjlHWZ6.lean.js} +1 -1
  111. package/dist/docs/assets/{style.kTsvp4pE.css → style.BRuM8477.css} +1 -1
  112. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.js → templates_agentic-owners.md.DSJSIpWU.js} +1 -1
  113. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.lean.js → templates_agentic-owners.md.DSJSIpWU.lean.js} +1 -1
  114. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.js → templates_demo.md.DhFcWN6j.js} +1 -1
  115. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.lean.js → templates_demo.md.DhFcWN6j.lean.js} +1 -1
  116. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.js → templates_pr-autofixer.md.1HAR3RXE.js} +1 -1
  117. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.lean.js → templates_pr-autofixer.md.1HAR3RXE.lean.js} +1 -1
  118. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.js → templates_security-reviewer.md.ByFyRta2.js} +1 -1
  119. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.lean.js → templates_security-reviewer.md.ByFyRta2.lean.js} +1 -1
  120. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.js → templates_triage.md.CVlpctKS.js} +2 -2
  121. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.lean.js → templates_triage.md.CVlpctKS.lean.js} +1 -1
  122. package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +1 -0
  123. package/dist/docs/assets/{troubleshooting.md.KgmmaCgw.lean.js → troubleshooting.md.DYECCZiJ.lean.js} +1 -1
  124. package/dist/docs/building-with-agents.html +7 -7
  125. package/dist/docs/concepts.html +7 -7
  126. package/dist/docs/deployment.html +11 -10
  127. package/dist/docs/evals.html +8 -8
  128. package/dist/docs/example-agents/approval-buddy.html +7 -7
  129. package/dist/docs/example-agents/benny.html +7 -7
  130. package/dist/docs/example-agents/bugbot.html +7 -7
  131. package/dist/docs/example-agents/codebase-wiki.html +7 -7
  132. package/dist/docs/example-agents/codeowners-review.html +7 -7
  133. package/dist/docs/example-agents/concierge.html +7 -7
  134. package/dist/docs/example-agents/fsd.html +7 -7
  135. package/dist/docs/example-agents/index.html +7 -7
  136. package/dist/docs/example-agents/knowledge-base.html +7 -7
  137. package/dist/docs/example-agents/oncall.html +7 -7
  138. package/dist/docs/example-agents/security-reviewer.html +10 -10
  139. package/dist/docs/example-agents/slack-agent.html +7 -7
  140. package/dist/docs/example-agents/weather-agent.html +12 -12
  141. package/dist/docs/guides/agent-to-agent.html +7 -7
  142. package/dist/docs/guides/cloud-runtime.html +7 -7
  143. package/dist/docs/guides/convert-automation.html +7 -7
  144. package/dist/docs/guides/github.html +9 -9
  145. package/dist/docs/guides/human-in-the-loop.html +7 -7
  146. package/dist/docs/guides/mcp-oauth.html +7 -7
  147. package/dist/docs/guides/opentelemetry.html +7 -7
  148. package/dist/docs/guides/slack.html +10 -10
  149. package/dist/docs/guides/webhooks.html +10 -11
  150. package/dist/docs/hashmap.json +1 -1
  151. package/dist/docs/hillclimbing.html +7 -7
  152. package/dist/docs/index.html +8 -8
  153. package/dist/docs/quickstart.html +7 -7
  154. package/dist/docs/reference/agent-config.html +7 -7
  155. package/dist/docs/reference/artifacts.html +7 -7
  156. package/dist/docs/reference/channels.html +8 -8
  157. package/dist/docs/reference/cli.html +13 -12
  158. package/dist/docs/reference/connections.html +10 -10
  159. package/dist/docs/reference/hooks.html +7 -7
  160. package/dist/docs/reference/http-api.html +10 -10
  161. package/dist/docs/reference/instructions.html +7 -7
  162. package/dist/docs/reference/playground.html +7 -7
  163. package/dist/docs/reference/project-layout.html +7 -7
  164. package/dist/docs/reference/prompt.html +7 -7
  165. package/dist/docs/reference/schedules.html +7 -7
  166. package/dist/docs/reference/sessions.html +7 -7
  167. package/dist/docs/reference/skills.html +7 -7
  168. package/dist/docs/reference/subagents.html +7 -7
  169. package/dist/docs/reference/tools.html +8 -9
  170. package/dist/docs/scaffolding-agents.html +7 -7
  171. package/dist/docs/storage.html +7 -7
  172. package/dist/docs/templates/agentic-owners.html +7 -7
  173. package/dist/docs/templates/demo.html +7 -7
  174. package/dist/docs/templates/pr-autofixer.html +7 -7
  175. package/dist/docs/templates/security-reviewer.html +7 -7
  176. package/dist/docs/templates/triage.html +8 -8
  177. package/dist/docs/troubleshooting.html +7 -7
  178. package/dist/internal/cli-deploy.d.ts.map +1 -1
  179. package/dist/internal/cli-deploy.js +21 -3
  180. package/dist/internal/cursor-agent-template.d.ts +1 -1
  181. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  182. package/dist/internal/cursor-agent-template.js +1 -0
  183. package/dist/internal/deploy-client.d.ts +18 -0
  184. package/dist/internal/deploy-client.d.ts.map +1 -1
  185. package/dist/internal/deploy-client.js +25 -1
  186. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  187. package/dist/internal/deploy-manifest.js +5 -1
  188. package/dist/internal/discovery.d.ts +5 -1
  189. package/dist/internal/discovery.d.ts.map +1 -1
  190. package/dist/internal/discovery.js +16 -0
  191. package/dist/internal/http-channel.d.ts +2 -2
  192. package/dist/internal/http-channel.d.ts.map +1 -1
  193. package/dist/internal/http-channel.js +11 -31
  194. package/dist/internal/init-project.d.ts.map +1 -1
  195. package/dist/internal/init-project.js +2 -0
  196. package/dist/internal/session-engine.d.ts +8 -0
  197. package/dist/internal/session-engine.d.ts.map +1 -1
  198. package/dist/internal/session-engine.js +47 -5
  199. package/dist/playground/assets/index-D9N7-q97.css +1 -0
  200. package/dist/playground/assets/{index-DxapiDj_.js → index-DDvyC2z6.js} +49 -49
  201. package/dist/playground/index.html +2 -2
  202. package/dist/types.d.ts +8 -5
  203. package/dist/types.d.ts.map +1 -1
  204. package/docs/README.md +3 -1
  205. package/docs/concepts.md +1 -1
  206. package/docs/deployment.md +9 -6
  207. package/docs/evals.md +1 -5
  208. package/docs/example-agents/codebase-wiki.md +2 -3
  209. package/docs/example-agents/fsd.md +1 -1
  210. package/docs/example-agents/index.md +2 -2
  211. package/docs/example-agents/knowledge-base.md +3 -3
  212. package/docs/example-agents/security-reviewer.md +17 -48
  213. package/docs/example-agents/weather-agent.md +14 -45
  214. package/docs/guides/github.md +7 -4
  215. package/docs/guides/slack.md +7 -2
  216. package/docs/guides/webhooks.md +12 -15
  217. package/docs/reference/channels.md +4 -0
  218. package/docs/reference/cli.md +21 -7
  219. package/docs/reference/connections.md +13 -32
  220. package/docs/reference/http-api.md +14 -9
  221. package/docs/reference/tools.md +1 -3
  222. package/docs/templates/triage.md +3 -5
  223. package/docs/troubleshooting.md +1 -1
  224. package/package.json +1 -1
  225. package/skills/create-agent/SKILL.md +6 -7
  226. package/skills/framework-map/SKILL.md +6 -6
  227. package/skills/setup-slack/SKILL.md +1 -1
  228. package/src/channels/slack/channel-watch.ts +1 -1
  229. package/src/channels/slack/slack-channel.ts +1 -1
  230. package/src/channels/slack/types.ts +2 -4
  231. package/src/internal/cli-deploy.ts +27 -7
  232. package/src/internal/cursor-agent-template.ts +1 -0
  233. package/src/internal/deploy-client.ts +40 -1
  234. package/src/internal/deploy-manifest.ts +10 -1
  235. package/src/internal/discovery.ts +20 -0
  236. package/src/internal/http-channel.ts +14 -41
  237. package/src/internal/init-project.ts +2 -0
  238. package/src/internal/session-engine.ts +58 -8
  239. package/src/types.ts +8 -5
  240. package/templates/security-help/README.md +37 -0
  241. package/templates/security-help/agent/agent.ts +18 -0
  242. package/templates/security-help/agent/channels/github.ts +13 -0
  243. package/templates/security-help/agent/channels/slack.ts +89 -0
  244. package/templates/security-help/agent/instructions.md +20 -0
  245. package/templates/security-help/agent/knowledge/faq/approvals.md +5 -0
  246. package/templates/security-help/agent/knowledge/faq/channels.md +6 -0
  247. package/templates/security-help/agent/knowledge/faq/phishing.md +10 -0
  248. package/templates/security-help/agent/lib/pr-first-pass.ts +42 -0
  249. package/templates/security-help/agent/lib/repos.ts +5 -0
  250. package/templates/security-help/agent/skills/access-request.md +10 -0
  251. package/templates/security-help/agent/skills/security-first-pass.md +15 -0
  252. package/templates/security-help/agent/skills/security-playbooks.md +12 -0
  253. package/templates/security-help/agent/skills/security-pr-first-pass.md +12 -0
  254. package/templates/security-help/evals/evals.config.ts +5 -0
  255. package/templates/security-help/evals/security-help.eval.ts +53 -0
  256. package/templates/security-help/init.json +31 -0
  257. package/templates/security-help/package.json +18 -0
  258. package/templates/security-help/tsconfig.json +12 -0
  259. package/templates/triage/agent/channels/webhook.ts +2 -2
  260. package/dist/docs/assets/chunks/@localSearchIndexroot.FV0R6kOb.js +0 -1
  261. package/dist/docs/assets/chunks/theme.Dx7j_-0n.js +0 -2
  262. package/dist/docs/assets/example-agents_index.md.xmJ87d_3.js +0 -2
  263. package/dist/docs/assets/example-agents_weather-agent.md.DC3lINjo.lean.js +0 -1
  264. package/dist/docs/assets/index.md.DhRHS_-L.js +0 -5
  265. package/dist/docs/assets/troubleshooting.md.KgmmaCgw.js +0 -1
  266. package/dist/playground/assets/index-BpVS-paP.css +0 -1
@@ -1,14 +1,13 @@
1
1
  ---
2
2
  title: "Explore the full Agent SDK surface with a weather agent"
3
- description: "Trace cloud server tools, MCP, channels, approvals, skills, subagents, schedules, hooks, A/B metrics, and evals through one agent."
3
+ description: "Trace cloud tools, MCP, channels, skills, subagents, schedules, hooks, A/B metrics, and evals through one agent."
4
4
  ---
5
5
 
6
6
  # Explore the full Agent SDK surface with a weather agent
7
7
 
8
8
  The weather agent is the broadest small example in the repository. It fetches
9
9
  live conditions and forecasts, converts units through MCP, writes notes in a
10
- session workspace, and pauses an alert tool for human approval. The same agent
11
- also runs from HTTP, Slack, a schedule, and the MCP endpoint.
10
+ session workspace, and runs from HTTP, Slack, a schedule, and the MCP endpoint.
12
11
 
13
12
  Use this project when you want to see how the Agent SDK's filesystem pieces fit
14
13
  together before you design a larger agent.
@@ -17,19 +16,19 @@ together before you design a larger agent.
17
16
 
18
17
  ## See the runtime features together
19
18
 
20
- Most examples focus on one architecture. Weather agent puts the major runtime
19
+ Most examples focus on one feature. Weather agent puts the major runtime
21
20
  features side by side:
22
21
 
23
22
  | Capability | Source | Role |
24
23
  | --- | --- | --- |
25
24
  | Root config and instructions | [`agent/agent.ts`](../../examples/weather-agent/agent/agent.ts), [`agent/instructions.md`](../../examples/weather-agent/agent/instructions.md) | Select the cloud runtime and route each request. |
26
- | Server tools | [`agent/tools/`](../../examples/weather-agent/agent/tools/) | Execute on the Agent SDK host through authenticated HTTP MCP, fetch Open-Meteo data, call MCP, and model an approval-gated action. |
25
+ | Server tools | [`agent/tools/`](../../examples/weather-agent/agent/tools/) | Fetch Open-Meteo data and call MCP from the serve host. |
27
26
  | Agent tool | [`save_weather_note.ts`](../../examples/weather-agent/agent/tools/save_weather_note.ts) | Run a Python script inside the session workspace. |
28
27
  | Stdio MCP | [`units.ts`](../../examples/weather-agent/agent/mcp-connections/units.ts), [`probe.ts`](../../examples/weather-agent/agent/mcp-connections/probe.ts) | Expose conversion tools to the model, host tools, and channel handlers. Author VM-side probe tools as TypeScript `execute` functions. |
29
28
  | Custom HTTP | [`webhook.ts`](../../examples/weather-agent/agent/channels/webhook.ts) | Start a turn or call MCP without a model turn. |
30
- | Slack | [`slack.ts`](../../examples/weather-agent/agent/channels/slack.ts), [`slack-app.ts`](../../examples/weather-agent/agent/channels/slack-app.ts) | Compare account-linked chat with a dedicated app offering approval buttons. |
29
+ | Slack | [`slack.ts`](../../examples/weather-agent/agent/channels/slack.ts), [`slack-app.ts`](../../examples/weather-agent/agent/channels/slack-app.ts) | Compare account-linked chat with a dedicated app. |
31
30
  | Skill and subagent | [`forecast.md`](../../examples/weather-agent/agent/skills/forecast.md), [`researcher/`](../../examples/weather-agent/agent/subagents/researcher/) | Load a procedure on demand or delegate broad research. |
32
- | Schedule and hook | [`heartbeat.md`](../../examples/weather-agent/agent/schedules/heartbeat.md), [`audit.ts`](../../examples/weather-agent/agent/hooks/audit.ts) | Start recurring task sessions and observe completed turns. |
31
+ | Schedule and hooks | [`heartbeat.md`](../../examples/weather-agent/agent/schedules/heartbeat.md), [`audit.ts`](../../examples/weather-agent/agent/hooks/audit.ts), [`journal.ts`](../../examples/weather-agent/agent/hooks/journal.ts) | Start recurring tasks, log usage, and save turn summaries. |
33
32
  | A/B and evals | [`agent/ab.ts`](../../examples/weather-agent/agent/ab.ts), [`evals/`](../../examples/weather-agent/evals/) | Compare a sticky variant and protect tool routing with regression cases. |
34
33
 
35
34
  ## Follow one request
@@ -65,7 +64,7 @@ The project mounts an account-linked Slack channel. The Agent SDK checks the
65
64
  connection at startup, so sign in even when you plan to call a deterministic
66
65
  tool.
67
66
 
68
- The optional approval-enabled Slack app also needs a token pair.
67
+ The optional dedicated Slack app also needs a token pair.
69
68
  `agent-sdk slack create --dir examples/weather-agent` provisions the
70
69
  app and writes the tokens for you (see the
71
70
  [Slack guide](../guides/slack.md#set-it-up)); with hand-minted tokens,
@@ -88,9 +87,8 @@ agent-sdk info --dir examples/weather-agent --json
88
87
  agent-sdk eval --dir examples/weather-agent --list
89
88
  ```
90
89
 
91
- The manifest should report eight tools, one skill, two MCP connections, one
92
- subagent, three authored channels, one schedule, one hook, and one A/B
93
- experiment. The eval listing should report eight cases.
90
+ `validate` should pass. `info` and `eval --list` should match the capabilities
91
+ described above.
94
92
 
95
93
  ## Call the typed tools
96
94
 
@@ -134,10 +132,8 @@ agent-sdk run --dir examples/weather-agent \
134
132
  Each session gets its own workspace. Saving a note doesn't edit the authored
135
133
  example.
136
134
 
137
- This split matters on cloud. Server tools execute on the Agent SDK host through
138
- an authenticated HTTP MCP endpoint while retaining the active session context.
139
- For an agent tool, the Agent SDK includes its catalog and script body in the
140
- first prompt; the cloud model writes and invokes the script in its VM.
135
+ This split matters on cloud. Server tools stay on the Agent SDK host.
136
+ Agent tools run inside the cloud workspace.
141
137
 
142
138
  ## Verify tool execution on the agent VM
143
139
 
@@ -224,30 +220,6 @@ This is the custom-channel version of a continuation token. See
224
220
  [webhooks and custom channels](../guides/webhooks.md) for route schemas,
225
221
  authentication, and asynchronous handlers.
226
222
 
227
- ## Pause a tool for human approval
228
-
229
- `post_weather_alert` sets `needsApproval: true`. Ask for an ops alert in the
230
- playground and the model's tool call parks before `execute`:
231
-
232
- ```bash
233
- agent-sdk dev examples/weather-agent
234
- ```
235
-
236
- Open the printed playground URL, ask:
237
-
238
- > Alert ops that severe weather is approaching Boston.
239
-
240
- Approve or deny the call in the transcript. The dedicated Socket Mode Slack
241
- channel can show the same buttons when `toolApprovals: true` and Slack
242
- interactivity are configured.
243
-
244
- The example tool returns a placeholder success object. It doesn't contact
245
- Slack, PagerDuty, or an ops board. Replace its `execute` body with your own
246
- sink before adapting it.
247
-
248
- Use a model turn for this proof. A deterministic `agent-sdk call` runs the
249
- tool body directly and doesn't demonstrate the parked approval flow.
250
-
251
223
  ## Load procedures and delegate research
252
224
 
253
225
  The forecast skill gives the root agent an on-demand procedure. The Agent SDK
@@ -303,19 +275,16 @@ agent-sdk eval --dir examples/weather-agent --list
303
275
  agent-sdk eval --dir examples/weather-agent --json
304
276
  ```
305
277
 
306
- Five cases cover current weather and forecasts against live Open-Meteo. Three
307
- more cover the local MCP converter, the workspace note tool, and the VM-side
308
- probe. Together they test model routing, external data, host MCP, agent-side
309
- execution, and stdio MCP in the agent environment.
278
+ The suite covers weather and forecast routing, the local converter, workspace
279
+ notes, and the VM-side probe.
310
280
 
311
281
  ## Turn the weather tour into your own agent
312
282
 
313
- Keep the architecture and replace the domain:
283
+ Keep the shape and replace the domain:
314
284
 
315
285
  - Swap Open-Meteo tools for your typed service clients.
316
286
  - Keep deterministic transforms behind direct server tools or MCP.
317
287
  - Use an agent tool only when code must run in the agent workspace.
318
- - Gate side effects with `needsApproval`.
319
288
  - Put reusable procedures in skills and narrow specialist work into
320
289
  subagents.
321
290
  - Add a channel only when the external surface needs its own identity,
@@ -53,6 +53,9 @@ permission on `"contents-write"` tokens. Enabling `commitStatus` opts a
53
53
  `"pr-write"` without `commitStatus` is enough for comments and banners.
54
54
  Prefer `"pr-write"` unless the agent must push or post a merge-box check.
55
55
 
56
+ Set `checks: true` when channel code posts its own Checks API runs through
57
+ `ctx.github.createCheck`. The flag grants access. It does not post a check.
58
+
56
59
  Selected repositories must share one GitHub owner (one App installation).
57
60
  Configuration that spans owners fails at startup / mint time.
58
61
 
@@ -166,10 +169,10 @@ agent-sdk github replay owner/repo#123 --dir . --events '*' --conclusion failure
166
169
  agent-sdk github replay owner/repo#123 --dir . --events '*' --dry-run --out fixtures/github
167
170
  ```
168
171
 
169
- `--events` defaults to `pull_request`, and `'*'` means the channel's
170
- declared set. `--action`, `--conclusion`, `--comment`, and `--context`
171
- shape each synthesized event. `--secret` (or `GITHUB_WEBHOOK_SECRET`)
172
- signs them.
172
+ `--events` defaults to `pull_request`. `'*'` replays the events the channel
173
+ declares and the CLI can synthesize. `--action`, `--conclusion`, `--comment`,
174
+ and `--context` shape each event. `--secret` or `GITHUB_WEBHOOK_SECRET` signs
175
+ them.
173
176
 
174
177
  ## Receive webhooks directly
175
178
 
@@ -65,7 +65,7 @@ export default slackChannel({
65
65
  Sign the host in (`agent-sdk login` or `CURSOR_API_KEY`), then mention the
66
66
  agent in Slack as `@Cursor Weatherbot …`. Thread replies and DMs keep going to
67
67
  the same agent. Messages appear as the Cursor app under that agent's name
68
- and icon, with live updates as the turn progresses.
68
+ and icon. Slack shows its working status, then posts one final reply.
69
69
 
70
70
  Use a dedicated Socket Mode Slack app when you need your own bot user,
71
71
  channel watching (`engagement.channelPosts`), or approval buttons. On
@@ -230,7 +230,7 @@ export default slackChannel({
230
230
  engagement: {
231
231
  // mentions / directMessages default to true
232
232
  channelPosts: {
233
- allow: ["#triage-alerts"], // explicit allowlist; no wildcard exists
233
+ allow: ["#triage-alerts"], // use ["*"] for every joined channel
234
234
  posts: "top-level", // default: thread replies never dispatch
235
235
  debounceMs: 15_000, // optional: let rapid edits settle
236
236
  includeBotPosts: false, // default: bot-authored posts never dispatch
@@ -249,6 +249,8 @@ on the Slack app (Socket Mode only; not available with
249
249
  `slack init --manual`. The bot must also be a member of each watched
250
250
  channel.
251
251
 
252
+ Set `allow: ["*"]` to watch every channel the bot has joined.
253
+
252
254
  Set `includeBotPosts: true` when the posts worth watching come from bots:
253
255
  alert feeds, webhook integrations, or other agents posting notes. The
254
256
  watching app's own posts stay dropped either way, matched by the `bot_id`
@@ -265,6 +267,9 @@ Mention and DM handlers may return a prepared `message`,
265
267
  PR agents use it: extract a PR URL from the mention text and run the
266
268
  same host path as the HTTP channel.
267
269
 
270
+ Slack file uploads are attached automatically. Images become vision input.
271
+ Supported documents become workspace files for the turn.
272
+
268
273
  ## Add approval buttons
269
274
 
270
275
  Tools with `needsApproval` park until a person decides. Route that
@@ -166,10 +166,10 @@ export default defineChannel({
166
166
 
167
167
  The built-in policies are `localDevStrict()` (the default),
168
168
  `localDev()`, `loopbackOnly()`, `bearerAuth(tokenOrVerify)`, and
169
- `allowAll()`, and any `(request, info) => AuthContext | null` function
170
- composes with them. Signature-verified surfaces usually use `allowAll()`
171
- at the route and verify the HMAC in the channel; the GitHub channel with
172
- a webhook secret works this way. The details live in
169
+ `allowAll()`, and `publicEndpoint()`. Any
170
+ `(request, info) => AuthContext | null` function composes with them.
171
+
172
+ The details live in
173
173
  [Channels](../reference/channels.md#auth-policies).
174
174
 
175
175
  Server-level flags interact with channel auth. `--bearer-token <secret>`
@@ -177,17 +177,15 @@ swaps the default for `bearerAuth` on every channel that doesn't author
177
177
  its own chain, and `--allow-anonymous` swaps it for `allowAll()`
178
178
  (trusted networks only). Authored `auth` arrays always win over both.
179
179
 
180
- ## Hosted aliases need an alias-token relay
180
+ ## Receive signed webhooks on managed hosting
181
181
 
182
182
  Cursor-managed deployments expose a stable alias URL. External callers
183
- must send `X-Agent-Alias-Token` on every request to that URL. Channel
184
- auth still runs after the alias gate.
183
+ normally send `X-Agent-Alias-Token` on every request. Webhook providers
184
+ often cannot set it.
185
185
 
186
- Webhook providers that cannot attach custom headers cannot POST
187
- straight at a managed alias. Put a relay (or other authenticating
188
- intermediary) in front, use a Cursor-managed ingress path that does not
189
- use the public alias (for example Cursor Slack / GitHub event relay),
190
- or self-host. See [Deployment](../deployment.md#use-the-hosted-agent).
186
+ Add `publicEndpoint()` to a custom channel that verifies its own provider
187
+ signature. Only that channel path skips the alias token. Session and tool
188
+ routes stay private. See [Deployment](../deployment.md#use-the-hosted-agent).
191
189
 
192
190
  ## Example: Linear as the control plane
193
191
 
@@ -218,7 +216,7 @@ Author `agent/channels/linear.ts`:
218
216
  ```ts
219
217
  import { Buffer } from "node:buffer";
220
218
  import { createHmac, timingSafeEqual } from "node:crypto";
221
- import { allowAll, defineChannel, POST } from "@cursor/july/channels";
219
+ import { defineChannel, POST, publicEndpoint } from "@cursor/july/channels";
222
220
  import { z } from "zod";
223
221
 
224
222
  const secret = process.env.LINEAR_WEBHOOK_SECRET ?? "";
@@ -275,8 +273,7 @@ function issueIdFromToken(token: string | null): string | null {
275
273
  }
276
274
 
277
275
  export default defineChannel({
278
- // The HMAC check is the request auth, so admit everything at the route.
279
- auth: [allowAll()],
276
+ auth: [publicEndpoint()],
280
277
  routes: [
281
278
  POST("/", {
282
279
  description: "Linear webhook ingress",
@@ -188,6 +188,10 @@ non-null wins, and a request no policy admits gets `401`.
188
188
  | `loopbackOnly()` | A loopback TCP peer, ignoring forwarding headers; for dev relays that legitimately carry them, like `gh webhook forward`. |
189
189
  | `bearerAuth(token)` | `Authorization: Bearer <token>`, compared in constant time. Also accepts a verifier function mapping a presented token to an `AuthContext`. |
190
190
  | `allowAll()` | Everyone, as an `anonymous` principal. Only for surfaces protected upstream (an HMAC-verified webhook) or intentionally public. |
191
+ | `publicEndpoint()` | Everyone on this custom channel. Managed hosting also serves the channel without an alias token. Use it only when the handler verifies the provider signature. |
192
+
193
+ `publicEndpoint()` applies only to custom channel routes. It does not open
194
+ the built-in session or tool API.
191
195
 
192
196
  The resolved `AuthContext` (`{ authenticator, principalId,
193
197
  principalType, attributes? }`) becomes the request principal. Sessions
@@ -45,6 +45,7 @@ also provide `agent-sdk slack help` and `agent-sdk github help`.
45
45
  | [`deployments`](#deployments) | List hosted deployments |
46
46
  | [`deployment`](#deployment) | Inspect one hosted deployment |
47
47
  | [`stop`](#stop) | Stop a hosted deployment |
48
+ | [`delete`](#delete) | Delete a hosted deployment |
48
49
  | [`rotate-token`](#rotate-token) | Replace a deployment's alias token |
49
50
  | [`rotate-pod-credential`](#rotate-pod-credential) | Replace a deployment's pod credential |
50
51
  | [`secrets`](#secrets) | Manage deployment secrets |
@@ -104,7 +105,7 @@ agent-sdk serve [--dir <path>] [--port 3000] [--host 127.0.0.1] [--dev]
104
105
  If `--dir` is an agent project, it mounts under its directory name. If
105
106
  it contains agent projects, each child mounts separately. The index
106
107
  lives at `/`. Each agent is available at `/<slug>/v1/*` and
107
- `/<slug>/playground`. On a TTY, press Enter to reload agent code.
108
+ `/<slug>/playground`. On a TTY, press Enter to restart.
108
109
  Unless `--state-root` is set, each mount uses
109
110
  `<agent-project>/.agent-serve`; slugged mounts use
110
111
  `<agent-project>/.agent-serve/<slug>`.
@@ -399,8 +400,9 @@ between 1 and 200. Timeout priority is the case's `timeoutMs`, the CLI's
399
400
  | `--no-wait` | Return with the Eval ID as soon as a `--prod` or `--url` batch is accepted. |
400
401
  | `--timeout-ms <n>` | Per-case timeout override. |
401
402
 
402
- Failed cases exit `1`; no matching cases exit `2`. See
403
- [Evals](../evals.md).
403
+ Failed cases exit `1`. A scored case also exits `1` under `--strict`.
404
+ No matching cases exit `2`. `eval status` exits `3` while the remote batch
405
+ is still running.
404
406
 
405
407
  ## trajectory
406
408
 
@@ -452,9 +454,9 @@ the browser flow. It then prints the `cd`, `agent-sdk login`, and
452
454
  `agent-sdk dev` steps still needed.
453
455
 
454
456
  With `--json`, `init` still installs dependencies but never blocks on
455
- login or skill installation. It prints
456
- `{ ok, directory, created, skipped, installed, installError, next }`
457
- (with `login` in `next` when unsigned).
457
+ login or skill installation. It prints `{ ok, directory, template, created,
458
+ skipped, installed, installError, cliOnPath, cliLinkError, next }`. The
459
+ `next` list includes `login` when the host is unsigned.
458
460
 
459
461
  ## convert-automation
460
462
 
@@ -673,6 +675,17 @@ agent-sdk stop <slug> [--team <id>] [--no-wait] [--json]
673
675
  The command polls for up to ten minutes until the status reaches
674
676
  `stopped`. `--no-wait` returns after the stop request is accepted.
675
677
 
678
+ ## delete
679
+
680
+ `delete` removes a deployment.
681
+
682
+ ```bash
683
+ agent-sdk delete <slug> [--team <id>] [--no-wait] [--json]
684
+ ```
685
+
686
+ The command waits until the deployment is gone. `--no-wait` returns after
687
+ the delete request is accepted.
688
+
676
689
  ## rotate-token
677
690
 
678
691
  `rotate-token` replaces the alias token used by callers and the hosted
@@ -807,7 +820,8 @@ agent-sdk slack setup
807
820
  agent-sdk slack create [--dir <path>] [--name <name>] [--prod]
808
821
  [--slack-team <T…>] [--team <id>]
809
822
  [--icon <https-url-or-file>]
810
- [--prefix <prefix> | --no-prefix] [--json]
823
+ [--prefix <prefix> | --no-prefix]
824
+ [--channel-posts] [--json]
811
825
  agent-sdk slack destroy [--dir <path>] [--prod] [--slack-team <T…>]
812
826
  [--team <id>] [--json]
813
827
  agent-sdk slack icon <https-url-or-file> [--dir <path>] [--prod]
@@ -104,17 +104,9 @@ attaching them without an identity.
104
104
 
105
105
  ## Advertise a connection's tools by name (`advertiseTools`) {#advertise-tools}
106
106
 
107
- Attached MCP servers sit behind the harness MCP meta-tools. The model does
108
- not see names like `Datadog-search_datadog_dashboards` until you set
109
- `advertiseTools: true`. Use that flag when playground or local chat should
110
- call the tools by name.
111
-
112
- The engine lists the connection at turn-build time and synthesizes a named
113
- 1:1 passthrough server tool per entry, using the server's names,
114
- descriptions, and live schemas. Those merge into the authored
115
- `agent/tools/` catalog. The raw connection is then not attached to the
116
- model (it stays available on `host.mcp`), so each tool appears exactly
117
- once.
107
+ Set `advertiseTools: true` when the model should call an MCP server's tools
108
+ by name. The Agent SDK preserves each tool's name, description, input and
109
+ output schemas, and MCP annotations.
118
110
 
119
111
  ```ts
120
112
  export default defineConnection({
@@ -124,20 +116,12 @@ export default defineConnection({
124
116
  });
125
117
  ```
126
118
 
127
- Fail-closed, by design: a `listTools` failure, an invalid tool name, or a
128
- name collision (with an authored tool or another advertised connection)
129
- fails the turn. A turn never silently runs with a shrunken toolset.
130
- Listing runs once per turn, so point this at endpoints that answer
131
- `tools/list` cheaply. Connections with `auth` are listed and called
132
- through one-off clients carrying that session's headers. Auth-less ones
133
- (including Cursor account connections) go through the shared host
134
- registry. Local runtime only, like all server tools, and not combinable
135
- with `hostOnly`. Advertising puts the tools in the model's toolset.
136
- `hostOnly` keeps them off the model. `GET /v1/info` reports
137
- `advertiseTools` on the connection. The per-tool list is built per turn,
138
- not on the static catalog, the peer-agent MCP server, or cloud
139
- `agentsdk-tools`, and those advertised tools cannot be invoked via direct
140
- tool calls.
119
+ A listing failure, invalid tool name, or name collision fails the turn.
120
+ Advertised tools follow the same runtime support as server tools. They cannot
121
+ be combined with `hostOnly` or called through the direct tool API.
122
+
123
+ In a dry-run session, MCP tools marked read-only run normally. Tools marked
124
+ as writes are stubbed. Tools without effect annotations are unavailable.
141
125
 
142
126
  ## Local stdio MCP server
143
127
 
@@ -212,13 +196,10 @@ The host must be signed in (`agent-sdk login` or `CURSOR_API_KEY`).
212
196
  `serve` fails fast at startup otherwise, and logs each connector's live
213
197
  status (`connected`, `needsAuth`, `error`) as it starts.
214
198
 
215
- Local turns and host-side calls go through a loopback bridge guarded by
216
- a per-startup secret. Cloud-runtime turns reach the same bridge through
217
- the serve `--public-url`, so `servers` filters apply there too. A
218
- cloud-capable agent that combines a concrete `servers` allowlist with no
219
- `--public-url` fails at startup rather than running unfiltered. Backend
220
- execution covers the account's HTTP/SSE servers. Stdio servers can't run
221
- server-side, so author a `{ command }` MCP connection for those.
199
+ Filtered account connections work on managed cloud deployments. A
200
+ self-hosted cloud agent with a concrete `servers` list needs `--public-url`.
201
+ Serve fails instead of ignoring the filter. Use a `{ command }` connection
202
+ for stdio servers.
222
203
 
223
204
  > [!CAUTION]
224
205
  > Whoever can talk to the agent can drive these connectors, because they
@@ -49,6 +49,14 @@ The response returns as soon as the message is accepted; follow the
49
49
  stream for progress. The continuation token is the follow-up credential,
50
50
  and `playgroundUrl` deep-links the session in the playground.
51
51
 
52
+ | Body field | Meaning |
53
+ | --- | --- |
54
+ | `message` | Required user message |
55
+ | `title` | Session title |
56
+ | `dryRun` | Run read tools and stub write tools |
57
+ | `workspaceFiles` | UTF-8 files written into the session workspace |
58
+ | `cloud` | Per-session cloud options merged over the agent defaults |
59
+
52
60
  ## Send a follow-up
53
61
 
54
62
  `POST /v1/session/:sessionId` continues an existing conversation.
@@ -62,13 +70,10 @@ curl -X POST http://127.0.0.1:3000/<slug>/v1/session/ses_… \
62
70
  Works for any chat session, including ones created by custom channels.
63
71
  Each accepted follow-up rotates the token, and the response carries the
64
72
  new one. Sending to a busy session interrupts the in-flight turn, waits
65
- for it to settle, then sends; when the turn can't be interrupted (for
66
- example, concurrent follow-ups racing), the request returns
67
- `409 session_busy`.
73
+ for it to settle, then sends.
68
74
 
69
- Expect `409` on a stale token, an uninterruptible busy session, or a
70
- task/schedule session (those aren't followable), and `403` when the
71
- caller isn't the session owner.
75
+ Expect `409` on a stale token or a task session. Task sessions do not accept
76
+ follow-ups. Expect `403` when the caller is not the session owner.
72
77
 
73
78
  ## Stream a session
74
79
 
@@ -85,8 +90,8 @@ resume without duplicates. The stream is durable and reconnectable. For
85
90
  the vocabulary, see
86
91
  [Sessions](./sessions.md#which-events-can-i-stream).
87
92
 
88
- `GET /v1/session/:sessionId/events` returns the same content as a
89
- one-shot dump with no live follow.
93
+ `GET /v1/session/:sessionId/events` returns a one-shot NDJSON dump.
94
+ Pass `?format=json` for `{ sessionId, events, playgroundUrl }`.
90
95
 
91
96
  ## Stop and list
92
97
 
@@ -254,7 +259,7 @@ Error responses use a small, consistent set of status codes.
254
259
  | `403` | Authenticated, but not the session owner |
255
260
  | `404` | Unknown session, tool, schedule, reminder, or eval run; no eval datapoints match a run request |
256
261
  | `405` | Wrong method (GET on the MCP endpoint, say) |
257
- | `409` | Stale continuation token, busy session (`session_busy`), a non-followable task session, or an eval run already in progress |
262
+ | `409` | Stale continuation token, a busy session-bound tool call, a non-followable task session, or an eval run already in progress |
258
263
  | `202` | Accepted for background work (GitHub `{ task }` hooks, eval runs) |
259
264
 
260
265
  ## What's next
@@ -115,7 +115,6 @@ export default defineTool({
115
115
  description: "Read the current weather.",
116
116
  inputSchema: z.object({ city: z.string() }),
117
117
  outputSchema: Weather,
118
- effect: "read",
119
118
  async execute({ city }) {
120
119
  return { city, temperatureF: 72 };
121
120
  },
@@ -148,8 +147,7 @@ export default defineTool({
148
147
  ```
149
148
 
150
149
  `dryRunResult` keeps the result shape stable. Without it, a stubbed write
151
- returns `"Operation acknowledged."`. Its `action.result` event has
152
- `stubbed: true`.
150
+ returns `"Operation acknowledged."`. Traces mark the result as stubbed.
153
151
 
154
152
  ## Define an agent tool
155
153
 
@@ -67,11 +67,9 @@ curl -X POST http://127.0.0.1:3000/triage-agent/v1/channels/queue/issue \
67
67
  `POST /v1/channels/queue/issue` accepts
68
68
  `{ identifier, title?, description? }` from the playground.
69
69
 
70
- Hosted Cursor aliases require `X-Agent-Alias-Token`, which Linear and
71
- Jira cannot send. For create webhooks, self-host, set
72
- `LINEAR_WEBHOOK_SECRET` or `JIRA_WEBHOOK_SECRET`, and POST the signed
73
- body to `/v1/channels/webhook`. The channel ACKs immediately and
74
- coalesces retries onto the same issue.
70
+ For create webhooks, set `LINEAR_WEBHOOK_SECRET` or
71
+ `JIRA_WEBHOOK_SECRET`. Point the provider at the deployed alias under
72
+ `/v1/channels/webhook`. Signed events start or resume triage for that issue.
75
73
 
76
74
  `record_triage` comments on the issue in the continuation key, not
77
75
  whatever identifier the model copies out of the ticket body.
@@ -41,7 +41,7 @@ Match your symptom below. Keep the commands as `agent-sdk`; see
41
41
 
42
42
  | What you see | What to do |
43
43
  | --- | --- |
44
- | `409` on a follow-up message | Refresh the `continuationToken` (it rotates on each accepted follow-up), wait if the session is busy, or confirm the session is a chat session (task and schedule sessions are not followable). |
44
+ | `409` on a follow-up message | Refresh the `continuationToken` or confirm the session is a chat session. Task sessions do not accept follow-ups. |
45
45
  | `409 session_busy` on `call --session` | Wait for the model turn to finish, or omit `--session` for a one-off call. |
46
46
  | `403` on stream or follow-up | Use the same auth identity that created the session. Off localhost, pass `--bearer-token` and send it on every request. |
47
47
  | Works on localhost; blocked through a tunnel or LAN | Default auth allows only direct loopback callers. Share the host with `--bearer-token <secret>` (or authored `bearerAuth`). Use `--allow-anonymous` only on a trusted private network. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cursor/july",
3
- "version": "0.1.90",
3
+ "version": "0.1.91",
4
4
  "description": "(early alpha) Filesystem-first framework for defining Cursor agents as markdown and TypeScript and serving them over channels with the Cursor SDK.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "repository": {
@@ -59,11 +59,11 @@ questions, concrete options, the recommended option listed first and labeled
59
59
 
60
60
  | Question | Options | Guidance |
61
61
  | --- | --- | --- |
62
- | **Runtime** | `local` (default) · `cloud` | Local = Cursor SDK harness on this machine; server tools, skills, sandbox seeds, and tool approvals all work. Cloud = Cursor cloud agents; needs `cloud.repos`, no server tools/skills/sandbox seeds (instructions are prepended to the first prompt). Recommend local unless the purpose needs a repo checkout on a cloud VM. |
62
+ | **Runtime** | `local` (default) · `cloud` | Local runs on this machine. Cloud runs on a Cursor cloud agent and needs `cloud.repos`. Server tools and skills work on both. Tool approvals and sandbox seeds are local only. Recommend local unless the purpose needs a cloud checkout. |
63
63
  | **Model** | `grok-4.5` with `effort=high`, `fast=true` (default) · Other model id | Effort and fast are params, not id suffixes: `{ id: "grok-4.5", params: [{ id: "effort", value: "high" }, { id: "fast", value: "true" }] }` — the SDK rejects suffix-style ids. |
64
64
  | **Channels** (multi) | playground + HTTP API only (always mounted) · Slack · GitHub webhooks · custom webhook · schedule (cron) | Slack has two connections: the Cursor-hosted connection (`cursorAccount: true` — zero Slack admin, recommended default) and a dedicated Socket Mode app (own bot user + one app/token pair per agent; needed for channel watching or approval buttons). When Slack is picked, resolve the connection with the Step 0 gate in `setup-slack/SKILL.md` — either fold its AskQuestion into this round or ask it before channel setup; default to Cursor-hosted when you cannot ask. GitHub verifies `X-Hub-Signature-256` when a secret is set. Discord/Teams packs do not exist yet — offer custom webhook instead. |
65
65
  | **MCP connections** (multi) | none · remote server (URL + header auth) · local stdio server · Cursor account connectors · Other | One file per server under `agent/mcp-connections/`; filename = server name. Do not name an account connection `cursor.ts` (collides with the IDE `cursor` namespace); use `account.ts`. Tokens via env vars, never hardcoded. Connections serve the model and host code (`ctx.host.mcp`). If the model should call them by name on local turns, set `advertiseTools: true`. Set `hostOnly: true` only when host tools call the server and the playground must not. |
66
- | **Capabilities** (multi) | server tools · agent tools (scripts) · skills · subagents · hooks · sandbox seed files · tool approvals (HITL) · evals (recommend) | Server tools, skills, sandbox seeds, approvals are local-runtime only. Agent tools (`execution: "agent"`) work on both runtimes. Always recommend at least one smoke eval. |
66
+ | **Capabilities** (multi) | server tools · agent tools (scripts) · skills · subagents · hooks · sandbox seed files · tool approvals (HITL) · evals (recommend) | Always recommend at least one smoke eval. |
67
67
 
68
68
  Close the round with a one-screen plan — chosen options plus the file tree you
69
69
  intend to create — and a final gate: "Scaffold it" / "Adjust something". Only
@@ -144,9 +144,8 @@ agent-sdk init ./<slug>
144
144
 
145
145
  `init` writes `package.json` (with `typescript` dev deps and a
146
146
  `check` script), `tsconfig.json`, `AGENTS.md`, `.gitignore`, `agent/agent.ts`,
147
- `agent/instructions.md`, a demo `agent/tools/echo.ts`, and empty capability
148
- folders (`skills/`, `channels/`, `evals/`, …) each with a `.gitkeep`; existing
149
- files are left alone (`exist`) and missing ones are filled in. It then
147
+ `agent/instructions.md`, a demo `agent/tools/echo.ts`, and
148
+ `agent/hooks/memory.ts`. Existing files are left alone (`exist`). It then
150
149
  runs `npm install`, and when the host is unsigned runs `login` and waits
151
150
  before printing `cd` (when needed) and `agent-sdk dev`. Then shape it to the
152
151
  plan:
@@ -261,8 +260,8 @@ loop starts deterministic.
261
260
 
262
261
  - Interview → plan gate → scaffold → verify → channel setup → hillclimb
263
262
  handoff. Do not skip verification because the files "look right".
264
- - Fill blanks yourself; re-ask only when an answer contradicts the framework
265
- (e.g. server tools on cloud runtime — `validate` warns about these).
263
+ - Fill blanks yourself. Re-ask only when an answer contradicts the framework,
264
+ such as approval-gated tools on the cloud runtime.
266
265
  - Do not deploy, post to real Slack/GitHub surfaces beyond the smoke tests the
267
266
  user asked for, or commit without being asked.
268
267
  - Keep the first cut reviewable: if the plan grows past ~10 files, cut scope
@@ -77,10 +77,11 @@ the serve host; `runtime: "cloud"` runs them on Cursor cloud agents
77
77
 
78
78
  | Capability | local | cloud |
79
79
  | --- | --- | --- |
80
- | Server tools (`execution: "server"`), approvals | yes | **no** |
80
+ | Server tools (`execution: "server"`) | yes | yes on managed hosting; self-hosted needs `--public-url` |
81
+ | Tool approvals | yes | no |
81
82
  | Agent tools (`execution: "agent"` scripts) | yes | yes |
82
- | Skills | yes | yes (Agent Store native discovery) |
83
- | sandbox seeds | yes | only if in the cloud repo |
83
+ | Skills | yes | yes |
84
+ | sandbox seeds | yes | no |
84
85
  | Instructions | `AGENTS.md` in session workspace | prepended to first prompt |
85
86
  | Checkout of a repo/PR | you arrange it | the VM carries it |
86
87
 
@@ -93,9 +94,8 @@ scale, use cloud and keep the host to routing, briefs, and bookkeeping.
93
94
 
94
95
  Two handles, two owners:
95
96
 
96
- - **continuationToken** channel-owned conversation key. Same token =
97
- same durable session (a Slack `channelId:threadTs`, a `pr:owner/repo#N`).
98
- Rotates on each accepted HTTP follow-up; stale tokens get `409`.
97
+ - **continuationToken:** credential for continuing a conversation. HTTP
98
+ follow-ups rotate it; stale tokens get `409`.
99
99
  - **sessionId** — runtime-owned handle for streaming/inspection
100
100
  (`GET /v1/session/:id/stream?startIndex=N`, durable NDJSON replay).
101
101
 
@@ -303,7 +303,7 @@ a mention), opt in explicitly:
303
303
  export default slackChannel({
304
304
  engagement: {
305
305
  channelPosts: {
306
- allow: ["#issues-cursor-desktop"], // explicit allowlist; no wildcard exists
306
+ allow: ["#issues-cursor-desktop"], // use ["*"] for every joined channel
307
307
  posts: "top-level", // default — thread replies never dispatch
308
308
  debounceMs: 15_000, // optional: edits settle, deletes cancel
309
309
  },
@@ -2,7 +2,7 @@
2
2
  * Opt-in channel watch: dispatch on posts in allowlisted channels.
3
3
  *
4
4
  * Filtering rules (the anti-slop guarantees):
5
- * - Only explicitly allowlisted channels are watched no wildcard.
5
+ * - Only configured channels are watched; `"*"` opts into every channel.
6
6
  * - Top-level posts only by default; thread replies never dispatch unless
7
7
  * `posts: "all"` is configured.
8
8
  * - Posts that @mention the bot are skipped here (the `app_mention` path
@@ -233,7 +233,7 @@ export function slackChannel<const Name extends string = string>(
233
233
  const entries = channelPosts.allow.filter((entry) => entry.trim() !== "");
234
234
  if (entries.length === 0) {
235
235
  throw new Error(
236
- "slackChannel engagement.channelPosts.allow must list at least one channel (id or #name); there is no wildcard watch."
236
+ 'slackChannel engagement.channelPosts.allow must list at least one channel (id, #name, or "*").'
237
237
  );
238
238
  }
239
239
  }
@@ -324,10 +324,8 @@ export type SlackBlockActionHandler = (
324
324
  | Promise<SlackDispatchDecision | null | undefined>;
325
325
 
326
326
  /**
327
- * Opt-in channel watch: dispatch on posts in explicitly allowlisted
328
- * channels without requiring an @mention. There is deliberately no
329
- * "every channel the bot is in" wildcard — watching a channel is a
330
- * per-channel decision.
327
+ * Opt-in channel watch: dispatch on posts in configured channels without an
328
+ * @mention. Use `"*"` for every channel the bot has joined.
331
329
  */
332
330
  export interface SlackChannelPostsOptions {
333
331
  /**