@cursor/july 0.1.89 → 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 (346) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +98 -96
  3. package/dist/ab.d.ts +1 -1
  4. package/dist/ab.js +1 -1
  5. package/dist/artifacts.d.ts +1 -1
  6. package/dist/artifacts.js +1 -1
  7. package/dist/bin/agent-serve.js +20 -7
  8. package/dist/channels/slack/channel-watch.d.ts +1 -1
  9. package/dist/channels/slack/channel-watch.js +1 -1
  10. package/dist/channels/slack/slack-channel.js +1 -1
  11. package/dist/channels/slack/types.d.ts +2 -4
  12. package/dist/channels/slack/types.d.ts.map +1 -1
  13. package/dist/channels.d.ts +1 -1
  14. package/dist/channels.js +1 -1
  15. package/dist/connections.d.ts +1 -1
  16. package/dist/connections.js +1 -1
  17. package/dist/docs/404.html +3 -3
  18. package/dist/docs/ab.html +7 -7
  19. package/dist/docs/assets/{ab.md.DYjwREAP.js → ab.md.CVzWxLoB.js} +1 -1
  20. package/dist/docs/assets/{ab.md.DYjwREAP.lean.js → ab.md.CVzWxLoB.lean.js} +1 -1
  21. package/dist/docs/assets/{app.DUOPbN18.js → app.Bci6CM9E.js} +1 -1
  22. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.js → building-with-agents.md.DH8A_cHA.js} +1 -1
  23. package/dist/docs/assets/{building-with-agents.md.PeZaZA1P.lean.js → building-with-agents.md.DH8A_cHA.lean.js} +1 -1
  24. package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +1 -0
  25. package/dist/docs/assets/chunks/{VPLocalSearchBox.CmWbGcGk.js → VPLocalSearchBox.BCPT6xA-.js} +1 -1
  26. package/dist/docs/assets/chunks/{framework.CAZyNGu9.js → framework.BCISBCiQ.js} +1 -1
  27. package/dist/docs/assets/chunks/theme.BEA8BF3c.js +2 -0
  28. package/dist/docs/assets/{concepts.md.BXAm6G-C.js → concepts.md.CRfU3bVg.js} +1 -1
  29. package/dist/docs/assets/{concepts.md.BXAm6G-C.lean.js → concepts.md.CRfU3bVg.lean.js} +1 -1
  30. package/dist/docs/assets/{deployment.md.B8kW-h7P.js → deployment.md.DX_hc3ze.js} +6 -5
  31. package/dist/docs/assets/{deployment.md.B8kW-h7P.lean.js → deployment.md.DX_hc3ze.lean.js} +1 -1
  32. package/dist/docs/assets/{evals.md.CVe_O75-.js → evals.md.a0SMN6r9.js} +3 -3
  33. package/dist/docs/assets/{evals.md.CVe_O75-.lean.js → evals.md.a0SMN6r9.lean.js} +1 -1
  34. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.js → example-agents_approval-buddy.md.DNL83puR.js} +1 -1
  35. package/dist/docs/assets/{example-agents_approval-buddy.md.CIiZ9coo.lean.js → example-agents_approval-buddy.md.DNL83puR.lean.js} +1 -1
  36. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.js → example-agents_benny.md.C40vHRLc.js} +1 -1
  37. package/dist/docs/assets/{example-agents_benny.md.B-LIDGja.lean.js → example-agents_benny.md.C40vHRLc.lean.js} +1 -1
  38. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.js → example-agents_bugbot.md.BRGMi9O2.js} +1 -1
  39. package/dist/docs/assets/{example-agents_bugbot.md.Dp5JqHSQ.lean.js → example-agents_bugbot.md.BRGMi9O2.lean.js} +1 -1
  40. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.js → example-agents_codebase-wiki.md.Dftj_tPp.js} +1 -1
  41. package/dist/docs/assets/{example-agents_codebase-wiki.md.D-lteFf0.lean.js → example-agents_codebase-wiki.md.Dftj_tPp.lean.js} +1 -1
  42. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.js → example-agents_codeowners-review.md.Bfta-lBU.js} +1 -1
  43. package/dist/docs/assets/{example-agents_codeowners-review.md.BU2ZXLf-.lean.js → example-agents_codeowners-review.md.Bfta-lBU.lean.js} +1 -1
  44. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.js → example-agents_concierge.md.MrKpQndp.js} +1 -1
  45. package/dist/docs/assets/{example-agents_concierge.md.DA2al_NK.lean.js → example-agents_concierge.md.MrKpQndp.lean.js} +1 -1
  46. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.js → example-agents_fsd.md.ZWHWWZPE.js} +1 -1
  47. package/dist/docs/assets/{example-agents_fsd.md.ZeGEpAw_.lean.js → example-agents_fsd.md.ZWHWWZPE.lean.js} +1 -1
  48. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +2 -0
  49. package/dist/docs/assets/{example-agents_index.md.xmJ87d_3.lean.js → example-agents_index.md.QZ8mhr6n.lean.js} +1 -1
  50. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.js → example-agents_knowledge-base.md.DqKqHQ9u.js} +1 -1
  51. package/dist/docs/assets/{example-agents_knowledge-base.md.IneynQSR.lean.js → example-agents_knowledge-base.md.DqKqHQ9u.lean.js} +1 -1
  52. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.js → example-agents_oncall.md.DK4XkYTd.js} +1 -1
  53. package/dist/docs/assets/{example-agents_oncall.md.CBmyuAKc.lean.js → example-agents_oncall.md.DK4XkYTd.lean.js} +1 -1
  54. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.js → example-agents_security-reviewer.md.Bai6D0Ee.js} +4 -4
  55. package/dist/docs/assets/{example-agents_security-reviewer.md.DBL1TwtP.lean.js → example-agents_security-reviewer.md.Bai6D0Ee.lean.js} +1 -1
  56. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.js → example-agents_slack-agent.md.D7Kdj5BV.js} +1 -1
  57. package/dist/docs/assets/{example-agents_slack-agent.md.06jQXTAI.lean.js → example-agents_slack-agent.md.D7Kdj5BV.lean.js} +1 -1
  58. package/dist/docs/assets/{example-agents_weather-agent.md.DC3lINjo.js → example-agents_weather-agent.md.lVEAbWFf.js} +5 -5
  59. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +1 -0
  60. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.js → guides_agent-to-agent.md.BCeVdJRJ.js} +1 -1
  61. package/dist/docs/assets/{guides_agent-to-agent.md.Bmbxy-FA.lean.js → guides_agent-to-agent.md.BCeVdJRJ.lean.js} +1 -1
  62. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.js → guides_cloud-runtime.md.BSMLIBHr.js} +1 -1
  63. package/dist/docs/assets/{guides_cloud-runtime.md.CbklWfzh.lean.js → guides_cloud-runtime.md.BSMLIBHr.lean.js} +1 -1
  64. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.js → guides_convert-automation.md.D06eIzea.js} +1 -1
  65. package/dist/docs/assets/{guides_convert-automation.md.BhMzTkE5.lean.js → guides_convert-automation.md.D06eIzea.lean.js} +1 -1
  66. package/dist/docs/assets/{guides_github.md.CLLQJKRB.js → guides_github.md.Cdt1s2QC.js} +4 -4
  67. package/dist/docs/assets/{guides_github.md.CLLQJKRB.lean.js → guides_github.md.Cdt1s2QC.lean.js} +1 -1
  68. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.js → guides_human-in-the-loop.md.By1G2T3_.js} +1 -1
  69. package/dist/docs/assets/{guides_human-in-the-loop.md.Cf8kIIqC.lean.js → guides_human-in-the-loop.md.By1G2T3_.lean.js} +1 -1
  70. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.js → guides_mcp-oauth.md.Du0f7pGU.js} +1 -1
  71. package/dist/docs/assets/{guides_mcp-oauth.md.CzEB6RaG.lean.js → guides_mcp-oauth.md.Du0f7pGU.lean.js} +1 -1
  72. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.js → guides_opentelemetry.md.bmPmkvJu.js} +1 -1
  73. package/dist/docs/assets/{guides_opentelemetry.md.Csn7ZI25.lean.js → guides_opentelemetry.md.bmPmkvJu.lean.js} +1 -1
  74. package/dist/docs/assets/{guides_slack.md.DP4H75WP.js → guides_slack.md.DiUmk_Oi.js} +5 -5
  75. package/dist/docs/assets/{guides_slack.md.DP4H75WP.lean.js → guides_slack.md.DiUmk_Oi.lean.js} +1 -1
  76. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.js → guides_webhooks.md.BpnIdO0i.js} +5 -6
  77. package/dist/docs/assets/{guides_webhooks.md.DB-r_er9.lean.js → guides_webhooks.md.BpnIdO0i.lean.js} +1 -1
  78. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.js → hillclimbing.md.ywF3yDAd.js} +1 -1
  79. package/dist/docs/assets/{hillclimbing.md.yXqdlv2R.lean.js → hillclimbing.md.ywF3yDAd.lean.js} +1 -1
  80. package/dist/docs/assets/index.md.BAaMXLFd.js +5 -0
  81. package/dist/docs/assets/{index.md.DhRHS_-L.lean.js → index.md.BAaMXLFd.lean.js} +1 -1
  82. package/dist/docs/assets/{quickstart.md.DZxBu44y.js → quickstart.md.DsrarzEg.js} +1 -1
  83. package/dist/docs/assets/{quickstart.md.DZxBu44y.lean.js → quickstart.md.DsrarzEg.lean.js} +1 -1
  84. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.js → reference_agent-config.md.Bqylgw50.js} +1 -1
  85. package/dist/docs/assets/{reference_agent-config.md.CTWp4DnU.lean.js → reference_agent-config.md.Bqylgw50.lean.js} +1 -1
  86. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.js → reference_artifacts.md.Dior32Qw.js} +1 -1
  87. package/dist/docs/assets/{reference_artifacts.md.BGG4bZo-.lean.js → reference_artifacts.md.Dior32Qw.lean.js} +1 -1
  88. package/dist/docs/assets/{reference_channels.md.CboFd5IH.js → reference_channels.md.DQZjCnyh.js} +2 -2
  89. package/dist/docs/assets/{reference_channels.md.CboFd5IH.lean.js → reference_channels.md.DQZjCnyh.lean.js} +1 -1
  90. package/dist/docs/assets/{reference_cli.md.TAaYU8br.js → reference_cli.md.B7GkAJRC.js} +8 -7
  91. package/dist/docs/assets/{reference_cli.md.TAaYU8br.lean.js → reference_cli.md.B7GkAJRC.lean.js} +1 -1
  92. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.js → reference_connections.md.DYidrb-j.js} +5 -5
  93. package/dist/docs/assets/{reference_connections.md.Cu3N-S3Q.lean.js → reference_connections.md.DYidrb-j.lean.js} +1 -1
  94. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.js → reference_hooks.md.B9FSgdDe.js} +1 -1
  95. package/dist/docs/assets/{reference_hooks.md.DJE5DXcT.lean.js → reference_hooks.md.B9FSgdDe.lean.js} +1 -1
  96. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.js → reference_http-api.md.CSHVobzG.js} +4 -4
  97. package/dist/docs/assets/{reference_http-api.md.DMbdFGVQ.lean.js → reference_http-api.md.CSHVobzG.lean.js} +1 -1
  98. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.js → reference_instructions.md.DhNCOl7r.js} +1 -1
  99. package/dist/docs/assets/{reference_instructions.md.CgoV-YEb.lean.js → reference_instructions.md.DhNCOl7r.lean.js} +1 -1
  100. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.js → reference_playground.md.Dfb92yQf.js} +1 -1
  101. package/dist/docs/assets/{reference_playground.md.CPZhfYaO.lean.js → reference_playground.md.Dfb92yQf.lean.js} +1 -1
  102. package/dist/docs/assets/{reference_project-layout.md.D3MdHM2z.js → reference_project-layout.md.CwkSbEWT.js} +5 -20
  103. package/dist/docs/assets/reference_project-layout.md.CwkSbEWT.lean.js +1 -0
  104. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.js → reference_prompt.md.DZUMtLPD.js} +1 -1
  105. package/dist/docs/assets/{reference_prompt.md.BaiweQxE.lean.js → reference_prompt.md.DZUMtLPD.lean.js} +1 -1
  106. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.js → reference_schedules.md.DNipebiG.js} +1 -1
  107. package/dist/docs/assets/{reference_schedules.md.gmfYzf_I.lean.js → reference_schedules.md.DNipebiG.lean.js} +1 -1
  108. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.js → reference_sessions.md.tUFzz98S.js} +1 -1
  109. package/dist/docs/assets/{reference_sessions.md.B0DdlM-K.lean.js → reference_sessions.md.tUFzz98S.lean.js} +1 -1
  110. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.js → reference_skills.md.B5ZEuHfG.js} +1 -1
  111. package/dist/docs/assets/{reference_skills.md.BRF2nDv9.lean.js → reference_skills.md.B5ZEuHfG.lean.js} +1 -1
  112. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.js → reference_subagents.md.Xoav0AII.js} +1 -1
  113. package/dist/docs/assets/{reference_subagents.md.DSrGLIuB.lean.js → reference_subagents.md.Xoav0AII.lean.js} +1 -1
  114. package/dist/docs/assets/{reference_tools.md.DTg_kEsx.js → reference_tools.md.wpaJtHn6.js} +23 -3
  115. package/dist/docs/assets/{reference_tools.md.DTg_kEsx.lean.js → reference_tools.md.wpaJtHn6.lean.js} +1 -1
  116. package/dist/docs/assets/{scaffolding-agents.md.CiGsJ1aw.js → scaffolding-agents.md.CRDDUtYJ.js} +1 -1
  117. package/dist/docs/assets/{scaffolding-agents.md.CiGsJ1aw.lean.js → scaffolding-agents.md.CRDDUtYJ.lean.js} +1 -1
  118. package/dist/docs/assets/{storage.md.ks1u64_R.js → storage.md.JbjlHWZ6.js} +1 -1
  119. package/dist/docs/assets/{storage.md.ks1u64_R.lean.js → storage.md.JbjlHWZ6.lean.js} +1 -1
  120. package/dist/docs/assets/{style.kTsvp4pE.css → style.BRuM8477.css} +1 -1
  121. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.js → templates_agentic-owners.md.DSJSIpWU.js} +1 -1
  122. package/dist/docs/assets/{templates_agentic-owners.md.BkTLORaU.lean.js → templates_agentic-owners.md.DSJSIpWU.lean.js} +1 -1
  123. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.js → templates_demo.md.DhFcWN6j.js} +1 -1
  124. package/dist/docs/assets/{templates_demo.md.Bgd6MBaZ.lean.js → templates_demo.md.DhFcWN6j.lean.js} +1 -1
  125. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.js → templates_pr-autofixer.md.1HAR3RXE.js} +1 -1
  126. package/dist/docs/assets/{templates_pr-autofixer.md.DcmoeUNZ.lean.js → templates_pr-autofixer.md.1HAR3RXE.lean.js} +1 -1
  127. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.js → templates_security-reviewer.md.ByFyRta2.js} +1 -1
  128. package/dist/docs/assets/{templates_security-reviewer.md.C0yIUaYs.lean.js → templates_security-reviewer.md.ByFyRta2.lean.js} +1 -1
  129. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.js → templates_triage.md.CVlpctKS.js} +2 -2
  130. package/dist/docs/assets/{templates_triage.md.DWuQ1bZz.lean.js → templates_triage.md.CVlpctKS.lean.js} +1 -1
  131. package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +1 -0
  132. package/dist/docs/assets/{troubleshooting.md.KgmmaCgw.lean.js → troubleshooting.md.DYECCZiJ.lean.js} +1 -1
  133. package/dist/docs/building-with-agents.html +7 -7
  134. package/dist/docs/concepts.html +7 -7
  135. package/dist/docs/deployment.html +11 -10
  136. package/dist/docs/evals.html +8 -8
  137. package/dist/docs/example-agents/approval-buddy.html +7 -7
  138. package/dist/docs/example-agents/benny.html +7 -7
  139. package/dist/docs/example-agents/bugbot.html +7 -7
  140. package/dist/docs/example-agents/codebase-wiki.html +7 -7
  141. package/dist/docs/example-agents/codeowners-review.html +7 -7
  142. package/dist/docs/example-agents/concierge.html +7 -7
  143. package/dist/docs/example-agents/fsd.html +7 -7
  144. package/dist/docs/example-agents/index.html +7 -7
  145. package/dist/docs/example-agents/knowledge-base.html +7 -7
  146. package/dist/docs/example-agents/oncall.html +7 -7
  147. package/dist/docs/example-agents/security-reviewer.html +10 -10
  148. package/dist/docs/example-agents/slack-agent.html +7 -7
  149. package/dist/docs/example-agents/weather-agent.html +12 -12
  150. package/dist/docs/guides/agent-to-agent.html +7 -7
  151. package/dist/docs/guides/cloud-runtime.html +7 -7
  152. package/dist/docs/guides/convert-automation.html +7 -7
  153. package/dist/docs/guides/github.html +9 -9
  154. package/dist/docs/guides/human-in-the-loop.html +7 -7
  155. package/dist/docs/guides/mcp-oauth.html +7 -7
  156. package/dist/docs/guides/opentelemetry.html +7 -7
  157. package/dist/docs/guides/slack.html +10 -10
  158. package/dist/docs/guides/webhooks.html +10 -11
  159. package/dist/docs/hashmap.json +1 -1
  160. package/dist/docs/hillclimbing.html +7 -7
  161. package/dist/docs/index.html +8 -8
  162. package/dist/docs/quickstart.html +7 -7
  163. package/dist/docs/reference/agent-config.html +7 -7
  164. package/dist/docs/reference/artifacts.html +7 -7
  165. package/dist/docs/reference/channels.html +8 -8
  166. package/dist/docs/reference/cli.html +13 -12
  167. package/dist/docs/reference/connections.html +10 -10
  168. package/dist/docs/reference/hooks.html +7 -7
  169. package/dist/docs/reference/http-api.html +10 -10
  170. package/dist/docs/reference/instructions.html +7 -7
  171. package/dist/docs/reference/playground.html +7 -7
  172. package/dist/docs/reference/project-layout.html +10 -25
  173. package/dist/docs/reference/prompt.html +7 -7
  174. package/dist/docs/reference/schedules.html +7 -7
  175. package/dist/docs/reference/sessions.html +7 -7
  176. package/dist/docs/reference/skills.html +7 -7
  177. package/dist/docs/reference/subagents.html +7 -7
  178. package/dist/docs/reference/tools.html +29 -9
  179. package/dist/docs/scaffolding-agents.html +7 -7
  180. package/dist/docs/storage.html +7 -7
  181. package/dist/docs/templates/agentic-owners.html +7 -7
  182. package/dist/docs/templates/demo.html +7 -7
  183. package/dist/docs/templates/pr-autofixer.html +7 -7
  184. package/dist/docs/templates/security-reviewer.html +7 -7
  185. package/dist/docs/templates/triage.html +8 -8
  186. package/dist/docs/troubleshooting.html +7 -7
  187. package/dist/evals.d.ts +1 -1
  188. package/dist/evals.js +1 -1
  189. package/dist/hooks.d.ts +1 -1
  190. package/dist/hooks.js +1 -1
  191. package/dist/index.d.ts +2 -2
  192. package/dist/index.js +2 -2
  193. package/dist/internal/cli-convert-automation.d.ts +1 -1
  194. package/dist/internal/cli-convert-automation.js +1 -1
  195. package/dist/internal/cli-cursor.d.ts +12 -4
  196. package/dist/internal/cli-cursor.d.ts.map +1 -1
  197. package/dist/internal/cli-cursor.js +11 -4
  198. package/dist/internal/cli-deploy.d.ts.map +1 -1
  199. package/dist/internal/cli-deploy.js +21 -3
  200. package/dist/internal/convert-automation/convert-workflow.d.ts +1 -1
  201. package/dist/internal/convert-automation/convert-workflow.js +9 -9
  202. package/dist/internal/convert-automation/types.d.ts +1 -1
  203. package/dist/internal/convert-automation/types.js +1 -1
  204. package/dist/internal/cursor/backend-client.d.ts +9 -1
  205. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  206. package/dist/internal/cursor/backend-client.js +19 -6
  207. package/dist/internal/cursor/credentials.d.ts +35 -9
  208. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  209. package/dist/internal/cursor/credentials.js +92 -39
  210. package/dist/internal/cursor-agent-template.d.ts +1 -1
  211. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  212. package/dist/internal/cursor-agent-template.js +1 -0
  213. package/dist/internal/deploy-client.d.ts +18 -0
  214. package/dist/internal/deploy-client.d.ts.map +1 -1
  215. package/dist/internal/deploy-client.js +25 -1
  216. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  217. package/dist/internal/deploy-manifest.js +5 -1
  218. package/dist/internal/discovery.d.ts +5 -1
  219. package/dist/internal/discovery.d.ts.map +1 -1
  220. package/dist/internal/discovery.js +17 -1
  221. package/dist/internal/distribution.d.ts +18 -0
  222. package/dist/internal/distribution.d.ts.map +1 -1
  223. package/dist/internal/distribution.js +19 -0
  224. package/dist/internal/eval-runner.js +1 -1
  225. package/dist/internal/grokbot/runner.d.ts +5 -2
  226. package/dist/internal/grokbot/runner.d.ts.map +1 -1
  227. package/dist/internal/grokbot/runner.js +10 -6
  228. package/dist/internal/http-channel.d.ts +2 -2
  229. package/dist/internal/http-channel.d.ts.map +1 -1
  230. package/dist/internal/http-channel.js +11 -31
  231. package/dist/internal/init-project.d.ts.map +1 -1
  232. package/dist/internal/init-project.js +10 -1
  233. package/dist/internal/sdk-runner.d.ts +5 -0
  234. package/dist/internal/sdk-runner.d.ts.map +1 -1
  235. package/dist/internal/sdk-runner.js +10 -5
  236. package/dist/internal/server.d.ts.map +1 -1
  237. package/dist/internal/server.js +80 -36
  238. package/dist/internal/session-engine.d.ts +8 -0
  239. package/dist/internal/session-engine.d.ts.map +1 -1
  240. package/dist/internal/session-engine.js +47 -5
  241. package/dist/playground/assets/index-D9N7-q97.css +1 -0
  242. package/dist/playground/assets/{index-BmiIjFlM.js → index-DDvyC2z6.js} +49 -49
  243. package/dist/playground/index.html +2 -2
  244. package/dist/reminders.d.ts +1 -1
  245. package/dist/reminders.js +1 -1
  246. package/dist/schedules.d.ts +1 -1
  247. package/dist/schedules.js +1 -1
  248. package/dist/skills.d.ts +1 -1
  249. package/dist/skills.js +1 -1
  250. package/dist/storage.d.ts +1 -1
  251. package/dist/storage.js +1 -1
  252. package/dist/tools.d.ts +1 -1
  253. package/dist/tools.js +1 -1
  254. package/dist/types.d.ts +10 -7
  255. package/dist/types.d.ts.map +1 -1
  256. package/dist/types.js +1 -1
  257. package/docs/README.md +3 -1
  258. package/docs/concepts.md +2 -1
  259. package/docs/deployment.md +9 -6
  260. package/docs/evals.md +1 -5
  261. package/docs/example-agents/codebase-wiki.md +2 -3
  262. package/docs/example-agents/fsd.md +1 -1
  263. package/docs/example-agents/index.md +2 -2
  264. package/docs/example-agents/knowledge-base.md +3 -3
  265. package/docs/example-agents/security-reviewer.md +17 -48
  266. package/docs/example-agents/weather-agent.md +14 -45
  267. package/docs/guides/github.md +7 -4
  268. package/docs/guides/slack.md +7 -2
  269. package/docs/guides/webhooks.md +12 -15
  270. package/docs/reference/channels.md +4 -0
  271. package/docs/reference/cli.md +21 -7
  272. package/docs/reference/connections.md +13 -32
  273. package/docs/reference/http-api.md +14 -9
  274. package/docs/reference/project-layout.md +5 -20
  275. package/docs/reference/tools.md +51 -3
  276. package/docs/scaffolding-agents.md +2 -0
  277. package/docs/templates/triage.md +3 -5
  278. package/docs/troubleshooting.md +1 -1
  279. package/package.json +2 -1
  280. package/skills/create-agent/SKILL.md +6 -7
  281. package/skills/framework-map/SKILL.md +6 -6
  282. package/skills/setup-slack/SKILL.md +1 -1
  283. package/src/ab.ts +1 -1
  284. package/src/artifacts.ts +1 -1
  285. package/src/bin/agent-serve.ts +20 -6
  286. package/src/channels/slack/channel-watch.ts +1 -1
  287. package/src/channels/slack/slack-channel.ts +1 -1
  288. package/src/channels/slack/types.ts +2 -4
  289. package/src/channels.ts +1 -1
  290. package/src/connections.ts +1 -1
  291. package/src/evals.ts +1 -1
  292. package/src/hooks.ts +1 -1
  293. package/src/index.ts +2 -2
  294. package/src/internal/cli-convert-automation.ts +1 -1
  295. package/src/internal/cli-cursor.ts +18 -5
  296. package/src/internal/cli-deploy.ts +27 -7
  297. package/src/internal/convert-automation/convert-workflow.ts +9 -9
  298. package/src/internal/convert-automation/types.ts +1 -1
  299. package/src/internal/cursor/backend-client.ts +29 -4
  300. package/src/internal/cursor/credentials.ts +87 -24
  301. package/src/internal/cursor-agent-template.ts +1 -0
  302. package/src/internal/deploy-client.ts +40 -1
  303. package/src/internal/deploy-manifest.ts +10 -1
  304. package/src/internal/discovery.ts +21 -1
  305. package/src/internal/distribution.ts +31 -0
  306. package/src/internal/eval-runner.ts +1 -1
  307. package/src/internal/grokbot/runner.ts +15 -6
  308. package/src/internal/http-channel.ts +14 -41
  309. package/src/internal/init-project.ts +13 -1
  310. package/src/internal/sdk-runner.ts +10 -4
  311. package/src/internal/server.ts +95 -33
  312. package/src/internal/session-engine.ts +58 -8
  313. package/src/reminders.ts +1 -1
  314. package/src/schedules.ts +1 -1
  315. package/src/skills.ts +1 -1
  316. package/src/storage.ts +1 -1
  317. package/src/tools.ts +1 -1
  318. package/src/types.ts +10 -7
  319. package/templates/security-help/README.md +37 -0
  320. package/templates/security-help/agent/agent.ts +18 -0
  321. package/templates/security-help/agent/channels/github.ts +13 -0
  322. package/templates/security-help/agent/channels/slack.ts +89 -0
  323. package/templates/security-help/agent/instructions.md +20 -0
  324. package/templates/security-help/agent/knowledge/faq/approvals.md +5 -0
  325. package/templates/security-help/agent/knowledge/faq/channels.md +6 -0
  326. package/templates/security-help/agent/knowledge/faq/phishing.md +10 -0
  327. package/templates/security-help/agent/lib/pr-first-pass.ts +42 -0
  328. package/templates/security-help/agent/lib/repos.ts +5 -0
  329. package/templates/security-help/agent/skills/access-request.md +10 -0
  330. package/templates/security-help/agent/skills/security-first-pass.md +15 -0
  331. package/templates/security-help/agent/skills/security-playbooks.md +12 -0
  332. package/templates/security-help/agent/skills/security-pr-first-pass.md +12 -0
  333. package/templates/security-help/evals/evals.config.ts +5 -0
  334. package/templates/security-help/evals/security-help.eval.ts +53 -0
  335. package/templates/security-help/init.json +31 -0
  336. package/templates/security-help/package.json +18 -0
  337. package/templates/security-help/tsconfig.json +12 -0
  338. package/templates/triage/agent/channels/webhook.ts +2 -2
  339. package/dist/docs/assets/chunks/@localSearchIndexroot.CxCtxfDE.js +0 -1
  340. package/dist/docs/assets/chunks/theme.S57OeOLA.js +0 -2
  341. package/dist/docs/assets/example-agents_index.md.xmJ87d_3.js +0 -2
  342. package/dist/docs/assets/example-agents_weather-agent.md.DC3lINjo.lean.js +0 -1
  343. package/dist/docs/assets/index.md.DhRHS_-L.js +0 -5
  344. package/dist/docs/assets/reference_project-layout.md.D3MdHM2z.lean.js +0 -1
  345. package/dist/docs/assets/troubleshooting.md.KgmmaCgw.js +0 -1
  346. package/dist/playground/assets/index-DQGZnAI0.css +0 -1
