@cursor/july 0.1.113 → 0.1.114

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 (229) hide show
  1. package/dist/docs/404.html +2 -2
  2. package/dist/docs/assets/{app.CAeK13eM.js → app.BqkJwOZ-.js} +4 -4
  3. package/dist/docs/assets/chunks/@localSearchIndexroot.BnSgidYE.js +1 -0
  4. package/dist/docs/assets/chunks/{VPLocalSearchBox.C9LbPHod.js → VPLocalSearchBox.BJAi2KiV.js} +1 -1
  5. package/dist/docs/assets/chunks/{arc.CmMq2zmS.js → arc.BZpXTgvV.js} +1 -1
  6. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CCXB8Uj5.js → architectureDiagram-Q4EWVU46.WYI-7F-Y.js} +1 -1
  7. package/dist/docs/assets/chunks/{baseUniq.CyQo6eLe.js → baseUniq.CZaUPpg0.js} +1 -1
  8. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.JYq6w91N.js → blockDiagram-DXYQGD6D.D6UES2pD.js} +1 -1
  9. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BRV8GPJJ.js → c4Diagram-AHTNJAMY.cwebIe4i.js} +1 -1
  10. package/dist/docs/assets/chunks/channel.DdM5EfNW.js +1 -0
  11. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.Bv4ooYQR.js → chunk-4BX2VUAB.fVyFnjxg.js} +1 -1
  12. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.t4JtKPcj.js → chunk-4TB4RGXK.BanufG1c.js} +1 -1
  13. package/dist/docs/assets/chunks/{chunk-55IACEB6.34lCHj9Y.js → chunk-55IACEB6.VaSMz5-2.js} +1 -1
  14. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BSwrPNrt.js → chunk-EDXVE4YY.CN2diZOM.js} +1 -1
  15. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.Beeun-R-.js → chunk-FMBD7UC4.g4ivypu3.js} +1 -1
  16. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.BUUFUcJc.js → chunk-OYMX7WX6.GZXKn9JJ.js} +1 -1
  17. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.B2XjHzN_.js → chunk-QZHKN3VN.itXxJZCd.js} +1 -1
  18. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CLYG8znk.js → chunk-YZCP3GAM.-rw2GfvX.js} +1 -1
  19. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CjfGHeg2.js +1 -0
  20. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CjfGHeg2.js +1 -0
  21. package/dist/docs/assets/chunks/clone.wSOICb_f.js +1 -0
  22. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.DVEa6fZp.js → cose-bilkent-S5V4N54A.CmaI5br0.js} +1 -1
  23. package/dist/docs/assets/chunks/{dagre-KV5264BT.C9PZQK-S.js → dagre-KV5264BT.4wY9S4Kt.js} +1 -1
  24. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DoN0uv3Y.js → diagram-5BDNPKRD.Pc3c0u9W.js} +1 -1
  25. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.Czv3duqx.js → diagram-G4DWMVQ6.CYrWz-nj.js} +1 -1
  26. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BinJ5kWb.js → diagram-MMDJMWI5.Bgj5hukb.js} +1 -1
  27. package/dist/docs/assets/chunks/{diagram-TYMM5635.DW326M4K.js → diagram-TYMM5635.DGMEXalS.js} +1 -1
  28. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.U2pR_OA7.js → erDiagram-SMLLAGMA.GepTV9Im.js} +1 -1
  29. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ByWJXeYK.js → flowDiagram-DWJPFMVM.DVKywg3j.js} +1 -1
  30. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.OquF0Rtg.js → ganttDiagram-T4ZO3ILL.C7qt9Mlo.js} +1 -1
  31. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.Bpn01P7X.js → gitGraphDiagram-UUTBAWPF.U30_r82P.js} +1 -1
  32. package/dist/docs/assets/chunks/{graph.CNRB6ETL.js → graph.CyyMyAWv.js} +1 -1
  33. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CqhknMWi.js → infoDiagram-42DDH7IO.Dn9ACW3y.js} +1 -1
  34. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.C6xpR2af.js → ishikawaDiagram-UXIWVN3A.DlIdIGOA.js} +1 -1
  35. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.Cg5f7oB3.js → journeyDiagram-VCZTEJTY.DZj4vy4E.js} +1 -1
  36. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.Cx9YTwlU.js → kanban-definition-6JOO6SKY.Dl63eMUV.js} +1 -1
  37. package/dist/docs/assets/chunks/{layout.ljS-wFtK.js → layout.BLHZLWPH.js} +1 -1
  38. package/dist/docs/assets/chunks/{linear.jSxNrsFC.js → linear.aXKGKaNw.js} +1 -1
  39. package/dist/docs/assets/chunks/{min.Cum8AlQw.js → min.zWnFcpcc.js} +1 -1
  40. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BLiysLpe.js → mindmap-definition-QFDTVHPH.Qs4MQBea.js} +1 -1
  41. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.BoIDyuKF.js → pieDiagram-DEJITSTG.BmPHgsk7.js} +1 -1
  42. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DLkpDytR.js → quadrantDiagram-34T5L4WZ.D5MQ3gwA.js} +1 -1
  43. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DqTVqSu2.js → requirementDiagram-MS252O5E.CkdUFrO7.js} +1 -1
  44. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.CG_6FF7j.js → sankeyDiagram-XADWPNL6.KZrljrAV.js} +1 -1
  45. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.BIp9602K.js → sequenceDiagram-FGHM5R23.XMoEW-Lx.js} +1 -1
  46. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.COSXsD9I.js → stateDiagram-FHFEXIEX.BmTzePLj.js} +1 -1
  47. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Cu5X28zZ.js +1 -0
  48. package/dist/docs/assets/chunks/{theme.CXJ7PNwy.js → theme.BfQzpxsg.js} +2 -2
  49. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CXdVqkLq.js → timeline-definition-GMOUNBTQ.Dug0oamp.js} +1 -1
  50. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CZxGuc4r.js → vennDiagram-DHZGUBPP.BOTHrEFu.js} +1 -1
  51. package/dist/docs/assets/chunks/{wardley-RL74JXVD.3oVgfqQk.js → wardley-RL74JXVD.DXy2i1LS.js} +1 -1
  52. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.6_irCgGJ.js → wardleyDiagram-NUSXRM2D.CoXKdfi6.js} +1 -1
  53. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.TRPe92m3.js → xychartDiagram-5P7HB3ND.DXoSCjAW.js} +1 -1
  54. package/dist/docs/assets/{deployment.md.D2jQZuFx.js → deployment.md.D2YX7u_I.js} +1 -1
  55. package/dist/docs/assets/{guides_agent-to-agent.md.CD4T5FIl.js → guides_agent-to-agent.md.C6kPY8nu.js} +2 -2
  56. package/dist/docs/assets/{guides_cloud-agents.md.Cp1O3u-X.js → guides_cloud-agents.md.BPJqTZjT.js} +1 -1
  57. package/dist/docs/assets/{guides_grokbot-agents.md.CMhZNdEU.js → guides_grokbot-agents.md.CzV715v8.js} +1 -1
  58. package/dist/docs/assets/guides_hooks.md.BT9GLwEp.js +50 -0
  59. package/dist/docs/assets/guides_hooks.md.BT9GLwEp.lean.js +1 -0
  60. package/dist/docs/assets/{guides_jev.md.F5fAkkfN.js → guides_jev.md.DeSCqMaO.js} +6 -44
  61. package/dist/docs/assets/guides_jev.md.DeSCqMaO.lean.js +1 -0
  62. package/dist/docs/assets/reference_agent-config.md.BRxAlnRy.js +36 -0
  63. package/dist/docs/assets/{reference_agent-config.md.DGPyw7ms.lean.js → reference_agent-config.md.BRxAlnRy.lean.js} +1 -1
  64. package/dist/docs/assets/reference_artifacts.md.KRX0sAdt.js +18 -0
  65. package/dist/docs/assets/reference_artifacts.md.KRX0sAdt.lean.js +1 -0
  66. package/dist/docs/assets/reference_channels.md.DZr14vm7.js +23 -0
  67. package/dist/docs/assets/reference_channels.md.DZr14vm7.lean.js +1 -0
  68. package/dist/docs/assets/{reference_connections.md.Je9dMsdd.js → reference_connections.md.DJGUCxrr.js} +18 -30
  69. package/dist/docs/assets/{reference_connections.md.Je9dMsdd.lean.js → reference_connections.md.DJGUCxrr.lean.js} +1 -1
  70. package/dist/docs/assets/{reference_evals.md.DNJzM_yf.js → reference_evals.md.C6umwNC6.js} +6 -7
  71. package/dist/docs/assets/reference_evals.md.C6umwNC6.lean.js +1 -0
  72. package/dist/docs/assets/{reference_extensions.md.Cv5aLCz_.js → reference_extensions.md.DbNYu-DP.js} +3 -3
  73. package/dist/docs/assets/{reference_extensions.md.Cv5aLCz_.lean.js → reference_extensions.md.DbNYu-DP.lean.js} +1 -1
  74. package/dist/docs/assets/reference_hooks.md.BfOkhTU0.js +45 -0
  75. package/dist/docs/assets/{reference_hooks.md.B7uzNENk.lean.js → reference_hooks.md.BfOkhTU0.lean.js} +1 -1
  76. package/dist/docs/assets/reference_http-api.md.DdwtBeCj.js +11 -0
  77. package/dist/docs/assets/{reference_http-api.md.CduHavZ2.lean.js → reference_http-api.md.DdwtBeCj.lean.js} +1 -1
  78. package/dist/docs/assets/reference_instructions.md.B2mcIzT6.js +14 -0
  79. package/dist/docs/assets/reference_instructions.md.B2mcIzT6.lean.js +1 -0
  80. package/dist/docs/assets/reference_playground.md.CyrQD_n3.js +1 -0
  81. package/dist/docs/assets/reference_playground.md.CyrQD_n3.lean.js +1 -0
  82. package/dist/docs/assets/reference_project-layout.md.BEMzxAkq.js +19 -0
  83. package/dist/docs/assets/{reference_project-layout.md.BGhgpy9V.lean.js → reference_project-layout.md.BEMzxAkq.lean.js} +1 -1
  84. package/dist/docs/assets/reference_prompt.md.BFrqjHFL.js +9 -0
  85. package/dist/docs/assets/reference_prompt.md.BFrqjHFL.lean.js +1 -0
  86. package/dist/docs/assets/reference_schedules.md.BB9N3tRR.js +47 -0
  87. package/dist/docs/assets/reference_schedules.md.BB9N3tRR.lean.js +1 -0
  88. package/dist/docs/assets/reference_sessions.md.BBp-GIt-.js +1 -0
  89. package/dist/docs/assets/{reference_sessions.md.1_6Vyv7x.lean.js → reference_sessions.md.BBp-GIt-.lean.js} +1 -1
  90. package/dist/docs/assets/reference_skills.md.BVmi3UJ_.js +15 -0
  91. package/dist/docs/assets/{reference_skills.md.DjQkRefx.lean.js → reference_skills.md.BVmi3UJ_.lean.js} +1 -1
  92. package/dist/docs/assets/reference_subagents.md.DRoRy2Uj.js +10 -0
  93. package/dist/docs/assets/{reference_subagents.md.Dl16gcBj.lean.js → reference_subagents.md.DRoRy2Uj.lean.js} +1 -1
  94. package/dist/docs/assets/{reference_tools.md.B1dH1lpa.js → reference_tools.md.CgocLDX1.js} +9 -6
  95. package/dist/docs/assets/{reference_tools.md.B1dH1lpa.lean.js → reference_tools.md.CgocLDX1.lean.js} +1 -1
  96. package/dist/docs/assets/troubleshooting.md.HY95rCCz.js +1 -0
  97. package/dist/docs/building-with-agents.html +35 -35
  98. package/dist/docs/deployment.html +37 -37
  99. package/dist/docs/deployment.md +1 -1
  100. package/dist/docs/evals.html +35 -35
  101. package/dist/docs/guides/agent-to-agent.html +38 -38
  102. package/dist/docs/guides/agent-to-agent.md +11 -12
  103. package/dist/docs/guides/bitbucket.html +35 -35
  104. package/dist/docs/guides/cloud-agents.html +36 -36
  105. package/dist/docs/guides/cloud-agents.md +1 -1
  106. package/dist/docs/guides/convert-automation.html +35 -35
  107. package/dist/docs/guides/github.html +35 -35
  108. package/dist/docs/guides/gitlab.html +35 -35
  109. package/dist/docs/guides/grokbot-agents.html +37 -37
  110. package/dist/docs/guides/grokbot-agents.md +1 -1
  111. package/dist/docs/guides/hooks.html +109 -0
  112. package/dist/docs/guides/hooks.md +111 -0
  113. package/dist/docs/guides/improve.html +35 -35
  114. package/dist/docs/guides/jev.html +42 -80
  115. package/dist/docs/guides/jev.md +22 -79
  116. package/dist/docs/guides/mcp-oauth.html +36 -36
  117. package/dist/docs/guides/opentelemetry.html +35 -35
  118. package/dist/docs/guides/slack.html +35 -35
  119. package/dist/docs/guides/webhooks.html +35 -35
  120. package/dist/docs/hashmap.json +1 -1
  121. package/dist/docs/hillclimbing.html +35 -35
  122. package/dist/docs/index.html +35 -35
  123. package/dist/docs/llms-full.txt +993 -1303
  124. package/dist/docs/llms.txt +8 -7
  125. package/dist/docs/quickstart.html +35 -35
  126. package/dist/docs/reference/agent-config.html +42 -46
  127. package/dist/docs/reference/agent-config.md +48 -81
  128. package/dist/docs/reference/artifacts.html +39 -40
  129. package/dist/docs/reference/artifacts.md +71 -70
  130. package/dist/docs/reference/channels.html +41 -61
  131. package/dist/docs/reference/channels.md +134 -201
  132. package/dist/docs/reference/cli.html +35 -35
  133. package/dist/docs/reference/connections.html +54 -66
  134. package/dist/docs/reference/connections.md +92 -128
  135. package/dist/docs/reference/evals.html +42 -43
  136. package/dist/docs/reference/evals.md +42 -50
  137. package/dist/docs/reference/extensions.html +38 -38
  138. package/dist/docs/reference/extensions.md +9 -13
  139. package/dist/docs/reference/hooks.html +39 -67
  140. package/dist/docs/reference/hooks.md +72 -146
  141. package/dist/docs/reference/http-api.html +39 -39
  142. package/dist/docs/reference/http-api.md +137 -161
  143. package/dist/docs/reference/instructions.html +39 -39
  144. package/dist/docs/reference/instructions.md +21 -36
  145. package/dist/docs/reference/playground.html +36 -36
  146. package/dist/docs/reference/playground.md +26 -43
  147. package/dist/docs/reference/project-layout.html +38 -38
  148. package/dist/docs/reference/project-layout.md +12 -17
  149. package/dist/docs/reference/prompt.html +42 -42
  150. package/dist/docs/reference/prompt.md +18 -13
  151. package/dist/docs/reference/schedules.html +56 -91
  152. package/dist/docs/reference/schedules.md +52 -99
  153. package/dist/docs/reference/sessions.html +36 -36
  154. package/dist/docs/reference/sessions.md +36 -40
  155. package/dist/docs/reference/skills.html +38 -38
  156. package/dist/docs/reference/skills.md +15 -26
  157. package/dist/docs/reference/subagents.html +38 -38
  158. package/dist/docs/reference/subagents.md +20 -30
  159. package/dist/docs/reference/tools.html +44 -41
  160. package/dist/docs/reference/tools.md +45 -64
  161. package/dist/docs/templates/agentic-owners.html +35 -35
  162. package/dist/docs/templates/pr-autofixer.html +35 -35
  163. package/dist/docs/templates/security-reviewer.html +35 -35
  164. package/dist/docs/templates/thermo-quality-review.html +35 -35
  165. package/dist/docs/templates/thermo-review.html +35 -35
  166. package/dist/docs/templates/triage.html +35 -35
  167. package/dist/docs/troubleshooting.html +36 -36
  168. package/dist/docs/troubleshooting.md +1 -1
  169. package/dist/playground/assets/{index-DSMAewbx.css → index-C61EWMBK.css} +1 -1
  170. package/dist/playground/index.html +2 -2
  171. package/docs/deployment.md +1 -1
  172. package/docs/guides/agent-to-agent.md +11 -12
  173. package/docs/guides/cloud-agents.md +1 -1
  174. package/docs/guides/grokbot-agents.md +1 -1
  175. package/docs/guides/hooks.md +116 -0
  176. package/docs/guides/jev.md +23 -80
  177. package/docs/reference/agent-config.md +48 -81
  178. package/docs/reference/artifacts.md +72 -71
  179. package/docs/reference/channels.md +135 -202
  180. package/docs/reference/connections.md +93 -129
  181. package/docs/reference/evals.md +43 -51
  182. package/docs/reference/extensions.md +9 -13
  183. package/docs/reference/hooks.md +72 -146
  184. package/docs/reference/http-api.md +137 -161
  185. package/docs/reference/instructions.md +22 -37
  186. package/docs/reference/playground.md +26 -43
  187. package/docs/reference/project-layout.md +12 -17
  188. package/docs/reference/prompt.md +20 -15
  189. package/docs/reference/schedules.md +52 -99
  190. package/docs/reference/sessions.md +36 -40
  191. package/docs/reference/skills.md +15 -26
  192. package/docs/reference/subagents.md +20 -30
  193. package/docs/reference/tools.md +45 -64
  194. package/docs/troubleshooting.md +1 -1
  195. package/package.json +1 -1
  196. package/dist/docs/assets/chunks/@localSearchIndexroot.Ck9E52Ls.js +0 -1
  197. package/dist/docs/assets/chunks/channel.BHiYmnZ4.js +0 -1
  198. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Degh8l90.js +0 -1
  199. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Degh8l90.js +0 -1
  200. package/dist/docs/assets/chunks/clone.BIywbczV.js +0 -1
  201. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.qrxrbFsX.js +0 -1
  202. package/dist/docs/assets/guides_jev.md.F5fAkkfN.lean.js +0 -1
  203. package/dist/docs/assets/reference_agent-config.md.DGPyw7ms.js +0 -40
  204. package/dist/docs/assets/reference_artifacts.md.Bu_4HmsD.js +0 -19
  205. package/dist/docs/assets/reference_artifacts.md.Bu_4HmsD.lean.js +0 -1
  206. package/dist/docs/assets/reference_channels.md.nFWbzAic.js +0 -43
  207. package/dist/docs/assets/reference_channels.md.nFWbzAic.lean.js +0 -1
  208. package/dist/docs/assets/reference_evals.md.DNJzM_yf.lean.js +0 -1
  209. package/dist/docs/assets/reference_hooks.md.B7uzNENk.js +0 -73
  210. package/dist/docs/assets/reference_http-api.md.CduHavZ2.js +0 -11
  211. package/dist/docs/assets/reference_instructions.md.CU1My5My.js +0 -14
  212. package/dist/docs/assets/reference_instructions.md.CU1My5My.lean.js +0 -1
  213. package/dist/docs/assets/reference_playground.md.Ch2d0Iqi.js +0 -1
  214. package/dist/docs/assets/reference_playground.md.Ch2d0Iqi.lean.js +0 -1
  215. package/dist/docs/assets/reference_project-layout.md.BGhgpy9V.js +0 -19
  216. package/dist/docs/assets/reference_prompt.md.Ccp0R53H.js +0 -1
  217. package/dist/docs/assets/reference_prompt.md.Ccp0R53H.lean.js +0 -1
  218. package/dist/docs/assets/reference_schedules.md.B2Nm6FaD.js +0 -82
  219. package/dist/docs/assets/reference_schedules.md.B2Nm6FaD.lean.js +0 -1
  220. package/dist/docs/assets/reference_sessions.md.1_6Vyv7x.js +0 -1
  221. package/dist/docs/assets/reference_skills.md.DjQkRefx.js +0 -15
  222. package/dist/docs/assets/reference_subagents.md.Dl16gcBj.js +0 -10
  223. package/dist/docs/assets/troubleshooting.md.mnfFG2Em.js +0 -1
  224. /package/dist/docs/assets/{deployment.md.D2jQZuFx.lean.js → deployment.md.D2YX7u_I.lean.js} +0 -0
  225. /package/dist/docs/assets/{guides_agent-to-agent.md.CD4T5FIl.lean.js → guides_agent-to-agent.md.C6kPY8nu.lean.js} +0 -0
  226. /package/dist/docs/assets/{guides_cloud-agents.md.Cp1O3u-X.lean.js → guides_cloud-agents.md.BPJqTZjT.lean.js} +0 -0
  227. /package/dist/docs/assets/{guides_grokbot-agents.md.CMhZNdEU.lean.js → guides_grokbot-agents.md.CzV715v8.lean.js} +0 -0
  228. /package/dist/docs/assets/{troubleshooting.md.mnfFG2Em.lean.js → troubleshooting.md.HY95rCCz.lean.js} +0 -0
  229. /package/dist/playground/assets/{index-De_lpFxE.js → index-CrMWlgUU.js} +0 -0
