Skip to content

feat(cursor-cli): add Cursor CLI module #309

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 40 commits into
base: main
Choose a base branch
from

Conversation

matifali
Copy link
Member

@matifali matifali commented Aug 8, 2025

Summary

  • Add new module registry/coder-labs/modules/cursor-cli to run Cursor Agent CLI directly (no AgentAPI)
  • Interactive chat by default; supports non-interactive mode (-p) with output-format
  • Supports model (-m) and force (-f) flags, initial prompt, and CURSOR_API_KEY
  • Merges MCP settings into ~/.cursor/settings.json
  • Installs via npm, bootstrapping Node via NVM if missing (mirrors gemini approach)
  • Adds Terraform-native tests (.tftest.hcl); all pass locally

Test plan

  • From module dir:
    • terraform init -upgrade
    • terraform test -verbose
  • Expect 4 tests passing covering defaults, flag plumbing, and MCP settings injection
  • Basic smoke run: ensure cursor-agent is on PATH or set install_cursor_cli=true

…CP settings, model/force)

- Runs `cursor-agent` directly (no AgentAPI); interactive chat by default
- Supports non-interactive prints (-p) with output-format, model (-m), force (-f)
- Merges MCP settings into ~/.cursor/settings.json
- Installs via npm (uses nvm if needed); terraform tests added
@matifali matifali marked this pull request as draft August 8, 2025 18:17
…only