@@ -100,6 +100,55 @@ typecheck will.
100
100
  Throwing inside `execute` reports an error result to the model
101
101
  (`isError: true`). The turn and the server keep running.
102
102
 
103
+ ### Declare structured output
104
+
105
+ Set `outputSchema` when MCP clients need a structured result contract. Use a
106
+ Zod schema or plain JSON Schema:
107
+
108
+ ```ts
109
+ const Weather = z.object({
110
+ city: z.string(),
111
+ temperatureF: z.number(),
112
+ });
113
+
114
+ export default defineTool({
115
+ description: "Read the current weather.",
116
+ inputSchema: z.object({ city: z.string() }),
117
+ outputSchema: Weather,
118
+ async execute({ city }) {
119
+ return { city, temperatureF: 72 };
120
+ },
121
+ });
122
+ ```
123
+
124
+ The Agent SDK advertises the schema. It does not validate tool results against
125
+ it. Plain object returns fill MCP `structuredContent` automatically. An
126
+ envelope return must set `structuredContent` next to `content` and `isError`.
127
+
128
+ Use the exported `ToolInput<TSchema>` type when another function needs the
129
+ input type inferred from a tool schema.
130
+
131
+ ### Control dry-run effects
132
+
133
+ Set `effect` to `"read"`, `"write"`, or a predicate over validated input.
134
+ A dry-run session executes reads and answers writes without running their
135
+ tool bodies. An authored tool without `effect` is treated as a write.
136
+
137
+ ```ts
138
+ export default defineTool({
139
+ description: "Publish a release.",
140
+ inputSchema: z.object({ version: z.string() }),
141
+ effect: "write",
142
+ dryRunResult: ({ version }) => ({ published: false, version }),
143
+ async execute({ version }) {
144
+ return publishRelease(version);
145
+ },
146
+ });
147
+ ```
148
+
149
+ `dryRunResult` keeps the result shape stable. Without it, a stubbed write
150
+ returns `"Operation acknowledged."`. Traces mark the result as stubbed.
151
+
103
152
  ## Define an agent tool
