Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,474 changes: 1,474 additions & 0 deletions .github/workflows/smoke-mistral.lock.yml

Large diffs are not rendered by default.

96 changes: 96 additions & 0 deletions .github/workflows/smoke-mistral.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
description: Smoke test workflow that validates Mistral Vibe engine functionality by reviewing recent PRs twice daily
on:
schedule: every 12h
workflow_dispatch:
pull_request:
types: [labeled]
names: ["smoke"]
reaction: "rocket"
status-comment: true
permissions:
contents: read
issues: read
pull-requests: read
name: Smoke Mistral
engine: mistral-vibe
strict: true
imports:
- shared/gh.md
- shared/reporting.md
network:
allowed:
- defaults
- github
- playwright
tools:
cache-memory: true
github:
playwright:
allowed_domains:
- github.com
edit:
bash:
- "*"
serena:
languages:
go: {}
runtimes:
go:
version: "1.25"
sandbox:
mcp:
container: "ghcr.io/github/gh-aw-mcpg"
safe-outputs:
add-comment:
hide-older-comments: true
max: 2
create-issue:
expires: 2h
close-older-issues: true
add-labels:
allowed: [smoke-mistral]
remove-labels:
allowed: [smoke]
unassign-from-user:
allowed: [githubactionagent]
max: 1
hide-comment:
messages:
footer: "> 🚀 *Powered by Mistral Vibe via [{workflow_name}]({run_url})*"
run-started: "🚀 Mistral Vibe awakening... [{workflow_name}]({run_url}) processing this {event_type}..."
run-success: "✨ Mission accomplished! [{workflow_name}]({run_url}) completed successfully. 🎯"
run-failure: "⚠️ Houston, we have a problem... [{workflow_name}]({run_url}) {status}. Retrying is recommended..."
timeout-minutes: 15
---

# Smoke Test: Mistral Vibe Engine Validation

**CRITICAL EFFICIENCY REQUIREMENTS:**
- Keep ALL outputs extremely short and concise. Use single-line responses.
- NO verbose explanations or unnecessary context.
- Minimize file reading - only read what is absolutely necessary for the task.
- Use targeted, specific queries - avoid broad searches or large data retrievals.

## Test Requirements

