@cursor/july 0.1.89 → 0.1.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -0
- package/README.md +98 -96
- package/dist/ab.d.ts +1 -1
- package/dist/ab.js +1 -1
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/bin/agent-serve.js +20 -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/channels.d.ts +1 -1
- package/dist/channels.js +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +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.DUOPbN18.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.CmWbGcGk.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.BXAm6G-C.js → concepts.md.CRfU3bVg.js} +1 -1
- package/dist/docs/assets/{concepts.md.BXAm6G-C.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.D3MdHM2z.js → reference_project-layout.md.CwkSbEWT.js} +5 -20
- package/dist/docs/assets/reference_project-layout.md.CwkSbEWT.lean.js +1 -0
- 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.DTg_kEsx.js → reference_tools.md.wpaJtHn6.js} +23 -3
- package/dist/docs/assets/{reference_tools.md.DTg_kEsx.lean.js → reference_tools.md.wpaJtHn6.lean.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.CiGsJ1aw.js → scaffolding-agents.md.CRDDUtYJ.js} +1 -1
- package/dist/docs/assets/{scaffolding-agents.md.CiGsJ1aw.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 +10 -25
- 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 +29 -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/evals.d.ts +1 -1
- package/dist/evals.js +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/internal/cli-convert-automation.d.ts +1 -1
- package/dist/internal/cli-convert-automation.js +1 -1
- package/dist/internal/cli-cursor.d.ts +12 -4
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +11 -4
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +21 -3
- package/dist/internal/convert-automation/convert-workflow.d.ts +1 -1
- package/dist/internal/convert-automation/convert-workflow.js +9 -9
- package/dist/internal/convert-automation/types.d.ts +1 -1
- package/dist/internal/convert-automation/types.js +1 -1
- package/dist/internal/cursor/backend-client.d.ts +9 -1
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +19 -6
- package/dist/internal/cursor/credentials.d.ts +35 -9
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +92 -39
- 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 +17 -1
- package/dist/internal/distribution.d.ts +18 -0
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +19 -0
- package/dist/internal/eval-runner.js +1 -1
- package/dist/internal/grokbot/runner.d.ts +5 -2
- package/dist/internal/grokbot/runner.d.ts.map +1 -1
- package/dist/internal/grokbot/runner.js +10 -6
- 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 +10 -1
- package/dist/internal/sdk-runner.d.ts +5 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +10 -5
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +80 -36
- 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-BmiIjFlM.js → index-DDvyC2z6.js} +49 -49
- package/dist/playground/index.html +2 -2
- package/dist/reminders.d.ts +1 -1
- package/dist/reminders.js +1 -1
- package/dist/schedules.d.ts +1 -1
- package/dist/schedules.js +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/storage.d.ts +1 -1
- package/dist/storage.js +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +1 -1
- package/dist/types.d.ts +10 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/docs/README.md +3 -1
- package/docs/concepts.md +2 -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/project-layout.md +5 -20
- package/docs/reference/tools.md +51 -3
- package/docs/scaffolding-agents.md +2 -0
- package/docs/templates/triage.md +3 -5
- package/docs/troubleshooting.md +1 -1
- package/package.json +2 -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/ab.ts +1 -1
- package/src/artifacts.ts +1 -1
- package/src/bin/agent-serve.ts +20 -6
- 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/channels.ts +1 -1
- package/src/connections.ts +1 -1
- package/src/evals.ts +1 -1
- package/src/hooks.ts +1 -1
- package/src/index.ts +2 -2
- package/src/internal/cli-convert-automation.ts +1 -1
- package/src/internal/cli-cursor.ts +18 -5
- package/src/internal/cli-deploy.ts +27 -7
- package/src/internal/convert-automation/convert-workflow.ts +9 -9
- package/src/internal/convert-automation/types.ts +1 -1
- package/src/internal/cursor/backend-client.ts +29 -4
- package/src/internal/cursor/credentials.ts +87 -24
- 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 +21 -1
- package/src/internal/distribution.ts +31 -0
- package/src/internal/eval-runner.ts +1 -1
- package/src/internal/grokbot/runner.ts +15 -6
- package/src/internal/http-channel.ts +14 -41
- package/src/internal/init-project.ts +13 -1
- package/src/internal/sdk-runner.ts +10 -4
- package/src/internal/server.ts +95 -33
- package/src/internal/session-engine.ts +58 -8
- package/src/reminders.ts +1 -1
- package/src/schedules.ts +1 -1
- package/src/skills.ts +1 -1
- package/src/storage.ts +1 -1
- package/src/tools.ts +1 -1
- package/src/types.ts +10 -7
- 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.CxCtxfDE.js +0 -1
- package/dist/docs/assets/chunks/theme.S57OeOLA.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/reference_project-layout.md.D3MdHM2z.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.KgmmaCgw.js +0 -1
- package/dist/playground/assets/index-DQGZnAI0.css +0 -1
package/docs/reference/tools.md
CHANGED
|
@@ -100,6 +100,55 @@ typecheck will.
|
|
|
100
100
|
Throwing inside `execute` reports an error result to the model
|
|
101
101
|
(`isError: true`). The turn and the server keep running.
|
|
102
102
|
|
|
103
|
+
### Declare structured output
|
|
104
|
+
|
|
105
|
+
Set `outputSchema` when MCP clients need a structured result contract. Use a
|
|
106
|
+
Zod schema or plain JSON Schema:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
const Weather = z.object({
|
|
110
|
+
city: z.string(),
|
|
111
|
+
temperatureF: z.number(),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export default defineTool({
|
|
115
|
+
description: "Read the current weather.",
|
|
116
|
+
inputSchema: z.object({ city: z.string() }),
|
|
117
|
+
outputSchema: Weather,
|
|
118
|
+
async execute({ city }) {
|
|
119
|
+
return { city, temperatureF: 72 };
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The Agent SDK advertises the schema. It does not validate tool results against
|
|
125
|
+
it. Plain object returns fill MCP `structuredContent` automatically. An
|
|
126
|
+
envelope return must set `structuredContent` next to `content` and `isError`.
|
|
127
|
+
|
|
128
|
+
Use the exported `ToolInput<TSchema>` type when another function needs the
|
|
129
|
+
input type inferred from a tool schema.
|
|
130
|
+
|
|
131
|
+
### Control dry-run effects
|
|
132
|
+
|
|
133
|
+
Set `effect` to `"read"`, `"write"`, or a predicate over validated input.
|
|
134
|
+
A dry-run session executes reads and answers writes without running their
|
|
135
|
+
tool bodies. An authored tool without `effect` is treated as a write.
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
export default defineTool({
|
|
139
|
+
description: "Publish a release.",
|
|
140
|
+
inputSchema: z.object({ version: z.string() }),
|
|
141
|
+
effect: "write",
|
|
142
|
+
dryRunResult: ({ version }) => ({ published: false, version }),
|
|
143
|
+
async execute({ version }) {
|
|
144
|
+
return publishRelease(version);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
`dryRunResult` keeps the result shape stable. Without it, a stubbed write
|
|
150
|
+
returns `"Operation acknowledged."`. Traces mark the result as stubbed.
|
|
151
|
+
|
|
103
152
|
## Define an agent tool
|
|
104
153
|
|
|
105
154
|
Set `execution: "agent"` and the tool materializes as a shell script
|
|
@@ -240,9 +289,8 @@ spoofed payload can't steer it.
|
|
|
240
289
|
Test tools with `call` before blaming prompts. If the tool's output is
|
|
241
290
|
wrong, no instruction change fixes it.
|
|
242
291
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
anything destructive.
|
|
292
|
+
Gate side effects with `needsApproval`. Declare each tool's `effect` so
|
|
293
|
+
dry-run sessions can execute reads and stub writes.
|
|
246
294
|
|
|
247
295
|
## What's next
|
|
248
296
|
|
|
@@ -86,8 +86,10 @@ No files change before you approve this step.
|
|
|
86
86
|
|
|
87
87
|
A first version usually includes:
|
|
88
88
|
|
|
89
|
+
- `AGENTS.md`, `.gitignore`, `package.json`, and `tsconfig.json`
|
|
89
90
|
- `agent/agent.ts` for the model and runtime
|
|
90
91
|
- `agent/instructions.md` for the always-on prompt
|
|
92
|
+
- `agent/hooks/memory.ts` for memory guidance
|
|
91
93
|
- One or two tools under `agent/tools/`
|
|
92
94
|
- Any channels or MCP connections you selected
|
|
93
95
|
- `evals/evals.config.ts` and one smoke eval
|
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": {
|
|
@@ -225,6 +225,7 @@
|
|
|
225
225
|
"node": ">=22.13"
|
|
226
226
|
},
|
|
227
227
|
"dependencies": {
|
|
228
|
+
"@bazel/runfiles": "6.5.0",
|
|
228
229
|
"@cursor/sdk": "1.0.28",
|
|
229
230
|
"@modelcontextprotocol/sdk": "1.25.1",
|
|
230
231
|
"@octokit/auth-app": "^7.2.0",
|
|
@@ -59,11 +59,11 @@ questions, concrete options, the recommended option listed first and labeled
|
|
|
59
59
|
|
|
60
60
|
| Question | Options | Guidance |
|
|
61
61
|
| --- | --- | --- |
|
|
62
|
-
| **Runtime** | `local` (default) · `cloud` | Local
|
|
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
|
},
|
package/src/ab.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* sample/snapshot export lives on the `defineStorage` `abs` table.
|
|
15
15
|
*
|
|
16
16
|
* ```ts
|
|
17
|
-
* import { defineAB, splitBySessionHash } from "@
|
|
17
|
+
* import { defineAB, splitBySessionHash } from "@cursor/july/ab";
|
|
18
18
|
*
|
|
19
19
|
* export default defineAB({
|
|
20
20
|
* name: "concise-instructions",
|
package/src/artifacts.ts
CHANGED
package/src/bin/agent-serve.ts
CHANGED
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
import { cmdManifest } from "../internal/cli-manifest.js";
|
|
62
62
|
import {
|
|
63
63
|
CLI_COMMAND_NAME as CLI,
|
|
64
|
+
formatCliVersion,
|
|
64
65
|
PACKAGE_NAME,
|
|
65
66
|
packageVersion,
|
|
66
67
|
} from "../internal/distribution.js";
|
|
@@ -135,7 +136,7 @@ Usage:
|
|
|
135
136
|
${CLI} logout
|
|
136
137
|
${CLI} whoami [--json]
|
|
137
138
|
${CLI} update
|
|
138
|
-
${CLI} version
|
|
139
|
+
${CLI} version [--json]
|
|
139
140
|
${CLI} deploy [--dir <path>] [--slug <slug> | --all] [--team <id>] [--json]
|
|
140
141
|
[--no-wait] [--repo <url>] [--ref <ref>]
|
|
141
142
|
[--path <agentPath>] [--cursor-events-repo <owner/name>]...
|
|
@@ -205,7 +206,7 @@ Commands:
|
|
|
205
206
|
prompt. --json is machine-readable and never blocks on
|
|
206
207
|
login. No directory: print the setup guide.
|
|
207
208
|
convert-automation
|
|
208
|
-
Export a Cursor Automation into an
|
|
209
|
+
Export a Cursor Automation into an agentsdk project. <url> is
|
|
209
210
|
the dashboard URL (…/automations/<uuid> or
|
|
210
211
|
…/custom-agents/<uuid>) or a bare uuid. Fetches the definition
|
|
211
212
|
with your Cursor credentials, writes the converted files into
|
|
@@ -258,7 +259,9 @@ Commands:
|
|
|
258
259
|
whoami Show which Cursor account powers this host (and why).
|
|
259
260
|
update Upgrade this install to the latest published version (detects
|
|
260
261
|
global npm/pnpm/yarn/bun installs and project dependencies).
|
|
261
|
-
version Print the
|
|
262
|
+
version Print the ${PACKAGE_NAME} version this CLI will use and exit
|
|
263
|
+
(also --version / -V). Text is the version number; --json
|
|
264
|
+
prints { name, version, cli }.
|
|
262
265
|
deploy Deploy onto Cursor's managed agent-serve hosting, then wait for
|
|
263
266
|
the engine to come up. --repo/--ref/--path stay available;
|
|
264
267
|
inside an agent git checkout they are inferred when omitted
|
|
@@ -292,7 +295,7 @@ Agent loop:
|
|
|
292
295
|
${CLI} dev .
|
|
293
296
|
|
|
294
297
|
Options:
|
|
295
|
-
--version, -V Print the
|
|
298
|
+
--version, -V Print the version number and exit.
|
|
296
299
|
--dir Project root (defaults to the current directory).
|
|
297
300
|
--port Port to listen on (default 3000). When the default is
|
|
298
301
|
taken, serve tries the next free port and prints a notice.
|
|
@@ -400,7 +403,7 @@ Options:
|
|
|
400
403
|
--skip-report eval: ignore reporters from evals.config.ts / eval files.
|
|
401
404
|
--no-stream run/eval: silence live progress on stderr (JSON still prints).
|
|
402
405
|
--json JSON output (init/convert-automation/install-skills/
|
|
403
|
-
info/chat/eval/logs/
|
|
406
|
+
info/chat/eval/logs/version/
|
|
404
407
|
sessions/session/github; run defaults to JSON). logs:
|
|
405
408
|
NDJSON progress/log events. session: trajectory JSON
|
|
406
409
|
(not raw events).
|
|
@@ -474,7 +477,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
474
477
|
return command === undefined ? 1 : 0;
|
|
475
478
|
}
|
|
476
479
|
if (command === "version" || command === "--version" || command === "-V") {
|
|
477
|
-
await writeStdout(
|
|
480
|
+
await writeStdout(formatCliVersion({ json: restIn.includes("--json") }));
|
|
478
481
|
return 0;
|
|
479
482
|
}
|
|
480
483
|
|
|
@@ -574,9 +577,14 @@ async function main(argv: string[]): Promise<number> {
|
|
|
574
577
|
"no-artifacts": { type: "boolean", default: false },
|
|
575
578
|
"skip-report": { type: "boolean", default: false },
|
|
576
579
|
"max-concurrency": { type: "string" },
|
|
580
|
+
version: { type: "boolean", short: "V", default: false },
|
|
577
581
|
},
|
|
578
582
|
});
|
|
579
583
|
const dir = values.dir ?? ".";
|
|
584
|
+
if (values.version === true) {
|
|
585
|
+
await writeStdout(formatCliVersion({ json: values.json === true }));
|
|
586
|
+
return 0;
|
|
587
|
+
}
|
|
580
588
|
|
|
581
589
|
// Best-effort, cached, and silent on failure. `update` does its own fresh
|
|
582
590
|
// lookup, --json runs stay quiet for machine consumers, and `mcp` skips it
|
|
@@ -1301,8 +1309,14 @@ async function main(argv: string[]): Promise<number> {
|
|
|
1301
1309
|
loadLocalEnv();
|
|
1302
1310
|
// Model turns need a Cursor credential. Prompt login before listen
|
|
1303
1311
|
// so the first playground turn does not fail with a late auth error.
|
|
1312
|
+
// `--allow-anonymous` is the hosted trust boundary (alias token /
|
|
1313
|
+
// freeze bake): skip the login gate so health can bind without a
|
|
1314
|
+
// key. v1 hosted injects CURSOR_API_KEY at exec; freeze bind drops
|
|
1315
|
+
// CURSOR_API_KEY / CURSOR_API_KEY_FILE onto the listening process.
|
|
1316
|
+
// Self-hosted omit the flag and still fail-fast unsigned on a TTY-less host.
|
|
1304
1317
|
const loginExit = await ensureCursorLogin({
|
|
1305
1318
|
apiKey: values["api-key"],
|
|
1319
|
+
allowAnonymous: values["allow-anonymous"] === true,
|
|
1306
1320
|
});
|
|
1307
1321
|
if (loginExit !== 0) {
|
|
1308
1322
|
return { kind: "login-failed", exitCode: loginExit };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Opt-in channel watch: dispatch on posts in allowlisted channels.
|
|
3
3
|
*
|
|
4
4
|
* Filtering rules (the anti-slop guarantees):
|
|
5
|
-
* - Only
|
|
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
|
/**
|
package/src/channels.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* and are mounted under `/v1/channels/<name>`:
|
|
10
10
|
*
|
|
11
11
|
* ```ts
|
|
12
|
-
* import { defineChannel, POST } from "@
|
|
12
|
+
* import { defineChannel, POST } from "@cursor/july/channels";
|
|
13
13
|
* import { z } from "zod";
|
|
14
14
|
*
|
|
15
15
|
* export default defineChannel({
|
package/src/connections.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `hostOnly: true` to keep it off the model (still on `host.mcp`).
|
|
9
9
|
*
|
|
10
10
|
* ```ts
|
|
11
|
-
* import { defineConnection } from "@
|
|
11
|
+
* import { defineConnection } from "@cursor/july/connections";
|
|
12
12
|
*
|
|
13
13
|
* export default defineConnection({
|
|
14
14
|
* url: "https://mcp.linear.app/mcp",
|
package/src/evals.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `t.messageIncludes(...)`, or `t.check(value, includes(...))`.
|
|
8
8
|
*
|
|
9
9
|
* ```ts
|
|
10
|
-
* import { defineEval, includes } from "@
|
|
10
|
+
* import { defineEval, includes } from "@cursor/july/evals";
|
|
11
11
|
*
|
|
12
12
|
* // One datapoint — id is the file path (evals/weather/nyc.eval.ts → weather/nyc)
|
|
13
13
|
* export default defineEval({
|
package/src/hooks.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
2
|
+
* @cursor/july
|
|
3
3
|
*
|
|
4
4
|
* Filesystem-first framework for Cursor agents: define an agent as markdown
|
|
5
5
|
* and TypeScript files under an `agent/` directory, and serve it over
|
|
6
6
|
* channels with the Cursor SDK as the execution harness.
|
|
7
7
|
*
|
|
8
8
|
* ```ts
|
|
9
|
-
* import { serve } from "@
|
|
9
|
+
* import { serve } from "@cursor/july";
|
|
10
10
|
*
|
|
11
11
|
* const handle = await serve(".", { port: 3000 });
|
|
12
12
|
* console.log(`agent listening on ${handle.url}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `agent-serve convert-automation <url>` — export a Cursor Automation into
|
|
3
|
-
* an
|
|
3
|
+
* an agentsdk project.
|
|
4
4
|
*
|
|
5
5
|
* Fetches the automation's workflow from the backend export endpoint
|
|
6
6
|
* (Bearer user API key, same credential chain as deploy), runs the pure
|
|
@@ -148,10 +148,12 @@ export async function cmdLogin(options: CursorCliOptions): Promise<number> {
|
|
|
148
148
|
/**
|
|
149
149
|
* Gate for commands that need a Cursor credential before they can do useful
|
|
150
150
|
* work (`serve`, `dev`, interactive `init`). Already-signed-in hosts
|
|
151
|
-
* (`--api-key` / `CURSOR_API_KEY` / stored login) return immediately.
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
151
|
+
* (`--api-key` / `CURSOR_API_KEY` / `CURSOR_API_KEY_FILE` / stored login) return immediately.
|
|
152
|
+
* Hosted `--allow-anonymous` (v1 alias-token engines and v2 freeze bake)
|
|
153
|
+
* skips this gate so health/manifest can bind without a Cursor key.
|
|
154
|
+
* Self-hosted omit the flag: an interactive host runs {@link cmdLogin};
|
|
155
|
+
* a non-interactive one (CI, Docker) fails fast with {@link SIGN_IN_HINT}
|
|
156
|
+
* instead of polling a browser that will never open.
|
|
155
157
|
*/
|
|
156
158
|
export async function ensureCursorLogin(
|
|
157
159
|
options: {
|
|
@@ -161,6 +163,12 @@ export async function ensureCursorLogin(
|
|
|
161
163
|
* TTY.
|
|
162
164
|
*/
|
|
163
165
|
interactive?: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* `serve --allow-anonymous`: listen without a Cursor credential.
|
|
168
|
+
* Model turns still fail later if a key is required; freeze only
|
|
169
|
+
* needs `/v1/health` and `/v1/manifest`.
|
|
170
|
+
*/
|
|
171
|
+
allowAnonymous?: boolean;
|
|
164
172
|
/** Test seam. */
|
|
165
173
|
login?: (options: CursorCliOptions) => Promise<number>;
|
|
166
174
|
} = {}
|
|
@@ -169,6 +177,9 @@ export async function ensureCursorLogin(
|
|
|
169
177
|
if (resolved !== undefined) {
|
|
170
178
|
return 0;
|
|
171
179
|
}
|
|
180
|
+
if (options.allowAnonymous === true) {
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
172
183
|
const interactive = options.interactive ?? process.stderr.isTTY === true;
|
|
173
184
|
if (!interactive) {
|
|
174
185
|
process.stderr.write(`Not signed in to Cursor. ${SIGN_IN_HINT}\n`);
|
|
@@ -243,12 +254,14 @@ function formatIdentity(identity: CursorIdentity): string {
|
|
|
243
254
|
return name === "" ? `${email}${team}` : `${name} <${email}>${team}`;
|
|
244
255
|
}
|
|
245
256
|
|
|
246
|
-
function describeSource(source: "option" | "env" | "login"): string {
|
|
257
|
+
function describeSource(source: "option" | "env" | "file" | "login"): string {
|
|
247
258
|
switch (source) {
|
|
248
259
|
case "option":
|
|
249
260
|
return "explicit --api-key / serve({ apiKey })";
|
|
250
261
|
case "env":
|
|
251
262
|
return "CURSOR_API_KEY environment variable";
|
|
263
|
+
case "file":
|
|
264
|
+
return "CURSOR_API_KEY_FILE (task bind)";
|
|
252
265
|
case "login":
|
|
253
266
|
return `stored login (${credentialsFilePath()})`;
|
|
254
267
|
}
|
|
@@ -28,6 +28,7 @@ import { readDeployTemplate } from "./cursor-agent-template.js";
|
|
|
28
28
|
import {
|
|
29
29
|
type AgentkitDeployAccepted,
|
|
30
30
|
type AgentkitDeployStatus,
|
|
31
|
+
type AgentkitStopAccepted,
|
|
31
32
|
AgentServeDeployClient,
|
|
32
33
|
type DeleteAccepted,
|
|
33
34
|
type DeployAccepted,
|
|
@@ -1187,11 +1188,25 @@ export async function cmdStop(
|
|
|
1187
1188
|
if (typeof ctx === "number") {
|
|
1188
1189
|
return ctx;
|
|
1189
1190
|
}
|
|
1190
|
-
|
|
1191
|
+
// Stop takes only a slug, so there is no manifest to dispatch on (unlike
|
|
1192
|
+
// deploy). The v2 agentkit control plane goes first: v1 endpoints refuse
|
|
1193
|
+
// `architecture: "v2"` slugs with a 409 rather than a 404, so v1-first
|
|
1194
|
+
// could not fall through. A v2 404 (including an older backend without
|
|
1195
|
+
// the agentkit mount) falls back to the v1 stop.
|
|
1196
|
+
let architecture: "v1" | "v2" = "v2";
|
|
1197
|
+
let accepted: StopAccepted | AgentkitStopAccepted;
|
|
1191
1198
|
try {
|
|
1192
|
-
accepted = await ctx.client.
|
|
1199
|
+
accepted = await ctx.client.stopAgentkit({ teamId: ctx.teamId, slug });
|
|
1193
1200
|
} catch (error) {
|
|
1194
|
-
|
|
1201
|
+
if (!(error instanceof DeployApiError) || error.status !== 404) {
|
|
1202
|
+
return renderApiError(error, ctx.err);
|
|
1203
|
+
}
|
|
1204
|
+
try {
|
|
1205
|
+
accepted = await ctx.client.stopDeployment({ teamId: ctx.teamId, slug });
|
|
1206
|
+
architecture = "v1";
|
|
1207
|
+
} catch (v1Error) {
|
|
1208
|
+
return renderApiError(v1Error, ctx.err);
|
|
1209
|
+
}
|
|
1195
1210
|
}
|
|
1196
1211
|
if (ctx.noWait) {
|
|
1197
1212
|
if (ctx.json) {
|
|
@@ -1201,11 +1216,16 @@ export async function cmdStop(
|
|
|
1201
1216
|
}
|
|
1202
1217
|
return 0;
|
|
1203
1218
|
}
|
|
1204
|
-
let detail: DeploymentDetail;
|
|
1219
|
+
let detail: DeploymentDetail | AgentkitDeployStatus;
|
|
1205
1220
|
try {
|
|
1206
|
-
detail =
|
|
1207
|
-
|
|
1208
|
-
|
|
1221
|
+
detail =
|
|
1222
|
+
architecture === "v2"
|
|
1223
|
+
? await pollUntil(ctx, slug, new Set(["stopped"]), () =>
|
|
1224
|
+
ctx.client.getAgentkitDeploy({ teamId: ctx.teamId, slug })
|
|
1225
|
+
)
|
|
1226
|
+
: await pollUntil(ctx, slug, new Set(["stopped"]), () =>
|
|
1227
|
+
ctx.client.getDeployment({ teamId: ctx.teamId, slug })
|
|
1228
|
+
);
|
|
1209
1229
|
} catch (error) {
|
|
1210
1230
|
return renderApiError(error, ctx.err);
|
|
1211
1231
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure Workflow →
|
|
2
|
+
* Pure Workflow → agentsdk project converter.
|
|
3
3
|
*
|
|
4
4
|
* Maps an exported Cursor automation (proto3 workflow JSON + enriched MCP
|
|
5
5
|
* server list) to project files, warnings, and setup steps. No I/O, no
|
|
@@ -185,7 +185,7 @@ function renderInstructions(
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
/**
|
|
188
|
-
* Strip Cursor-backend prompt markup that means nothing in
|
|
188
|
+
* Strip Cursor-backend prompt markup that means nothing in agentsdk:
|
|
189
189
|
* `@[label](action:...)` action tokens become their label text, and
|
|
190
190
|
* unresolvable `%%INLINECODE<n>%%` storage placeholders are flagged (their
|
|
191
191
|
* content is not in the export).
|
|
@@ -972,7 +972,7 @@ function emitSlackChannel(
|
|
|
972
972
|
? "channel-created"
|
|
973
973
|
: "reaction-added";
|
|
974
974
|
out.warnings.push(
|
|
975
|
-
`Slack ${kind} trigger has no
|
|
975
|
+
`Slack ${kind} trigger has no agentsdk equivalent — its config is inlined as a comment in ${path}; handle the Slack event yourself on a dedicated Socket Mode app.`
|
|
976
976
|
);
|
|
977
977
|
}
|
|
978
978
|
let reactionDropped = false;
|
|
@@ -995,7 +995,7 @@ function emitSlackChannel(
|
|
|
995
995
|
}
|
|
996
996
|
if (reactionDropped) {
|
|
997
997
|
out.warnings.push(
|
|
998
|
-
"The Slack trigger marked triggering messages with a completion reaction;
|
|
998
|
+
"The Slack trigger marked triggering messages with a completion reaction; agentsdk has no completion-reaction option, so that signal is lost unless agent/instructions.md tells the agent to add the reaction itself via Slack tools."
|
|
999
999
|
);
|
|
1000
1000
|
}
|
|
1001
1001
|
if (socketMode) {
|
|
@@ -1042,8 +1042,8 @@ function emitSlackChannel(
|
|
|
1042
1042
|
if (blocksUnauthenticated) {
|
|
1043
1043
|
out.warnings.push(
|
|
1044
1044
|
includeBotPosts
|
|
1045
|
-
? "Some Slack watches only fired for authenticated Cursor users while others allowed anyone;
|
|
1046
|
-
: "The Slack trigger only fired for authenticated Cursor users (linked accounts on the owning team);
|
|
1045
|
+
? "Some Slack watches only fired for authenticated Cursor users while others allowed anyone; agentsdk has one bot-post setting per channel, so the export keeps bot posts ENABLED (the open watches depend on them) and the authenticated-only watches lose both their sender gate and their bot exclusion. Split the channels or add an onChannelPost gate."
|
|
1046
|
+
: "The Slack trigger only fired for authenticated Cursor users (linked accounts on the owning team); agentsdk has no equivalent sender gate, so the exported watch dispatches for ANY channel member (bot posts stay excluded). Add an onChannelPost gate in the channel if that matters."
|
|
1047
1047
|
);
|
|
1048
1048
|
}
|
|
1049
1049
|
const engagement: string[] = [];
|
|
@@ -1309,9 +1309,9 @@ const ACTION_STEPS: Partial<Record<keyof ActionJson, string>> = {
|
|
|
1309
1309
|
resolveReviewThreads:
|
|
1310
1310
|
"Verify: resolve_review_threads — no built-in equivalent; resolve threads via the GitHub GraphQL API in a hook or tool.",
|
|
1311
1311
|
microsoftTeams:
|
|
1312
|
-
"Verify: microsoft_teams post —
|
|
1312
|
+
"Verify: microsoft_teams post — agentsdk has no Teams channel; wire the Microsoft Teams API yourself.",
|
|
1313
1313
|
readMicrosoftTeams:
|
|
1314
|
-
"Verify: read_microsoft_teams —
|
|
1314
|
+
"Verify: read_microsoft_teams — agentsdk has no Teams tools; wire the Microsoft Teams API yourself.",
|
|
1315
1315
|
};
|
|
1316
1316
|
|
|
1317
1317
|
interface SlackIntegrationState {
|
|
@@ -1375,7 +1375,7 @@ function behaviorSteps(
|
|
|
1375
1375
|
const disabled = workflow.disabledDefaultTools ?? [];
|
|
1376
1376
|
if (disabled.length > 0) {
|
|
1377
1377
|
steps.push(
|
|
1378
|
-
`Verify: disabled_default_tools (${disabled.join(", ")}) —
|
|
1378
|
+
`Verify: disabled_default_tools (${disabled.join(", ")}) — agentsdk has no default automation tools; enforce the equivalent restriction in agent/instructions.md.`
|
|
1379
1379
|
);
|
|
1380
1380
|
}
|
|
1381
1381
|
return steps;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Types for `convertWorkflow` — the pure automation →
|
|
2
|
+
* Types for `convertWorkflow` — the pure automation → agentsdk project
|
|
3
3
|
* converter behind `agent-serve convert-automation`.
|
|
4
4
|
*
|
|
5
5
|
* The workflow arrives as generic proto3 JSON (lowerCamelCase field names,
|