104
153
 
105
154
  Set `execution: "agent"` and the tool materializes as a shell script
@@ -240,9 +289,8 @@ spoofed payload can't steer it.
240
289
  Test tools with `call` before blaming prompts. If the tool's output is
241
290
  wrong, no instruction change fixes it.
242
291
 
243
- And gate side effects: `needsApproval` for the calls that need a
244
- person's sign-off, and dry-run defaults flipped by an env var for
245
- anything destructive.
292
+ Gate side effects with `needsApproval`. Declare each tool's `effect` so
293
+ dry-run sessions can execute reads and stub writes.
246
294
 
247
295
  ## What's next
248
296
 
@@ -86,8 +86,10 @@ No files change before you approve this step.
86
86
 
87
87
  A first version usually includes:
88
88
 
89
+ - `AGENTS.md`, `.gitignore`, `package.json`, and `tsconfig.json`
89
90
  - `agent/agent.ts` for the model and runtime
90
91
  - `agent/instructions.md` for the always-on prompt
92
+ - `agent/hooks/memory.ts` for memory guidance
91
93
  - One or two tools under `agent/tools/`
92
94
  - Any channels or MCP connections you selected
93
95
  - `evals/evals.config.ts` and one smoke eval
@@ -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.89",
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": {
@@ -225,6 +225,7 @@
225
225
  "node": ">=22.13"