1. **GitHub MCP Testing**: Use GitHub MCP tools to fetch details of exactly 2 merged pull requests from ${{ github.repository }} (title and number only, no descriptions)
2. **Serena MCP Testing**:
- Use the Serena MCP server tool `activate_project` to initialize the workspace at `${{ github.workspace }}` and verify it succeeds (do NOT use bash to run go commands)
- After initialization, use the `find_symbol` tool to search for symbols and verify that at least 3 symbols are found in the results
3. **Playwright Testing**: Use the playwright tools to navigate to https://github.com and verify the page title contains "GitHub" (do NOT try to install playwright - use the provided MCP tools)
4. **File Writing Testing**: Create a test file `/tmp/gh-aw/agent/smoke-test-mistral-${{ github.run_id }}.txt` with content "Smoke test passed for Mistral Vibe at $(date)" (create the directory if it doesn't exist)
5. **Bash Tool Testing**: Execute bash commands to verify file creation was successful (use `cat` to read the file back)
6. **Build gh-aw**: Run `GOCACHE=/tmp/go-cache GOMODCACHE=/tmp/go-mod make build` to verify the agent can successfully build the gh-aw project (both caches must be set to /tmp because the default cache locations are not writable). If the command fails, mark this test as ❌ and report the failure.

## Output

Add a **very brief** comment (max 5-10 lines) to the current pull request with:
- PR titles only (no descriptions)
- ✅ or ❌ for each test result
- Overall status: PASS or FAIL

If all tests pass:
- Use the `add_labels` safe-output tool to add the label `smoke-mistral` to the pull request
- Use the `remove_labels` safe-output tool to remove the label `smoke` from the pull request
- Use the `unassign_from_user` safe-output tool to unassign the user `githubactionagent` from the pull request (this is a fictitious user used for testing)
6 changes: 6 additions & 0 deletions pkg/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,9 @@ const (

// CopilotLLMGatewayPort is the port for the Copilot LLM gateway
CopilotLLMGatewayPort = 10002

// MistralVibeLLMGatewayPort is the port for the Mistral Vibe LLM gateway
MistralVibeLLMGatewayPort = 10004
)

// DefaultMCPRegistryURL is the default MCP registry URL.
Expand Down Expand Up @@ -373,6 +376,9 @@ const (
// DefaultCodexVersion is the default version of the OpenAI Codex CLI
const DefaultCodexVersion Version = "0.104.0"

// DefaultMistralVibeVersion is the default version of the Mistral Vibe CLI
const DefaultMistralVibeVersion Version = "2.1.0"

// DefaultGitHubMCPServerVersion is the default version of the GitHub MCP server Docker image
const DefaultGitHubMCPServerVersion Version = "v0.30.3"

Expand Down
8 changes: 4 additions & 4 deletions pkg/parser/schemas/main_workflow_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -6848,17 +6848,17 @@
"oneOf": [
{
"type": "string",
"enum": ["claude", "codex", "copilot"],
"description": "Simple engine name: 'claude' (default, Claude Code), 'copilot' (GitHub Copilot CLI), or 'codex' (OpenAI Codex CLI)"
"enum": ["claude", "codex", "copilot", "mistral-vibe"],
"description": "Simple engine name: 'claude' (default, Claude Code), 'copilot' (GitHub Copilot CLI), 'codex' (OpenAI Codex CLI), or 'mistral-vibe' (Mistral Vibe CLI, experimental)"
},
{
"type": "object",
"description": "Extended engine configuration object with advanced options for model selection, turn limiting, environment variables, and custom steps",
"properties": {
"id": {
"type": "string",
"enum": ["claude", "codex", "copilot"],
"description": "AI engine identifier: 'claude' (Claude Code), 'codex' (OpenAI Codex CLI), or 'copilot' (GitHub Copilot CLI)"
"enum": ["claude", "codex", "copilot", "mistral-vibe"],
"description": "AI engine identifier: 'claude' (Claude Code), 'codex' (OpenAI Codex CLI), 'copilot' (GitHub Copilot CLI), or 'mistral-vibe' (Mistral Vibe CLI, experimental)"
},
"version": {
"type": ["string", "number"],
Expand Down
1 change: 1 addition & 0 deletions pkg/workflow/agentic_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ func NewEngineRegistry() *EngineRegistry {
registry.Register(NewClaudeEngine())
registry.Register(NewCodexEngine())
registry.Register(NewCopilotEngine())
registry.Register(NewMistralVibeEngine())

agenticEngineLog.Printf("Registered %d engines", len(registry.engines))
return registry
Expand Down
16 changes: 14 additions & 2 deletions pkg/workflow/agentic_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ func TestEngineRegistry(t *testing.T) {

// Test that built-in engines are registered
supportedEngines := registry.GetSupportedEngines()
if len(supportedEngines) != 3 {
t.Errorf("Expected 3 supported engines, got %d", len(supportedEngines))
if len(supportedEngines) != 4 {
t.Errorf("Expected 4 supported engines, got %d", len(supportedEngines))
}

// Test getting engines by ID
Expand All @@ -32,6 +32,14 @@ func TestEngineRegistry(t *testing.T) {
t.Errorf("Expected codex engine ID, got '%s'", codexEngine.GetID())
}

mistralVibeEngine, err := registry.GetEngine("mistral-vibe")
if err != nil {
t.Errorf("Expected to find mistral-vibe engine, got error: %v", err)
}
if mistralVibeEngine.GetID() != "mistral-vibe" {
t.Errorf("Expected mistral-vibe engine ID, got '%s'", mistralVibeEngine.GetID())
}

// Test getting non-existent engine
_, err = registry.GetEngine("nonexistent")
if err == nil {
Expand All @@ -47,6 +55,10 @@ func TestEngineRegistry(t *testing.T) {
t.Error("Expected codex to be valid engine")
}

if !registry.IsValidEngine("mistral-vibe") {
t.Error("Expected mistral-vibe to be valid engine")
}

if registry.IsValidEngine("nonexistent") {
t.Error("Expected nonexistent to be invalid engine")
}
Expand Down
Loading