@@ -29,7 +29,7 @@ to the directory name. When serving multiple agents, the slug is the
29
29
  directory name and must match `[A-Za-z0-9][A-Za-z0-9_-]*` (and not the
30
30
  reserved `v1`, `playground`, or `docs` segments).
31
31
 
32
- ## Project overview
32
+ ## Project tree
33
33
 
34
34
  Most projects start with this shape.
35
35
 
@@ -54,8 +54,8 @@ my-agent/
54
54
  ```
55
55
 
56
56
  Evals live in `evals/` at the project root, a sibling of `agent/`, never
57
- inside it. `agent/evals/` is silently ignored. See
58
- [Evals](../evals.md).
57
+ inside it. `agent/evals/` is ignored, and `validate` warns about it.
58
+ See [Evals](../evals.md).
59
59
 
60
60
  ## Folder reference
61
61
 
@@ -73,30 +73,26 @@ Each path maps to a capability and a reference page.
73
73
  | `agent/extensions/<ns>.ts` or `agent/extensions/<ns>/` | A mounted extension or Cursor plugin; its contributions become `<ns>__<name>` | [Extensions](./extensions.md) |
74
74
  | `agent/channels/*.ts` | HTTP surfaces beyond the built-in session API; `slack.ts` and `github.ts` use the platform packs | [Channels](./channels.md) |
75
75
  | `agent/hooks/*.ts` | Observe-only event subscribers, never fatal | [Hooks](./hooks.md) |
76
- | `agent/otel.ts` | Factory-only OTLP authoring (`defineOtel`). Public path is env / `serve({ otel })`. | [OpenTelemetry](../guides/opentelemetry.md) |
77
- | `agent/storage.ts` | `defineStorage` backend for the durable `host.kv` / `host.files` APIs | None |
78
76
  | `agent/artifacts.ts` | `defineArtifacts` kinds, the `tag_artifact` opt-in, and retention | [Artifacts](./artifacts.md) |
79
77
  | `agent/result.ts` | `defineResult` host `commit` on the final assistant text (`throw` or `ctx.reject`) | None |
80
78
  | `agent/schedules/*` | Cron-driven runs (UTC, 5-field; never auto-fire under `--dev`) | [Schedules](./schedules.md) |
81
- | `agent/sandbox/workspace/**` | Seed files copied into each local session workspace | [Sessions](./sessions.md#what-goes-into-a-local-session-workspace) |
82
- | `agent/playground/` | Custom playground tool chips | [Playground](./playground.md) |
79
+ | `agent/reminders/*.ts` | Named reminder handlers that stay armed across restarts | [Schedules](./schedules.md#reminders) |
80
+ | `agent/sandbox/workspace/**` | Seed files copied into each local session workspace | [Sessions](./sessions.md#local-session-workspace) |
83
81
  | `agent/lib/` | Import-only shared code, never discovered | None |
84
82
  | `evals/evals.config.ts` | Shared eval settings (e.g. `maxConcurrency`); required when evals exist | [Evals](../evals.md) |
85
83
  | `evals/**/*.eval.ts` | Filesystem evals; case id = path under `evals/` | [Evals](../evals.md) |
86
84
 
87
- `agent/lib/` is the only place for shared code. Everything else under
88
- `agent/` is discovery surface. A stray `.ts` file in one of these
89
- folders is treated as a definition.
85
+ Use `agent/lib/` for shared imports. A `.ts` file in one of the listed
86
+ discovery folders loads as a definition; unrecognized directories
87
+ produce a validation warning.
90
88
 
91
- ## Why didn't the Agent SDK discover my file?
89
+ ## Inspect discovery
92
90
 
93
91
  Run `agent-sdk validate --dir .` and `agent-sdk info --dir .`.
94
92
  `validate` prints diagnostics, and `serve` refuses to start on
95
93
  error-severity ones. Warnings, such as cloud runtime combined with
96
94
  local-only capabilities, print but don't block. `info` lists the discovered
97
- surface, so a missing tool or channel shows up immediately. From
98
- there, check the folder reference: the file is usually in the wrong directory
99
- or has the wrong extension.
95
+ surface, so a missing tool or channel shows up immediately.
100
96
 
101
97
  ```bash