226
226
  },
227
227
  "dependencies": {
228
+ "@bazel/runfiles": "6.5.0",
228
229
  "@cursor/sdk": "1.0.28",
229
230
  "@modelcontextprotocol/sdk": "1.25.1",
230
231
  "@octokit/auth-app": "^7.2.0",
@@ -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
  },
package/src/ab.ts CHANGED
@@ -14,7 +14,7 @@
14
14
  * sample/snapshot export lives on the `defineStorage` `abs` table.
15
15
  *
16
16
  * ```ts
17
- * import { defineAB, splitBySessionHash } from "@anysphere/agent-serve/ab";
17
+ * import { defineAB, splitBySessionHash } from "@cursor/july/ab";
18
18
  *
19
19
  * export default defineAB({
20
20
  * name: "concise-instructions",
package/src/artifacts.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * ```ts
12
12
  * import { z } from "zod";
13
- * import { defineArtifacts } from "@anysphere/agent-serve/artifacts";
13
+ * import { defineArtifacts } from "@cursor/july/artifacts";
14
14
  *
15
15
  * export default defineArtifacts({
16
16
  * kinds: {
@@ -61,6 +61,7 @@ import {
61
61
  import { cmdManifest } from "../internal/cli-manifest.js";
62
62
  import {
63
63
  CLI_COMMAND_NAME as CLI,
64
+ formatCliVersion,
64
65
  PACKAGE_NAME,
65
66
  packageVersion,
66
67
  } from "../internal/distribution.js";
@@ -135,7 +136,7 @@ Usage:
135
136
  ${CLI} logout
136
137
  ${CLI} whoami [--json]
137
138
  ${CLI} update
138
- ${CLI} version
139
+ ${CLI} version [--json]
139
140
  ${CLI} deploy [--dir <path>] [--slug <slug> | --all] [--team <id>] [--json]
140
141
  [--no-wait] [--repo <url>] [--ref <ref>]
141
142
  [--path <agentPath>] [--cursor-events-repo <owner/name>]...
@@ -205,7 +206,7 @@ Commands:
205
206
  prompt. --json is machine-readable and never blocks on
206
207
  login. No directory: print the setup guide.
207
208
  convert-automation
208
- Export a Cursor Automation into an agentkit project. <url> is
209
+ Export a Cursor Automation into an agentsdk project. <url> is
209
210
  the dashboard URL (…/automations/<uuid> or
210
211
  …/custom-agents/<uuid>) or a bare uuid. Fetches the definition
211
212
  with your Cursor credentials, writes the converted files into
@@ -258,7 +259,9 @@ Commands:
258
259
  whoami Show which Cursor account powers this host (and why).
259
260
  update Upgrade this install to the latest published version (detects
260
261
  global npm/pnpm/yarn/bun installs and project dependencies).
261
- version Print the installed ${CLI} version and exit (also --version / -V).
262
+ version Print the ${PACKAGE_NAME} version this CLI will use and exit
263
+ (also --version / -V). Text is the version number; --json
264
+ prints { name, version, cli }.
262
265
  deploy Deploy onto Cursor's managed agent-serve hosting, then wait for
263
266
  the engine to come up. --repo/--ref/--path stay available;
264
267
  inside an agent git checkout they are inferred when omitted
@@ -292,7 +295,7 @@ Agent loop:
292
295
  ${CLI} dev .
293
296
 
294
297
  Options:
295
- --version, -V Print the installed version and exit.
298
+ --version, -V Print the version number and exit.
296
299
  --dir Project root (defaults to the current directory).
297
300
  --port Port to listen on (default 3000). When the default is
298
301
  taken, serve tries the next free port and prints a notice.
@@ -400,7 +403,7 @@ Options:
400
403
  --skip-report eval: ignore reporters from evals.config.ts / eval files.
401
404
  --no-stream run/eval: silence live progress on stderr (JSON still prints).
402
405
  --json JSON output (init/convert-automation/install-skills/
403
- info/chat/eval/logs/
406
+ info/chat/eval/logs/version/
404
407
  sessions/session/github; run defaults to JSON). logs:
405
408
  NDJSON progress/log events. session: trajectory JSON
406
409
  (not raw events).
@@ -474,7 +477,7 @@ async function main(argv: string[]): Promise<number> {
474
477
  return command === undefined ? 1 : 0;
475
478
  }
476
479
  if (command === "version" || command === "--version" || command === "-V") {
477
- await writeStdout(`${CLI} ${packageVersion()}\n`);
480
+ await writeStdout(formatCliVersion({ json: restIn.includes("--json") }));
478
481
  return 0;
479
482
  }
480
483
 
@@ -574,9 +577,14 @@ async function main(argv: string[]): Promise<number> {
574
577
  "no-artifacts": { type: "boolean", default: false },
575
578
  "skip-report": { type: "boolean", default: false },
576
579
  "max-concurrency": { type: "string" },
580
+ version: { type: "boolean", short: "V", default: false },
577
581
  },
578
582
  });
579
583
  const dir = values.dir ?? ".";
584
+ if (values.version === true) {
585
+ await writeStdout(formatCliVersion({ json: values.json === true }));
586
+ return 0;
587
+ }
580
588
 
581
589
  // Best-effort, cached, and silent on failure. `update` does its own fresh
582
590
  // lookup, --json runs stay quiet for machine consumers, and `mcp` skips it
@@ -1301,8 +1309,14 @@ async function main(argv: string[]): Promise<number> {
1301
1309
  loadLocalEnv();
1302
1310
  // Model turns need a Cursor credential. Prompt login before listen
1303
1311
  // so the first playground turn does not fail with a late auth error.
1312
+ // `--allow-anonymous` is the hosted trust boundary (alias token /
1313
+ // freeze bake): skip the login gate so health can bind without a
1314
+ // key. v1 hosted injects CURSOR_API_KEY at exec; freeze bind drops
1315
+ // CURSOR_API_KEY / CURSOR_API_KEY_FILE onto the listening process.
1316
+ // Self-hosted omit the flag and still fail-fast unsigned on a TTY-less host.
1304
1317
  const loginExit = await ensureCursorLogin({
1305
1318
  apiKey: values["api-key"],
1319
+ allowAnonymous: values["allow-anonymous"] === true,
1306
1320
  });
1307
1321
  if (loginExit !== 0) {
1308
1322
  return { kind: "login-failed", exitCode: loginExit };
@@ -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
  /**
package/src/channels.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  * and are mounted under `/v1/channels/<name>`:
10
10
  *
11
11
  * ```ts
12
- * import { defineChannel, POST } from "@anysphere/agent-serve/channels";
12
+ * import { defineChannel, POST } from "@cursor/july/channels";
13
13
  * import { z } from "zod";
14
14
  *
15
15
  * export default defineChannel({
@@ -8,7 +8,7 @@
8
8
  * `hostOnly: true` to keep it off the model (still on `host.mcp`).
9
9
  *
10
10
  * ```ts
11
- * import { defineConnection } from "@anysphere/agent-serve/connections";
11
+ * import { defineConnection } from "@cursor/july/connections";
12
12
  *
13
13
  * export default defineConnection({
14
14
  * url: "https://mcp.linear.app/mcp",
package/src/evals.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * `t.messageIncludes(...)`, or `t.check(value, includes(...))`.
8
8
  *
9
9
  * ```ts
10
- * import { defineEval, includes } from "@anysphere/agent-serve/evals";
10
+ * import { defineEval, includes } from "@cursor/july/evals";
11
11
  *
12
12
  * // One datapoint — id is the file path (evals/weather/nyc.eval.ts → weather/nyc)
13
13
  * export default defineEval({
package/src/hooks.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * transcripts to your own database). Handlers are observe-only.
7
7
  *
8
8
  * ```ts
9
- * import { defineHook } from "@anysphere/agent-serve/hooks";
9
+ * import { defineHook } from "@cursor/july/hooks";
10
10
  *
11
11
  * export default defineHook({
12
12
  * events: {
package/src/index.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @anysphere/agent-serve
2
+ * @cursor/july
3
3
  *
4
4
  * Filesystem-first framework for Cursor agents: define an agent as markdown
5
5
  * and TypeScript files under an `agent/` directory, and serve it over
6
6
  * channels with the Cursor SDK as the execution harness.
7
7
  *
8
8
  * ```ts
9
- * import { serve } from "@anysphere/agent-serve";
9
+ * import { serve } from "@cursor/july";
10
10
  *
11
11
  * const handle = await serve(".", { port: 3000 });
12
12
  * console.log(`agent listening on ${handle.url}`);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `agent-serve convert-automation <url>` — export a Cursor Automation into
3
- * an agentkit project.
3
+ * an agentsdk project.
4
4
  *
5
5
  * Fetches the automation's workflow from the backend export endpoint
6
6
  * (Bearer user API key, same credential chain as deploy), runs the pure
@@ -148,10 +148,12 @@ export async function cmdLogin(options: CursorCliOptions): Promise<number> {
148
148
  /**
149
149
  * Gate for commands that need a Cursor credential before they can do useful
150
150
  * work (`serve`, `dev`, interactive `init`). Already-signed-in hosts
151
- * (`--api-key` / `CURSOR_API_KEY` / stored login) return immediately.
152
- * Otherwise an interactive host runs {@link cmdLogin}; a non-interactive
153
- * one (CI, Docker) fails fast with {@link SIGN_IN_HINT} instead of polling
154
- * a browser that will never open.
151
+ * (`--api-key` / `CURSOR_API_KEY` / `CURSOR_API_KEY_FILE` / stored login) return immediately.
152
+ * Hosted `--allow-anonymous` (v1 alias-token engines and v2 freeze bake)
153
+ * skips this gate so health/manifest can bind without a Cursor key.
154
+ * Self-hosted omit the flag: an interactive host runs {@link cmdLogin};
155
+ * a non-interactive one (CI, Docker) fails fast with {@link SIGN_IN_HINT}
156
+ * instead of polling a browser that will never open.
155
157
  */
156
158
  export async function ensureCursorLogin(
157
159
  options: {
@@ -161,6 +163,12 @@ export async function ensureCursorLogin(
161
163
  * TTY.
162
164
  */
163
165
  interactive?: boolean;
166
+ /**
167
+ * `serve --allow-anonymous`: listen without a Cursor credential.
168
+ * Model turns still fail later if a key is required; freeze only
169
+ * needs `/v1/health` and `/v1/manifest`.
170
+ */
171
+ allowAnonymous?: boolean;
164
172
  /** Test seam. */
165
173
  login?: (options: CursorCliOptions) => Promise<number>;
166
174
  } = {}
@@ -169,6 +177,9 @@ export async function ensureCursorLogin(
169
177
  if (resolved !== undefined) {
170
178
  return 0;
171
179
  }
180
+ if (options.allowAnonymous === true) {
181
+ return 0;
182
+ }
172
183
  const interactive = options.interactive ?? process.stderr.isTTY === true;
173
184
  if (!interactive) {
174
185
  process.stderr.write(`Not signed in to Cursor. ${SIGN_IN_HINT}\n`);
@@ -243,12 +254,14 @@ function formatIdentity(identity: CursorIdentity): string {
243
254
  return name === "" ? `${email}${team}` : `${name} <${email}>${team}`;
244
255
  }
245
256
 
246
- function describeSource(source: "option" | "env" | "login"): string {
257
+ function describeSource(source: "option" | "env" | "file" | "login"): string {
247
258
  switch (source) {
248
259
  case "option":
249
260
  return "explicit --api-key / serve({ apiKey })";
250
261
  case "env":
251
262
  return "CURSOR_API_KEY environment variable";
263
+ case "file":
264
+ return "CURSOR_API_KEY_FILE (task bind)";
252
265
  case "login":
253
266
  return `stored login (${credentialsFilePath()})`;
254
267
  }
@@ -28,6 +28,7 @@ import { readDeployTemplate } from "./cursor-agent-template.js";
28
28
  import {
29
29
  type AgentkitDeployAccepted,
30
30
  type AgentkitDeployStatus,
31
+ type AgentkitStopAccepted,
31
32
  AgentServeDeployClient,
32
33
  type DeleteAccepted,
33
34
  type DeployAccepted,
@@ -1187,11 +1188,25 @@ export async function cmdStop(
1187
1188
  if (typeof ctx === "number") {
1188
1189
  return ctx;
1189
1190
  }
1190
- let accepted: StopAccepted;
1191
+ // Stop takes only a slug, so there is no manifest to dispatch on (unlike
1192
+ // deploy). The v2 agentkit control plane goes first: v1 endpoints refuse
1193
+ // `architecture: "v2"` slugs with a 409 rather than a 404, so v1-first
1194
+ // could not fall through. A v2 404 (including an older backend without
1195
+ // the agentkit mount) falls back to the v1 stop.
1196
+ let architecture: "v1" | "v2" = "v2";
1197
+ let accepted: StopAccepted | AgentkitStopAccepted;
1191
1198
  try {
1192
- accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
1199
+ accepted = await ctx.client.stopAgentkit({ teamId: ctx.teamId, slug });
1193
1200
  } catch (error) {
1194
- return renderApiError(error, ctx.err);
1201
+ if (!(error instanceof DeployApiError) || error.status !== 404) {
1202
+ return renderApiError(error, ctx.err);
1203
+ }
1204
+ try {
1205
+ accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
1206
+ architecture = "v1";
1207
+ } catch (v1Error) {
1208
+ return renderApiError(v1Error, ctx.err);
1209
+ }
1195
1210
  }
1196
1211
  if (ctx.noWait) {
1197
1212
  if (ctx.json) {
@@ -1201,11 +1216,16 @@ export async function cmdStop(
1201
1216
  }
1202
1217
  return 0;
1203
1218
  }
1204
- let detail: DeploymentDetail;
1219
+ let detail: DeploymentDetail | AgentkitDeployStatus;
1205
1220
  try {
1206
- detail = await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1207
- ctx.client.getDeployment({ teamId: ctx.teamId, slug })
1208
- );
1221
+ detail =
1222
+ architecture === "v2"
1223
+ ? await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1224
+ ctx.client.getAgentkitDeploy({ teamId: ctx.teamId, slug })
1225
+ )
1226
+ : await pollUntil(ctx, slug, new Set(["stopped"]), () =>
1227
+ ctx.client.getDeployment({ teamId: ctx.teamId, slug })
1228
+ );
1209
1229
  } catch (error) {
1210
1230
  return renderApiError(error, ctx.err);
1211
1231
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Pure Workflow → agentkit project converter.
2
+ * Pure Workflow → agentsdk project converter.
3
3
  *
4
4
  * Maps an exported Cursor automation (proto3 workflow JSON + enriched MCP
5
5
  * server list) to project files, warnings, and setup steps. No I/O, no
@@ -185,7 +185,7 @@ function renderInstructions(
185
185
  }
186
186
 
187
187
  /**
188
- * Strip Cursor-backend prompt markup that means nothing in agentkit:
188
+ * Strip Cursor-backend prompt markup that means nothing in agentsdk:
189
189
  * `@[label](action:...)` action tokens become their label text, and
190
190
  * unresolvable `%%INLINECODE<n>%%` storage placeholders are flagged (their
191
191
  * content is not in the export).
@@ -972,7 +972,7 @@ function emitSlackChannel(
972
972
  ? "channel-created"
973
973
  : "reaction-added";
974
974
  out.warnings.push(
975
- `Slack ${kind} trigger has no agentkit equivalent — its config is inlined as a comment in ${path}; handle the Slack event yourself on a dedicated Socket Mode app.`
975
+ `Slack ${kind} trigger has no agentsdk equivalent — its config is inlined as a comment in ${path}; handle the Slack event yourself on a dedicated Socket Mode app.`
976
976
  );
977
977
  }
978
978
  let reactionDropped = false;
@@ -995,7 +995,7 @@ function emitSlackChannel(
995
995
  }
996
996
  if (reactionDropped) {
997
997
  out.warnings.push(
998
- "The Slack trigger marked triggering messages with a completion reaction; agentkit has no completion-reaction option, so that signal is lost unless agent/instructions.md tells the agent to add the reaction itself via Slack tools."
998
+ "The Slack trigger marked triggering messages with a completion reaction; agentsdk has no completion-reaction option, so that signal is lost unless agent/instructions.md tells the agent to add the reaction itself via Slack tools."
999
999
  );
1000
1000
  }
1001
1001
  if (socketMode) {
@@ -1042,8 +1042,8 @@ function emitSlackChannel(
1042
1042
  if (blocksUnauthenticated) {
1043
1043
  out.warnings.push(
1044
1044
  includeBotPosts
1045
- ? "Some Slack watches only fired for authenticated Cursor users while others allowed anyone; agentkit has one bot-post setting per channel, so the export keeps bot posts ENABLED (the open watches depend on them) and the authenticated-only watches lose both their sender gate and their bot exclusion. Split the channels or add an onChannelPost gate."
1046
- : "The Slack trigger only fired for authenticated Cursor users (linked accounts on the owning team); agentkit has no equivalent sender gate, so the exported watch dispatches for ANY channel member (bot posts stay excluded). Add an onChannelPost gate in the channel if that matters."
1045
+ ? "Some Slack watches only fired for authenticated Cursor users while others allowed anyone; agentsdk has one bot-post setting per channel, so the export keeps bot posts ENABLED (the open watches depend on them) and the authenticated-only watches lose both their sender gate and their bot exclusion. Split the channels or add an onChannelPost gate."
1046
+ : "The Slack trigger only fired for authenticated Cursor users (linked accounts on the owning team); agentsdk has no equivalent sender gate, so the exported watch dispatches for ANY channel member (bot posts stay excluded). Add an onChannelPost gate in the channel if that matters."
1047
1047
  );
1048
1048
  }
1049
1049
  const engagement: string[] = [];
@@ -1309,9 +1309,9 @@ const ACTION_STEPS: Partial<Record<keyof ActionJson, string>> = {
1309
1309
  resolveReviewThreads:
1310
1310
  "Verify: resolve_review_threads — no built-in equivalent; resolve threads via the GitHub GraphQL API in a hook or tool.",
1311
1311
  microsoftTeams:
1312
- "Verify: microsoft_teams post — agentkit has no Teams channel; wire the Microsoft Teams API yourself.",
1312
+ "Verify: microsoft_teams post — agentsdk has no Teams channel; wire the Microsoft Teams API yourself.",
1313
1313
  readMicrosoftTeams:
1314
- "Verify: read_microsoft_teams — agentkit has no Teams tools; wire the Microsoft Teams API yourself.",
1314
+ "Verify: read_microsoft_teams — agentsdk has no Teams tools; wire the Microsoft Teams API yourself.",
1315
1315
  };
1316
1316
 
1317
1317
  interface SlackIntegrationState {
@@ -1375,7 +1375,7 @@ function behaviorSteps(
1375
1375
  const disabled = workflow.disabledDefaultTools ?? [];
1376
1376
  if (disabled.length > 0) {
1377
1377
  steps.push(
1378
- `Verify: disabled_default_tools (${disabled.join(", ")}) — agentkit has no default automation tools; enforce the equivalent restriction in agent/instructions.md.`
1378
+ `Verify: disabled_default_tools (${disabled.join(", ")}) — agentsdk has no default automation tools; enforce the equivalent restriction in agent/instructions.md.`
1379
1379
  );
1380
1380
  }
1381
1381
  return steps;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Types for `convertWorkflow` — the pure automation → agentkit project
2
+ * Types for `convertWorkflow` — the pure automation → agentsdk project
3
3
  * converter behind `agent-serve convert-automation`.
4
4
  *
5
5
  * The workflow arrives as generic proto3 JSON (lowerCamelCase field names,