feat(harnesses): add Grok CLI harness#1051
Conversation
Expose `grok` in @agent-relay/harnesses for PTY spawn workflows, register Grok in the CLI registry, and configure Relaycast MCP via `grok mcp add` so spawned agents can message over Relay. Auto-inject `--always-approve` for unattended broker spawns.
|
CodeAnt AI is reviewing your PR. |
📝 WalkthroughWalkthroughAdds Grok as a PTY harness and registers it across registries and SDKs; broker gains Grok-specific Relaycast MCP injection (constructs ChangesGrok CLI Integration
Sequence Diagram(s)sequenceDiagram
participant Client as Spawned Agent
participant Broker as Agent Relay Broker
participant Snippets as configure_grok_mcp
participant Grok as "grok mcp add"
Client->>Broker: start with grok CLI
Broker->>Snippets: detect is_grok, build mcp add args
Snippets->>Grok: spawn {exe} mcp add --env RELAY_* --command npx --args ...
alt success within 15s
Grok-->>Snippets: exit 0
Snippets-->>Broker: configured
Broker->>Client: MCP injection complete
else timeout or error
Grok-->>Snippets: error/timeout
Snippets-->>Broker: render manual mcp add command
Broker-->>Client: bail with instructions
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request adds support for the Grok CLI as a PTY harness, including broker MCP injection, model definitions, and telemetry tracking. The feedback highlights a critical issue in how arguments are passed to the grok mcp add command, where the --args values should be joined into a single space-separated string rather than appended individually to prevent CLI parsing failures. Additionally, the telemetry detection logic for grok should be simplified to avoid false positives from directory paths containing the string '/grok'.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| args.push("--args".to_string()); | ||
| args.extend(mcp_command.args); |
There was a problem hiding this comment.
The args.extend(mcp_command.args) call appends the arguments as separate elements in the args vector. When spawning the command, this passes them as separate command-line arguments to grok mcp add (e.g., --args -y agent-relay mcp). Standard CLI parsers will only associate the first argument (-y) with the --args option, treating the rest (agent-relay and mcp) as unexpected positional arguments, which will cause the command to fail.\n\nInstead, the arguments should be joined into a single space-separated string and passed as a single argument to --args.
args.push("--args".to_string());\n args.push(mcp_command.args.join(" "));| assert_eq!(args[server_idx + 3], "--args"); | ||
| assert_eq!(args[server_idx + 4], "-y"); |
| if (base === 'opencode' || lower.includes('opencode')) return 'opencode'; | ||
| if (base === 'goose' || lower.includes('goose')) return 'goose'; | ||
| if (base === 'droid' || lower.includes('droid')) return 'droid'; | ||
| if (base === 'grok' || lower.includes('/grok')) return 'grok'; |
There was a problem hiding this comment.
The check lower.includes('/grok') is extremely loose and will result in false positives if any command is executed within a directory path containing /grok (for example, /home/user/grok-project/test.sh).\n\nSince base === 'grok' already correctly matches the grok executable name (even when specified via an absolute path, as path.basename extracts the filename), the lower.includes('/grok') check is redundant and prone to false positives. It should be simplified to just check base === 'grok'.
| if (base === 'grok' || lower.includes('/grok')) return 'grok'; | |
| if (base === 'grok') return 'grok'; |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b5ee02f05f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| CURSOR: Final[str] = "cursor" | ||
| DROID: Final[str] = "droid" | ||
| OPENCODE: Final[str] = "opencode" | ||
| GROK: Final[str] = "grok" |
There was a problem hiding this comment.
Add grok to the Python AgentCli literal
When Python consumers use the newly advertised CLIs.GROK/DefaultModels['grok'] value with the builder or templates, the public AgentCli type in packages/sdk-py/src/agent_relay/types.py still excludes 'grok', so typed workflows get rejected by mypy/Pylance even though the registry now says Grok is supported. Please update the AgentCli literal alongside this registry addition.
Useful? React with 👍 / 👎.
| for server_name in [AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER] { | ||
| let _ = std::process::Command::new(&exe) | ||
| .args(["mcp", "remove", server_name]) | ||
| .stdin(Stdio::null()) | ||
| .stdout(Stdio::null()) | ||
| .stderr(Stdio::null()) | ||
| .spawn() | ||
| .and_then(|mut c| c.wait()); | ||
| } |
There was a problem hiding this comment.
Suggestion: This async path performs blocking process waits with std::process::Command::wait() before every spawn. If grok mcp remove hangs or is slow, it will block the Tokio worker thread and can stall unrelated async work. Run the remove calls with Tokio process APIs (or offload to blocking + timeout) so this path does not block the async runtime. [performance]
Severity Level: Major ⚠️
- ⚠️ Grok worker MCP setup blocks on synchronous subprocess waits.
- ⚠️ Broker async runtime capacity reduced during slow Grok CLI runs.Steps of Reproduction ✅
1. In `crates/broker/src/worker.rs:16-26`, the async method `build_mcp_args` calls
`configure_agent_relay_mcp_with_result` when building MCP arguments for a worker CLI.
2. In `crates/broker/src/snippets.rs:750-761`, `configure_agent_relay_mcp_with_result`
branches on the CLI name; when `cli` is `"grok"`, it sets `is_grok` (line ~768) and calls
`configure_grok_mcp(cli, api_key, base_url, Some(agent_name), agent_token,
workspaces_json, default_workspace).await`.
3. `configure_grok_mcp` in `crates/broker/src/snippets.rs:105-176` (global lines
~1184-1255) executes a loop over `[AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER]`
where, for each server name, it runs:
`std::process::Command::new(&exe).args(["mcp", "remove",
server_name])...spawn().and_then(|mut c| c.wait());`
(lines 1198-1206 of the PR hunk).
4. Because `configure_grok_mcp` is `async` and runs on the Tokio runtime, each `c.wait()`
is a synchronous, blocking wait on the current worker thread. If `grok mcp remove
agent-relay` hangs or takes a long time (e.g., a misconfigured Grok CLI or slow shell
wrapper), the Tokio worker thread running `build_mcp_args` is blocked until the remove
command exits, preventing that thread from processing other async tasks and delaying or
stalling worker startup.Fix in Cursor | Fix in VSCode Claude
(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** crates/broker/src/snippets.rs
**Line:** 1198:1206
**Comment:**
*Performance: This async path performs blocking process waits with `std::process::Command::wait()` before every spawn. If `grok mcp remove` hangs or is slow, it will block the Tokio worker thread and can stall unrelated async work. Run the remove calls with Tokio process APIs (or offload to blocking + timeout) so this path does not block the async runtime.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix| Err(_) => { | ||
| let _ = child.kill().await; | ||
| anyhow::bail!( | ||
| "failed to configure Agent Relay MCP for {cli}: `{cli} mcp add` timed out after 15s. \ | ||
| Please configure the Agent Relay MCP server manually:\n {manual_cmd}" | ||
| ); |
There was a problem hiding this comment.
Suggestion: On timeout, the child is killed but never reaped with a follow-up wait, which can leave a zombie process entry behind. After kill(), explicitly wait() (or try_wait loop) before returning the error to ensure process cleanup is complete. [missing cleanup]
Severity Level: Major ⚠️
- ⚠️ Timeout during Grok MCP setup can leave zombie processes.
- ⚠️ Repeated Grok timeouts may slowly leak OS process entries.Steps of Reproduction ✅
1. As in suggestion 1, starting from `crates/broker/src/worker.rs:16-26`, calling
`build_mcp_args` with a Grok CLI (`cli_name = \"grok\"`) leads to
`configure_agent_relay_mcp_with_result` in `crates/broker/src/snippets.rs:750-761`, which
dispatches to `configure_grok_mcp` for Grok.
2. In `configure_grok_mcp` (`crates/broker/src/snippets.rs:143-176`), the code creates a
`tokio::process::Command` (`mcp_cmd`) and runs `mcp_cmd.spawn()`, then wraps
`child.wait()` in `tokio::time::timeout(Duration::from_secs(15), child.wait()).await`
(lines ~143-145).
3. When the spawned `grok mcp add` process does not complete `wait()` within 15 seconds
(for example, by pointing `cli` to a script that sleeps indefinitely), the timeout branch
`Err(_) => { ... }` at lines 158-163 is taken:
`Err(_) => { let _ = child.kill().await; anyhow::bail!(\"failed to configure ... timed
out after 15s ...\"); }`.
4. In this timeout path, the code kills the child process but never calls
`wait()`/`try_wait()` afterward to reap it. On platforms where `kill()` only sends a
signal and does not reap the process, this can leave a zombie Grok CLI process owned by
the broker until the parent exits, leaking process table entries whenever
`configure_grok_mcp` times out.Fix in Cursor | Fix in VSCode Claude
(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** crates/broker/src/snippets.rs
**Line:** 1237:1242
**Comment:**
*Missing Cleanup: On timeout, the child is killed but never reaped with a follow-up wait, which can leave a zombie process entry behind. After `kill()`, explicitly `wait()` (or `try_wait` loop) before returning the error to ensure process cleanup is complete.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fixThere was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@CHANGELOG.md`:
- Line 12: Update the Unreleased changelog bullet to be impact-focused and
remove command-level implementation details: replace the line referencing "`grok
mcp add`" and "broker MCP injection" with a concise user-visible statement such
as "Added Grok CLI harness support in `@agent-relay/harnesses`, including
Relaycast MCP support for spawned agents" (or similar) so the entry mentions
`@agent-relay/harnesses`, the Grok CLI/grok PTY harness, and Relaycast MCP
support without exposing internal commands.
In `@crates/broker/src/snippets.rs`:
- Around line 1173-1181: The manual fallback in grok_manual_mcp_add_cmd is
missing the "--args" flag and therefore doesn't match how grok_mcp_add_args
builds the real MCP add (which uses "--command npx --args -y agent-relay mcp");
update grok_manual_mcp_add_cmd to insert the "--args" token before the command
arguments produced by agent_relay_mcp_command so the formatted string includes
"--command {command} --args {args}" and still appends AGENT_RELAY_MCP_SERVER and
the env placeholders.
In `@packages/cli/src/cli/telemetry/orchestrator-harness.ts`:
- Line 50: The Grok detector branch incorrectly checks lower.includes('/grok')
instead of using the path-normalized variable; update the condition in the Grok
detection (the if that checks base, lower and returns 'grok') to use
normalized.includes('/grok') so separator handling matches the other detectors
(refer to the variables base, lower, normalized and the Grok detection return
'grok').
In `@packages/cloud/src/permissions.ts`:
- Line 17: Add "grok" to the Python AgentCli literal so the SDK matches the
cloud permission set: update the AgentCli type (the Literal[...] declaration
named AgentCli in agent_relay/types.py) to include "grok" in its union; ensure
the file still imports Literal (or typing_extensions.Literal if needed) and run
type checks to confirm no other enums need alignment.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: fe8bd265-15dd-43d2-b5a2-59be0b7f1b10
📒 Files selected for processing (12)
CHANGELOG.mdcrates/broker/src/snippets.rscrates/broker/src/worker.rspackages/cli/src/cli/telemetry/orchestrator-harness.test.tspackages/cli/src/cli/telemetry/orchestrator-harness.tspackages/cloud/src/permissions.tspackages/config/src/cli-registry.generated.tspackages/harnesses/README.mdpackages/harnesses/src/define.test.tspackages/harnesses/src/index.tspackages/sdk-py/src/agent_relay/models.pypackages/utils/cli-registry.yaml
|
CodeAnt AI finished reviewing your PR. |
Repeat `--args` per MCP command token so Grok CLI parses `-y` correctly, fix manual fallback formatting, reap timed-out MCP setup children, tighten telemetry detection to the grok binary name, add grok to Python AgentCli, and simplify the changelog bullet.
There was a problem hiding this comment.
2 issues found across 13 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
Run `grok mcp remove` via tokio::process with a timeout instead of blocking wait() on the runtime thread, and discard child stderr so a full pipe cannot stall MCP configuration.
|
CodeAnt AI is running Incremental review |
|
CodeAnt AI Incremental review completed. |
There was a problem hiding this comment.
1 issue found across 1 file (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="crates/broker/src/snippets.rs">
<violation number="1" location="crates/broker/src/snippets.rs:1197">
P2: Timed-out `grok mcp remove` subprocesses are not terminated, which can leave background processes and race with subsequent MCP setup.</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
| .stdout(Stdio::null()) | ||
| .stderr(Stdio::null()); | ||
| if let Ok(mut child) = cmd.spawn() { | ||
| let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await; |
There was a problem hiding this comment.
P2: Timed-out grok mcp remove subprocesses are not terminated, which can leave background processes and race with subsequent MCP setup.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At crates/broker/src/snippets.rs, line 1197:
<comment>Timed-out `grok mcp remove` subprocesses are not terminated, which can leave background processes and race with subsequent MCP setup.</comment>
<file context>
@@ -1186,6 +1186,19 @@ fn grok_manual_mcp_add_cmd(cli: &str) -> String {
+ .stdout(Stdio::null())
+ .stderr(Stdio::null());
+ if let Ok(mut child) = cmd.spawn() {
+ let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await;
+ }
+ }
</file context>
| let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await; | |
| if tokio::time::timeout(Duration::from_secs(5), child.wait()) | |
| .await | |
| .is_err() | |
| { | |
| let _ = child.kill().await; | |
| let _ = child.wait().await; | |
| } |
Merge main pear changes with Prettier formatting so format:check passes, and refactor inferHarnessFromCommand to a matcher table (includes grok) to stay under ESLint complexity limits.
|
CodeAnt AI is running Incremental review |
|
CodeAnt AI Incremental review completed. |
|
Preview deployed!
This preview will be cleaned up when the PR is merged or closed. |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
packages/cli/src/cli/telemetry/orchestrator-harness.ts (1)
69-69: 💤 Low valueConsider adding path-based detection for consistency.
The Grok matcher only checks
base === 'grok', while similar CLI matchers (Codex at line 52, Amp at line 70) include path-based checks likenormalized.includes('/codex'). This inconsistency means paths like/opt/grok/bin/grok-cliwon't be detected as Grok, but equivalent Codex paths would match.If the Grok executable is always named exactly
grok, the current check is sufficient. Otherwise, consider adding a path check for consistency:🔄 Suggested matcher pattern
- { harness: 'grok', matches: ({ base }) => base === 'grok' }, + { harness: 'grok', matches: ({ base, normalized }) => base === 'grok' || normalized.includes('/grok') },🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/cli/src/cli/telemetry/orchestrator-harness.ts` at line 69, The Grok matcher currently only checks base === 'grok' in the object with harness: 'grok' (the matches function), which misses path-based installs; update the matches implementation to also inspect a normalized path string (same approach used by the Codex/Amp matchers) and include a condition like normalized.includes('/grok') or other expected path fragments so executables such as /opt/grok/bin/grok-cli are detected consistently with the other matchers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/broker/src/snippets.rs`:
- Around line 1189-1200: The remove_grok_mcp_servers function currently discards
the timeout result and can leave hung children running; modify it so that after
spawning (in remove_grok_mcp_servers) you capture the tokio::time::timeout
result, and if it indicates a timeout, call child.kill().await (and then await
child.wait().await) to ensure the child is terminated—mirror the logic used in
configure_grok_mcp to explicitly kill timed-out children and then wait for their
exit.
---
Nitpick comments:
In `@packages/cli/src/cli/telemetry/orchestrator-harness.ts`:
- Line 69: The Grok matcher currently only checks base === 'grok' in the object
with harness: 'grok' (the matches function), which misses path-based installs;
update the matches implementation to also inspect a normalized path string (same
approach used by the Codex/Amp matchers) and include a condition like
normalized.includes('/grok') or other expected path fragments so executables
such as /opt/grok/bin/grok-cli are detected consistently with the other
matchers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 3d238717-8b9c-481d-8c7d-117aa55ae329
📒 Files selected for processing (3)
crates/broker/src/snippets.rspackages/cli/src/cli/telemetry/orchestrator-harness.tsweb/app/pear/page.tsx
✅ Files skipped from review due to trivial changes (1)
- web/app/pear/page.tsx
| async fn remove_grok_mcp_servers(exe: &str) { | ||
| for server_name in [AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER] { | ||
| let mut cmd = Command::new(exe); | ||
| cmd.args(["mcp", "remove", server_name]) | ||
| .stdin(Stdio::null()) | ||
| .stdout(Stdio::null()) | ||
| .stderr(Stdio::null()); | ||
| if let Ok(mut child) = cmd.spawn() { | ||
| let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await; | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Timed-out child processes are not killed.
When the 5-second timeout expires at line 1197, the result is discarded but the child process is not killed. This differs from configure_grok_mcp (lines 1249-1250), which explicitly kills timed-out children. If grok mcp remove hangs, orphaned processes will accumulate.
🔧 Suggested fix to kill timed-out children
async fn remove_grok_mcp_servers(exe: &str) {
for server_name in [AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER] {
let mut cmd = Command::new(exe);
cmd.args(["mcp", "remove", server_name])
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null());
if let Ok(mut child) = cmd.spawn() {
- let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await;
+ match tokio::time::timeout(Duration::from_secs(5), child.wait()).await {
+ Err(_) => {
+ let _ = child.kill().await;
+ let _ = child.wait().await;
+ }
+ _ => {}
+ }
}
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| async fn remove_grok_mcp_servers(exe: &str) { | |
| for server_name in [AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER] { | |
| let mut cmd = Command::new(exe); | |
| cmd.args(["mcp", "remove", server_name]) | |
| .stdin(Stdio::null()) | |
| .stdout(Stdio::null()) | |
| .stderr(Stdio::null()); | |
| if let Ok(mut child) = cmd.spawn() { | |
| let _ = tokio::time::timeout(Duration::from_secs(5), child.wait()).await; | |
| } | |
| } | |
| } | |
| async fn remove_grok_mcp_servers(exe: &str) { | |
| for server_name in [AGENT_RELAY_MCP_SERVER, LEGACY_RELAYCAST_SERVER] { | |
| let mut cmd = Command::new(exe); | |
| cmd.args(["mcp", "remove", server_name]) | |
| .stdin(Stdio::null()) | |
| .stdout(Stdio::null()) | |
| .stderr(Stdio::null()); | |
| if let Ok(mut child) = cmd.spawn() { | |
| match tokio::time::timeout(Duration::from_secs(5), child.wait()).await { | |
| Err(_) => { | |
| let _ = child.kill().await; | |
| let _ = child.wait().await; | |
| } | |
| _ => {} | |
| } | |
| } | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/broker/src/snippets.rs` around lines 1189 - 1200, The
remove_grok_mcp_servers function currently discards the timeout result and can
leave hung children running; modify it so that after spawning (in
remove_grok_mcp_servers) you capture the tokio::time::timeout result, and if it
indicates a timeout, call child.kill().await (and then await child.wait().await)
to ensure the child is terminated—mirror the logic used in configure_grok_mcp to
explicitly kill timed-out children and then wait for their exit.
User description
Summary
Adds first-class support for the Grok CLI in Agent Relay:
@agent-relay/harnesses: newgrokPTY harness (grok.create({ relay })/grok.new())grok mcp add agent-relaywith Relaycast env vars andnpx agent-relay mcpcommand/args--always-approvewhen the broker spawns Grok workers (same pattern as Codex/Gemini bypass flags)grokwithgrok-build(default) andgrok-composer-2.5-fastmodelsAgentCliincludes'grok'; orchestrator telemetry recognizesgrokprocessesUsage
Testing
cargo test -p agent-relay-broker grok_mcpnpx vitest run packages/harnesses/src packages/cli/src/cli/telemetry/orchestrator-harness.test.tsCodeAnt-AI Description
Add Grok CLI support with automatic Relay setup
What Changed
--always-approveImpact
✅ Grok agents connect to Relay without manual setup✅ Grok sessions start with the expected default model✅ Fewer missed Grok runs in telemetry and support flows💡 Usage Guide
Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.