102
98
  agent-sdk validate --dir . # diagnostics; non-zero exit on errors
@@ -104,9 +100,8 @@ agent-sdk info --dir . # human-readable surface
104
100
  agent-sdk info --dir . --json # machine-readable project info (same shape as GET /v1/info)
105
101
  ```
106
102
 
107
- ## What's next
108
-
109
- Continue with these pages:
103
+ ## Related
110
104
 
111
105
  - [Agent config](./agent-config.md): the runtime config at the root
112
106
  - [Tools](./tools.md): add typed actions under `agent/tools/`
107
+ - [CLI](./cli.md): commands that discover this tree
@@ -1,42 +1,42 @@
1
1
  ---
2
- title: "prompt"
3
- description: "Dedented multi-line strings for tool descriptions, reminder prompts, channel context, and errors."
2
+ title: "Prompt strings"
3
+ description: "Write indented multi-line strings without carrying source indentation into their values."
4
4
  ---
5
5
 
6
- # `prompt`
6
+ # Prompt strings
7
7
 
8
- Authoring helper for long strings that live next to indented TypeScript:
9
- tool descriptions, reminder `prompt` fields, GitHub channel `context`,
10
- and error messages.
8
+ The `prompt` template tag keeps multi-line strings aligned with the
9
+ surrounding TypeScript while returning dedented text. Use it for tool
10
+ descriptions, reminder prompts, channel context, and errors. Import it
11
+ from the package root or the dedicated entrypoint:
11
12
 
12
13
  ```ts
13
14
  import { prompt } from "@cursor/july";
14
15
  // or: import { prompt } from "@cursor/july/prompt";
15
16
  ```
16
17
 
17
- ## `prompt\`…\``
18
+ ## Dedented strings
18
19
 
19
- Returns a single dedented string. Common leading whitespace is stripped;
20
- a leading newline after the opening backtick is dropped so the usual
21
- multiline form stays readable in source.
20
+ `prompt` returns one string. It removes the common leading whitespace
21
+ and one newline immediately after the opening backtick.
22
22
 
23
23
  ```ts
24
24
  throw new Error(prompt`
25
- It is outside business hours (MonFri 9am5pm ET).
25
+ It is outside business hours (Mon-Fri 9am-5pm ET).
26
26
  Use request_author_approval, or pass approval=human_request.
27
27
  `);
28
28
  ```
29
29
 
30
30
  Blank lines inside the body are preserved. Relative indentation after the
31
- common prefix is kept (handy for nested bullet lists).
31
+ common prefix is preserved, so nested lists keep their shape.
32
32
 
33
33
  When interpolating multi-line values (for example a list of services), give
34
34
  those lines the same indent as the `prompt` body so dedent stays consistent.
35
35
 
36
- ## `prompt.lines\`…\``
36
+ ## Line arrays
37
37
 
38
- Same dedent rules, but returns `string[]`, one entry per line. Use this
39
- where an API wants separate lines (for example GitHub channel `context`):
38
+ `prompt.lines` applies the same rules and returns `string[]`, with one
39
+ entry per line. Use it when an API accepts separate context lines:
40
40
 
41
41
  ```ts
42
42
  context: prompt.lines`
@@ -45,3 +45,8 @@ context: prompt.lines`
45
45
  Call plan_deploy, then follow its nextStep.
46
46
  `
47
47
  ```
48
+
49
+ ## Related
50
+
51
+ - [Tools](./tools.md)
52
+ - [Channels](./channels.md)
@@ -5,7 +5,7 @@ description: "Cron-driven runs defined at deploy time, and per-session durable w
5
5
 
6
6
  # Schedules and reminders
7
7
 
8
- Two ways an agent acts without an inbound message. A schedule is
8
+ An agent can act without an inbound message in two ways. A schedule is
9
9
  deploy-time cron: "every weekday at 09:00, summarize open incidents." A
10
10
  reminder is a runtime wake bound to one conversation: "re-check this
11
11
  PR's CI in two hours." Schedules live in the filesystem; reminders are
@@ -16,10 +16,9 @@ created by running code.
16
16
  Cron expressions are standard 5-field, evaluated in UTC with minute
17
17
  granularity.
18
18
 
19
- ### Schedules in Markdown
19
+ ### Markdown schedules
20
20
 
21
- A plain markdown file with `cron:` frontmatter is a fire-and-forget
22
- task:
21
+ A markdown file with `cron:` frontmatter is a fire-and-forget task:
23
22
 
24
23
  ```md
25
24
  ---
@@ -33,10 +32,10 @@ Each firing starts a task-mode session: the body is the prompt, the
33
32
  session runs to `session.completed` or `session.failed`, and it isn't
34
33
  followable.
35
34
 
36
- ### Schedules as handlers
35
+ ### Schedule handlers
37
36
 
38
- `defineSchedule` with a `run` handler gives you full control, most
39
- usefully to hand the work into a channel so its delivery events fire:
37
+ Use `defineSchedule` with a `run` handler to call tools or hand work into
38
+ a channel so its delivery events fire:
40
39
 
41
40
  ```ts
42
41
  import { defineSchedule } from "@cursor/july/schedules";
@@ -45,7 +44,6 @@ import webhook from "../channels/webhook.js";
45
44
  export default defineSchedule({
46
45
  cron: "*/30 * * * *",
47
46
  async run({ receive, waitUntil, appAuth, host }) {
48
- // optional: await host.mcp.callTool("units", "celsius_to_fahrenheit", { value: 0 });
49
47
  waitUntil(
50
48
  receive(webhook, {
51
49
  message:
@@ -64,14 +62,12 @@ schedule-scoped principal for work the agent does on its own behalf),
64
62
  and `host` (shared services: `host.mcp`, `host.github`, `host.slack`,
65
63
  `host.reminders`).
66
64
 
67
- ### Dispatch and dev mode
65
+ ### Dispatch a schedule
68
66
 
69
- In production (`agent-sdk serve`), schedules fire on their cron
70
- cadence. Disable them with `--no-schedules`. There's no cross-host
71
- coordination, so run them in exactly one process per project.
72
-
73
- In dev (`serve --dev`), schedules never fire automatically. Dispatch one
74
- by hand, exactly once, through the same path production uses:
67
+ | Mode | What fires |
68
+ | --- | --- |
69
+ | Production `agent-sdk serve` | Cron cadence. `--no-schedules` disables them. Run them in exactly one process per project |
70
+ | `serve --dev` | Nothing automatic. Dispatch by hand through the same path production uses |
75
71
 
76
72
  ```bash
77
73
  curl -X POST http://127.0.0.1:3000/<slug>/v1/dev/schedules/heartbeat
@@ -83,104 +79,67 @@ The playground can dispatch schedules in dev mode too, and
83
79
 
84
80
  ## Reminders
85
81
 
86
- A reminder is created at runtime and bound to a channel continuation.
87
- When it fires, it wakes that conversation. Recurring reminders behave
88
- like `setInterval`, one-shots like `setTimeout`, and both are durable on
89
- disk.
82
+ A reminder is created at runtime and bound to a channel continuation. A
83
+ prompt reminder wakes that conversation when it fires; a handler reminder
84
+ runs host code, which can call `followup` to wake it. Recurring reminders
85
+ behave like `setInterval`, and one-shots behave like `setTimeout`. Prompt
86
+ and named-handler reminders stay armed across restarts.
90
87
 
91
88
  ```ts
92
89
  await handle.createReminder({
93
90
  purpose: "ci_recheck",
94
91
  channelId: "drive",
95
- continuationToken: "pr:owner/repo#1",
96
- delay: "2h", // or a cron / explicit schedule
92
+ continuationToken: "pr:acme/checkout#42",
93
+ delay: "2h",
97
94
  prompt: "Re-check CI. Only act if still failing.",
98
95
  until: "Cancel once CI is green or the PR is merged.",
99
96
  });
100
97
  ```
101
98
 
102
- Use `run` when host code should decide what happens on each tick:
99
+ When host code must decide what happens on each tick, author a named
100
+ handler and pass its default export with serializable `args`:
103
101
 
104
102
  ```ts
105
- await handle.createReminder({
106
- purpose: "ci_recheck",
107
- channelId: "drive",
108
- continuationToken: "pr:owner/repo#1",
109
- every: "30m",
110
- async run({ fireCount, followup }) {
111
- if (fireCount >= 3) {
112
- return { action: "stop" };
113
- }
103
+ // agent/reminders/ci_recheck.ts
104
+ import { defineReminder } from "@cursor/july/reminders";
114
105
 
106
+ export default defineReminder({
107
+ async run({ args, followup }) {
115
108
  await followup({
116
- message: "Re-check CI and report only if the status changed.",
109
+ message: `Re-check CI for ${String(args.prUrl)}. Report only if the status changed.`,
117
110
  });
118
111
  return { action: "delivered" };
119
112
  },
120
113
  });
121
114
  ```
122
115
 
123
- This reminder wakes the conversation three times, then stops itself.
124
-
125
- The same API is `host.reminders` on channel handlers, tools, and
126
- schedule runs. An agent can even be given a tool that creates its own
127
- reminders.
128
-
129
- For example, create `agent/tools/remind_me.ts`:
130
-
131
116
  ```ts
132
- import { defineTool } from "@cursor/july/tools";
133
- import { z } from "zod";
134
-
135
- export default defineTool({
136
- description: "Schedule a one-time reminder in this conversation.",
137
- inputSchema: z.object({
138
- delay: z
139
- .string()
140
- .describe("When to wake the conversation, such as 20m or 2h"),
141
- prompt: z
142
- .string()
143
- .min(1)
144
- .describe("What the agent should do when it wakes"),
145
- }),
146
- async execute({ delay, prompt }, ctx) {
147
- const reminders = ctx.host.reminders;
148
- if (reminders === undefined) {
149
- throw new Error("Reminders are disabled on this host.");
150
- }
151
-
152
- const continuationToken = ctx.session.continuationKey;
153
- if (continuationToken == null) {
154
- throw new Error("This session cannot receive reminder follow-ups.");
155
- }
156
-
157
- const reminder = await reminders.create({
158
- purpose: "user_follow_up",
159
- channelId: ctx.session.channelId,
160
- continuationToken,
161
- delay,
162
- prompt,
163
- });
117
+ import ciRecheck from "./agent/reminders/ci_recheck.js";
164
118
 
165
- return {
166
- reminderId: reminder.id,
167
- nextFireAt: reminder.nextFireAt,
168
- };
169
- },
119
+ await handle.createReminder({
120
+ purpose: "ci_recheck",
121
+ channelId: "drive",
122
+ continuationToken: "pr:acme/checkout#42",
123
+ every: "30m",
124
+ handler: ciRecheck,
125
+ args: { prUrl: "https://github.com/acme/checkout/pull/42" },
170
126
  });
171
127
  ```
172
128
 
173
- The tool binds the reminder to the current channel conversation. When
174
- the delay expires, the prompt returns to the same session as a follow-up.
129
+ Use an anonymous `run` handler only for legacy projects that can re-arm
130
+ it after a restart. New projects should use a named handler.
175
131
 
176
- Reminders fire in one of two styles. The **prompt form** (above) sends
177
- `prompt` into the session, with `until` stating the standing
178
- cancellation condition for the model to honor. The **run form** passes a
179
- `run` handler instead: it returns `stop`, `skip`, or `delivered` per
180
- tick. That's silent host-side policy with no model turn. Run handlers are
181
- in-memory, so after a restart those reminders are disarmed
182
- (`handler_lost_on_restart`); re-arm them from the code path that created
183
- them, or prefer the prompt form.
132
+ | Form | What it does | After a restart |
133
+ | --- | --- | --- |
134
+ | Prompt | Sends `prompt` into the session. `until` is the standing cancellation condition for the model | Stays armed |
135
+ | Named handler | Runs a discovered handler with serializable `args`; it starts a model turn only if the handler calls `followup` | Stays armed |
136
+ | Anonymous `run` | Host handler returns `stop`, `skip`, or `delivered` per tick; it starts a model turn only if it calls `followup` | Must be re-armed |
137
+
138
+ The same API is `host.reminders` on channel handlers, tools, and
139
+ schedule runs. `builtinTools: { reminders: true }` adds
140
+ `reminders_create`, `reminders_list`, and `reminders_cancel` on the
141
+ current conversation; see
142
+ [Agent config: built-in tools](./agent-config.md#built-in-tools).
184
143
 
185
144
  `--dev` does not auto-fire reminders. Dispatch one by hand:
186
145
 
@@ -191,27 +150,21 @@ curl -X POST http://127.0.0.1:3000/<slug>/v1/dev/reminders/<id> # fire one
191
150
 
192
151
  `handle.dispatchReminder(id)` is the programmatic equivalent.
193
152
 
194
- Two habits worth copying: cancel reminders when their subject
195
- dies (say, cancel PR-scoped reminders on `pull_request.closed`), and keep
196
- wake prompts generic. A plain "re-check the PR" works better than
197
- replaying stale payload details, because the agent re-reads the live
198
- state when it wakes.
153
+ Cancel reminders when their subject dies, for example on
154
+ `pull_request.closed`. Keep wake prompts generic so the agent re-reads
155
+ live state instead of replaying a stale payload.
199
156
 
200
- ## Schedule or reminder?
201
-
202
- The split comes down to scope and timing.
157
+ ## Schedules vs reminders
203
158
 
204
159
  | | Schedule | Reminder |
205
160
  | -------- | ---------------------------------------------------------- | ----------------------------------------------- |
206
161
  | Defined | at deploy time, `agent/schedules/*` | at runtime, `createReminder` / `host.reminders` |
207
162
  | Scope | global to the agent | one channel continuation (one conversation) |
208
163
  | Session | starts a new task session (or hands off through `receive`) | wakes an existing conversation |
209
- | Cadence | cron (UTC) | delay, cron, or explicit schedule |
164
+ | Cadence | cron (UTC) | `every`, `cron`, `delay`, or `at` |
210
165
  | Dev mode | manual dispatch only | manual dispatch only (timers off) |
211
166
 
212
- ## What's next
213
-
214
- Continue with these pages:
167
+ ## Related
215
168
 
216
169
  - [Channels](./channels.md): `receive` and the delivery events
217
170
  - [GitHub guide](../guides/github.md): reminders in a real webhook loop
@@ -6,9 +6,12 @@ description: "Understand how conversations continue, how events stream, and wher
6
6
  # Sessions, events, and streaming
7
7
 
8
8
  A session keeps one conversation, its workspace, and an append-only
9
- record of every message and tool call.
9
+ record of every message and tool call. Continue it with a continuation
10
+ token, inspect it with a session ID, and follow progress on the NDJSON
11
+ stream. Chat sessions wait for follow-ups; task sessions run once and
12
+ stop.
10
13
 
11
- ## What does a session contain?
14
+ ## Session contents
12
15
 
13
16
  Each session combines:
14
17
 
@@ -16,12 +19,12 @@ Each session combines:
16
19
  - A conversation the caller can continue
17
20
  - A workspace for local turns
18
21
  - An NDJSON event stream
19
- - Runtime state needed to resume after a server restart
22
+ - State that lets the conversation resume after a restart
20
23
 
21
24
  Sessions belong to the principal that created them. Follow-up, stream,
22
25
  and list routes return `403` when another caller tries to access one.
23
26
 
24
- ## Which session identifier should I use?
27
+ ## Session identifiers
25
28
 
26
29
  Sessions have two identifiers because conversation routing and
27
30
  inspection are different jobs.
@@ -39,7 +42,7 @@ accepted follow-up. Reusing a stale HTTP token returns `409`.
39
42
  Use the continuation token to keep talking. Use the session ID to
40
43
  observe or manage the stored session.
41
44
 
42
- ## Which session modes are available?
45
+ ## Session modes
43
46
 
44
47
  | Mode | Created by | What happens after a turn |
45
48
  | --- | --- | --- |
@@ -48,7 +51,7 @@ observe or manage the stored session.
48
51
 
49
52
  Task sessions don't accept follow-ups. Trying one returns `409`.
50
53
 
51
- ## What happens when I send a follow-up?
54
+ ## Follow-ups
52
55
 
53
56
  A follow-up to an idle chat session starts another turn. Admission when
54
57
  the session is already busy depends on the channel:
@@ -56,23 +59,21 @@ the session is already busy depends on the channel:
56
59
  | Path | Busy-session policy |
57
60
  | --- | --- |
58
61
  | HTTP playground / `POST /v1/session/:id` / MCP `ask` | **Preempt** (default): interrupt the in-flight turn, wait for it to settle, then run the new message |
59
- | Slack mentions / DMs / alert-watch | **Coalesce**: leave the active turn running, enqueue the follow-up, and drain queued asks into one follow-up turn when the active turn finishes (no mid-turn tool/hook inject) |
62
+ | Slack mentions / DMs / alert-watch | **Coalesce**: leave the active turn running and queue the follow-up. The running turn may receive it at a tool boundary; any asks that remain become one follow-up turn when it finishes |
60
63
 
61
64
  Pass `admission: "coalesce"` on `send()` to opt into the Slack policy from
62
65
  other callers. Omit it (or pass `"preempt"`) to keep interrupt semantics.
63
66
 
64
67
  `POST /v1/session/:id/stop` interrupts a turn without sending a new
65
- message. Interrupted turns record `turn.failed` with
66
- `"turn interrupted"`. This means the turn was preempted. A whole-message
67
- Slack `stop` / `@agent stop` does the same for that thread and clears
68
- pending coalesced nudges.
68
+ message. The stream records `turn.failed` with `status: "cancelled"`;
69
+ the session stays a chat session and can take another follow-up. A
70
+ whole-message Slack `stop` / `@agent stop` does the same for that thread
71
+ and clears pending coalesced follow-ups.
69
72
 
70
- Session-bound deterministic tool calls share the lock only for writes: a
71
- write-effect call returns `409 session_busy` while a model turn is
72
- running, a read-effect call runs alongside the turn (see
73
- [Tools](./tools.md#call-a-tool-without-a-model-turn)).
73
+ See [Tools](./tools.md#call-a-tool-without-a-model-turn) for direct-call
74
+ behavior while a session is busy.
74
75
 
75
- ## Which events can I stream?
76
+ ## Stream events
76
77
 
77
78
  Each NDJSON line uses this envelope:
78
79
  `{ type, index, sessionId, turnId?, at, data }`. The `index` increases
@@ -94,13 +95,11 @@ within one session. The `at` field is an ISO-8601 timestamp.
94
95
 
95
96
  Pair `actions.requested` with `action.result` to reconstruct the tool
96
97
  trajectory. Read `turn.completed.data.usage` for input, output, and
97
- cache token counts. When `agent/result.ts` is authored, a thrown
98
- `commit`, a `ctx.reject` that exhausts the two-repair budget, or empty
99
- assistant text emits `turn.failed` instead of `turn.completed`.
100
- `ctx.reject(message)` re-runs the same turn with that message so the
101
- model can revise while tools and the session filesystem are still up.
98
+ cache token counts. With `agent/result.ts`, `turn.failed` is emitted when
99
+ `commit` throws, the turn has no assistant text, or `ctx.reject(message)`
100
+ doesn't lead to an accepted revision.
102
101
 
103
- ## How do I stream or replay session events?
102
+ ## Stream or replay events
104
103
 
105
104
  One endpoint handles both live streaming and replay:
106
105
 
@@ -108,27 +107,27 @@ One endpoint handles both live streaming and replay:
108
107
  curl -N 'http://127.0.0.1:3000/<slug>/v1/session/ses_…/stream?startIndex=0'
109
108
  ```
110
109
 
111
- Pass `startIndex` to continue after the last event you received. Omit it
112
- or pass `0` to replay the full session before following new events.
110
+ Pass `startIndex` to continue after the last event you received,
111
+ including after a server restart. Omit it or pass `0` to replay the
112
+ full session before following new events.
113
113
  `GET /v1/session/:id/events` returns a one-time dump without staying
114
114
  connected.
115
115
 
116
- Event streams replay from disk after a server restart. Conversation
117
- state resumes from the Cursor SDK store.
118
-
119
- ## What goes into a local session workspace?
116
+ ## Local session workspace
120
117
 
121
118
  The Agent SDK creates a workspace before the first local turn:
122
119
 
123
120
  | Source path | Lands as |
124
121
  | ---------------------------------- | ----------------------------------------------------------------------- |
125
- | `instructions.*` | `AGENTS.md` |
126
122
  | `skills/*` | `.cursor/skills/<name>/SKILL.md` |
127
123
  | agent tools (`execution: "agent"`) | scripts in the session workspace, with a catalog in `AGENTS.md` |
128
124
  | `sandbox/workspace/**` | copied in as seed files |
129
125
  | per-send `workspaceFiles` | written before the turn |
130
126
 
131
- The local harness uses this workspace as its working directory. Parent
127
+ Instructions reach the model as its system prompt; they aren't written
128
+ into the workspace. See [Instructions](./instructions.md#delivery).
129
+
130
+ Local turns use this workspace as their working directory. Parent
132
131
  directories can contribute `AGENTS.md` and `.cursor` settings. Set
133
132
  `local.cwd` when you need a clean parent directory. A channel can also
134
133
  provide a different working directory for one session, such as a PR
@@ -137,20 +136,16 @@ worktree.
137
136
  See [Agent config: local cwd](./agent-config.md#local-cwd) for the
138
137
  inheritance rules.
139
138
 
140
- ## Where does the Agent SDK store session data?
139
+ ## Session storage
141
140
 
142
- Local state lives under `--state-root`. Slugged mounts store it under
143
- a subdirectory named for the slug.
141
+ Local session state lives under `--state-root`. A slugged mount stores
142
+ it in a subdirectory named for the slug.
144
143
 
145
144
  Deleting a session directory removes the session from the server: it
146
145
  disappears from listings and can no longer be streamed or continued.
147
146
  Cloud conversations remain on the Cursor backend.
148
147
 
149
- Nested git checkouts already default `local.cwd` outside the enclosing
150
- repo. See
151
- [What goes into a local session workspace?](#what-goes-into-a-local-session-workspace).
152
-
153
- ## How do I inspect a saved event stream?
148
+ ## Inspect a saved event stream
154
149
 
155
150
  Use `trajectory` with a saved trace:
156
151
 
@@ -159,10 +154,11 @@ agent-sdk trajectory --events <state-root>/traces/<sessionId>.ndjson
159
154
  ```
160
155
 
161
156
  The command prints tool calls, the reply, and token usage in the same
162
- JSON shape as `run`. Use **Open trace** in the playground for a visual
163
- view.
157
+ JSON shape as `run`. Open the session's **Trace** view in the playground
158
+ for a visual timeline.
164
159
 
165
160
  ## Related
166
161
 
167
162
  - [HTTP API](./http-api.md)
168
163
  - [Hooks](./hooks.md)
164
+ - [Tools](./tools.md)
@@ -13,15 +13,15 @@ always-on [instructions](./instructions.md).
13
13
 
14
14
  ## Authoring forms
15
15
 
16
- Three forms cover every case.
16
+ Skills support three authoring forms.
17
17
 
18
18
  | Form | Reach for it when |
19
19
  | --- | --- |
20
- | `agent/skills/<name>.md` | Flat markdown. Optional `description` frontmatter; the first body line is the fallback. |
20
+ | `agent/skills/<name>.md` | Static Markdown. Optional `description` frontmatter; the first body line is the fallback. |
21
21
  | `agent/skills/<name>/SKILL.md` plus siblings | A packaged directory with reference files (`references/…`). Requires `description` frontmatter. |
22
22
  | `agent/skills/<name>.ts` | Generated content, with `defineSkill` from `@cursor/july/skills`. |
23
23
 
24
- Flat markdown:
24
+ Use flat Markdown for static content:
25
25
 
26
26
  ```md
27
27
  ---
@@ -35,8 +35,8 @@ description: Use when a pull request needs a structured approval checklist.
35
35
  3. Call `approve_pr` only after an explicit request; it requires approval.
36
36
  ```
37
37
 
38
- TypeScript, when the content must be generated or carry inline sibling
39
- files:
38
+ Use TypeScript when the content must be generated or include inline
39
+ sibling files:
40
40
 
41
41
  ```ts
42
42
  import { defineSkill } from "@cursor/july/skills";
@@ -48,40 +48,29 @@ export default defineSkill({
48
48
  });
49
49
  ```
50
50
 
51
- ## How skills reach the model
51
+ ## Skill delivery
52
52
 
53
- On the local runtime, skills land in the session workspace at
54
- `.cursor/skills/<name>/SKILL.md`, and the harness advertises and loads
55
- them natively. On the cloud runtime there is no session workspace, so
56
- the engine copies the same SKILL.md tree onto an Agent Store for native
57
- discovery:
53
+ Local turns receive authored skills automatically. Hosted deployments
54
+ and local `serve` or `run` processes with a personal `CURSOR_API_KEY`
55
+ also make them available to cloud turns. Otherwise, a cloud turn sees
56
+ only skills already in its checkout. `agent-sdk validate` warns when
57
+ `runtime: "cloud"` is combined with authored skills.
58
58
 
59
- - Hosted deployments write store-root `skills/<name>/`.
60
- - `agent-sdk serve` / `run` with a personal `CURSOR_API_KEY` write
61
- namespaced skills on the USER store so they cannot collide with the
62
- user's own skills.
63
-
64
- `validate` still warns about the combination so the store path is
65
- visible. Cloud turns with neither a hosted store nor an API key see
66
- only skills already in the cloud repo.
67
-
68
- ## Instructions, skills, or tools?
59
+ ## Skills, instructions, and tools
69
60
 
70
61
  Instructions are always in context: identity, tool-choice rules, the
71
62
  output contract. Keep them short. Skills load when relevant: procedures,
72
63
  checklists, house style. Reach for a skill when the model needs to
73
- *follow* something but only sometimes needs it loaded. Tools are typed,
64
+ follow something but only sometimes needs it loaded. Tools are typed,
74
65
  executable behavior: anything that must be correct every time belongs in
75
66
  tool code, not in prose the model might paraphrase.
76
67
 
77
- A good skill description is a routing rule, not a title. Say *when* to
68
+ A good skill description is a routing rule, not a title. Say when to
78
69
  use it, like "Use when a pull request needs a structured approval
79
70
  checklist," because the description is all the model sees before
80
71
  deciding to load it.
81
72
 
82
- ## What's next
83
-
84
- Continue with these pages:
73
+ ## Related
85
74
 
86
75
  - [Instructions](./instructions.md): what stays always-on
87
76
  - [Tools](./tools.md): when prose needs to become code