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