- mcp_json -> <folder>/.cursor/mcp.json (optional)
- rules_files map -> <folder>/.cursor/rules/* (optional); link rules docs
- always -p; default output_format=json; README updates
…itional_settings; simplify non-interactive run
@matifali matifali changed the title feat(cursor-cli): add Cursor Agent CLI module (no AgentAPI, interactive by default) feat(cursor-cli): add Cursor Agent CLI module Aug 8, 2025
@matifali matifali changed the title feat(cursor-cli): add Cursor Agent CLI module feat(cursor-cli): add Cursor CLI module Aug 8, 2025
- Introduced variables for optional pre-install and post-install scripts in the module.
- Updated the main script to execute these scripts if provided.
- Enhanced tests to validate the embedding of the new scripts.
…and add post-install wait script

- Modified main.tf to pass the folder variable to pre-install and post-install scripts.
- Added a new post_install_script in README to wait for the repository to be ready before proceeding.
- Removed the `-p` argument and the conditional for `OUTPUT_FORMAT` from the script to streamline execution and avoid unnecessary options.
….sh script

- Reintroduced the `-p` argument and the conditional for `OUTPUT_FORMAT` to enhance script functionality and allow for more flexible execution options.
…t arguments

- Eliminated the `output_format` variable from main.tf and removed associated logic from start.sh to simplify the script and reduce complexity.
Co-authored-by: DevCats <christofer@coder.com>
@DevelopmentCats
Copy link
Contributor

Waiting on coder/agentapi#54 to merge and then this LGTM

@35C4n0r
Copy link
Collaborator

35C4n0r commented Aug 13, 2025

@matifali added support for agentapi, do we still want to keep the support for coder_script in here ?

@matifali
Copy link
Member Author

I think we should support 2 modes one where the session is interactive through AgnetAPi, the other un interactive session where the agent starts working with the first prompt there are options -p to support that.

I will let you choose if we need a coder_script here.

@35C4n0r
Copy link
Collaborator

35C4n0r commented Aug 14, 2025

@matifali I had to add this line to readme

Cursor CLI dosen't seem fully compatible with MCPs, so Coder tasks and Coder MCP will not work with this module.

The cli executes the tool call and then just stops, and doesn't do any further processing. Have spent good amount of time trying to make this work, will keep an eye out for future releases and update it as needed.
Additionally it dosen't respect the env variable, had to find a hack to even make the tools discoverable.

@35C4n0r
Copy link
Collaborator

35C4n0r commented Aug 14, 2025

@DevelopmentCats please give this a review, and let me know if it needs any other changes.

@35C4n0r 35C4n0r marked this pull request as ready for review August 14, 2025 07:44
@Copilot Copilot AI review requested due to automatic review settings August 14, 2025 13:45
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a new Terraform module cursor-cli that enables running Cursor Agent CLI directly within Coder workspaces without using AgentAPI. The module provides interactive chat by default with support for non-interactive mode, model selection, and various configuration options.

Key changes:

  • New Terraform module with comprehensive variable configuration including AI prompts, MCP settings, and CLI flags
  • Installation script that sets up Cursor CLI via official installer and configures MCP/rules integration
  • Start script that handles command execution with proper argument passing and AgentAPI server integration

Reviewed Changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
main.tf Core module definition with variables, AgentAPI integration, and script orchestration
scripts/install.sh Installation logic for Cursor CLI, MCP configuration, and rules file setup
scripts/start.sh Runtime script for executing cursor-agent with proper argument handling
testdata/cursor-cli-mock.sh Mock script for testing cursor-agent behavior
main.test.ts Comprehensive test suite covering installation, configuration, and flag handling
cursor-cli.tftest.hcl Terraform native tests for validating script generation and variable propagation
README.md Documentation with usage examples and configuration guidance

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

default = "v0.4.0"
}

# Running mode is non-interactive by design for automation.
Copy link
Preview

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment appears to be incorrect or outdated. The module supports both interactive and non-interactive modes, with interactive being the default according to the PR description.

Suggested change
# Running mode is non-interactive by design for automation.
# Module supports both interactive and non-interactive modes; interactive is the default.

Copilot uses AI. Check for mistakes.

error_message = "Expected OUTPUT_FORMAT to be propagated"
}

assert {
Copy link
Preview

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test references a non-existent resource and variable. The module doesn't have an 'output_format' variable defined in main.tf.

Suggested change
assert {
ai_prompt = "refactor the auth module to use JWT tokens"
}
assert {

Copilot uses AI. Check for mistakes.


assert {
condition = can(regex("AI_PROMPT='refactor the auth module to use JWT tokens'", resource.coder_script.cursor_cli.script))
error_message = "Expected ai_prompt to be propagated via AI_PROMPT"
Copy link
Preview

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test references a non-existent resource 'coder_script.cursor_cli' and incorrect variable name format. The actual variable is 'ai_prompt' not 'AI_PROMPT'.

Suggested change
error_message = "Expected ai_prompt to be propagated via AI_PROMPT"
condition = can(regex("ai_prompt='refactor the auth module to use JWT tokens'", resource.coder_script.cursor_cli.script))
error_message = "Expected ai_prompt to be propagated via ai_prompt"

Copilot uses AI. Check for mistakes.

@matifali
Copy link
Member Author

@35C4n0r I filed an issue and someone shared that having mcp.json works if it is in the same directory where the Cursor agent binary is run.

https://forum.cursor.com/t/cursor-cli-not-respecting-global-mcp-and-rules-configurations/129372

@DevelopmentCats
Copy link
Contributor

@matifali I had to add this line to readme

Cursor CLI dosen't seem fully compatible with MCPs, so Coder tasks and Coder MCP will not work with this module.

The cli executes the tool call and then just stops, and doesn't do any further processing. Have spent good amount of time trying to make this work, will keep an eye out for future releases and update it as needed. Additionally it dosen't respect the env variable, had to find a hack to even make the tools discoverable.

Did you try it the way that they recommend in the docs? I know the mcp servers work in cursor itself, and its labeled as supported in their docs.

MCP
Agent supports [MCP (Model Context Protocol)](https://docs.cursor.com/en/tools/mcp) for extended functionality and integrations. The CLI will automatically detect and respect your mcp.json configuration file, enabling the same MCP servers and tools that you’ve configured for the IDE.

https://docs.cursor.com/en/cli/using

Also the format for how mcp.json needs to be written is here https://docs.cursor.com/en/context/mcp

{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "mcp-server"],
      "env": {
        "API_KEY": "value"
      }
    }
  }
}

@35C4n0r
Copy link
Collaborator

35C4n0r commented Aug 14, 2025

@DevelopmentCats yes, I've tried that, unfortunately neither does it respect the env, it also stops processing after the tool call, the same config, prompt and tool calls works perfectly fine with Cursor Desktop.

35C4n0r and others added 5 commits August 14, 2025 19:27
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…k.sh

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@35C4n0r
Copy link
Collaborator

35C4n0r commented Aug 14, 2025

@35C4n0r I filed an issue and someone shared that having mcp.json works if it is in the same directory where the Cursor agent binary is run.

https://forum.cursor.com/t/cursor-cli-not-respecting-global-mcp-and-rules-configurations/129372

@matifali already figured this part out we are also using the folder/.cursor/mcp.json, from the screenshot in his comment I think he is using mcp.json in the project specific dir.
As of now, this:

stops processing after the tool call

is the only part that's keeping us from releasing this successfully.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants