Add Mistral Vibe support for Agency agents (#658)

* Add Mistral Vibe support for Agency agents

- Add Mistral Vibe entry to tools.json with proper configuration
  (id, label, kebab, format, installKind, dest, detection, version)
- Implement convert_vibe() function in convert.sh for Mistral Vibe's format
  - Generates TOML agent configuration files (~/.vibe/agents/<slug>.toml)
  - Generates markdown prompt files (~/.vibe/prompts/<slug>.md)
  - Each agent gets agent_type and system_prompt_id (no hardcoded active_model)
- Add install_vibe() function in install.sh with full feature support
  - Copies both agent TOML and prompt MD files
  - Supports division/agent filtering and environment variable overrides
  - Uses VIBE_HOME environment variable for custom install paths
- Add Mistral Vibe detection and tool labeling
- Add Mistral Vibe to all necessary case statements and arrays
- Update README.md to document Mistral Vibe support
- All changes validated with scripts/check-tools.sh

Mistral Vibe uses a two-file approach per agent:
- ~/.vibe/agents/<slug>.toml for agent configuration
- ~/.vibe/prompts/<slug>.md for system prompts

Users can specify active_model in their agent TOML files or rely on their
Vibe configuration default model.

Usage: ./scripts/install.sh --tool vibe [--division X] [--agent Y]

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

* Address PR #658 review feedback: add .gitignore, README, and fix icon

- Add integrations/vibe/README.md documenting the Mistral Vibe integration
- Update .gitignore to ignore integrations/vibe/agents/ and prompts/
- Update convert.sh usage() to include vibe in the tool list
- Fix tools.json: change vibe icon from 'mistral' to null (no mistral.svg)
- Bonus: update vibe accent color from #FF69B4 to #FA520F (Mistral brand orange)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

---------

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
Laurent Wandrebeck
2026-07-05 11:21:50 +02:00
committed by GitHub
parent ac0fb2e563
commit 90ae2b27d1
6 changed files with 203 additions and 8 deletions
+2
View File
@@ -82,4 +82,6 @@ integrations/kimi/*/
integrations/codex/agents/*
integrations/osaurus/agency-*/
integrations/hermes/agency-agents-router/
integrations/vibe/agents/
integrations/vibe/prompts/
graphify-out/
+2 -1
View File
@@ -66,7 +66,7 @@ Each agent file contains:
Browse the agents below and copy/adapt the ones you need!
### Option 4: Use with Other Tools (GitHub Copilot, Antigravity, Gemini CLI, OpenCode, OpenClaw, Cursor, Aider, Windsurf, Kimi Code, Codex, Osaurus, Hermes)
### Option 4: Use with Other Tools (GitHub Copilot, Antigravity, Gemini CLI, OpenCode, OpenClaw, Cursor, Aider, Windsurf, Kimi Code, Codex, Osaurus, Hermes, Mistral Vibe)
```bash
# Step 1 -- generate integration files for all supported tools
@@ -88,6 +88,7 @@ Browse the agents below and copy/adapt the ones you need!
./scripts/install.sh --tool codex
./scripts/install.sh --tool osaurus
./scripts/install.sh --tool hermes
./scripts/install.sh --tool vibe
```
**Install only the teams you need** (not everyone wants all 16 divisions):
+116
View File
@@ -0,0 +1,116 @@
# Mistral Vibe Integration
Mistral Vibe uses two files per agent:
- A TOML configuration file (`~/.vibe/agents/<slug>.toml`)
- A Markdown prompt file (`~/.vibe/prompts/<slug>.md`)
The generated files come from `scripts/convert.sh --tool vibe`, which writes
one TOML agent configuration and one Markdown prompt file per agency agent
into `integrations/vibe/agents/` and `integrations/vibe/prompts/` respectively.
## Generate
From the repository root:
```bash
./scripts/convert.sh --tool vibe
```
## Install
Run the installer from your target directory:
```bash
cd /your/project && /path/to/agency-agents/scripts/install.sh --tool vibe
```
This copies the generated files into:
```text
~/.vibe/agents/<slug>.toml
~/.vibe/prompts/<slug>.md
```
You can override the destination using the `VIBE_HOME` environment variable:
```bash
VIBE_HOME=~/.config/vibe ./scripts/install.sh --tool vibe
```
## Generated Format
Each generated agent pair lives in:
```text
integrations/vibe/agents/<slug>.toml
integrations/vibe/prompts/<slug>.md
```
### Agent TOML File
The minimal Vibe agent configuration:
```toml
agent_type = "agent"
system_prompt_id = "<slug>"
```
Users can specify `active_model` in their agent TOML files or rely on their
Vibe configuration default model.
### Prompt Markdown File
The prompt file contains:
- A title header with the agent name
- The agent description
- The full Markdown body from the source agent
## Usage
After installation, reference agents in Mistral Vibe by their system prompt ID
(which matches the filename slug).
Example:
```text
Use the Code Reviewer agent to analyze this pull request.
```
## Filtering
Install only specific divisions or agents:
```bash
# Install only agents from Division 1
./scripts/install.sh --tool vibe --division 1
# Install only the code-reviewer agent
./scripts/install.sh --tool vibe --agent code-reviewer
```
## Regenerate
After modifying source agents:
```bash
./scripts/convert.sh --tool vibe
./scripts/install.sh --tool vibe
```
## Troubleshooting
### Mistral Vibe not detected
Make sure `vibe` is in your PATH, or that `~/.vibe/` already exists:
```bash
which vibe
vibe --version
```
### Integration files not generated
Generate the Vibe artifacts before installing:
```bash
./scripts/convert.sh --tool vibe
```
+39 -3
View File
@@ -22,6 +22,7 @@
# codex — Codex custom agent TOML files (~/.codex/agents/*.toml)
# osaurus — Osaurus skill files (~/.osaurus/skills/<name>/SKILL.md)
# hermes — Hermes lazy-router plugin (one plugin + on-disk agent index)
# vibe — Mistral Vibe agent TOML + prompt files (~/.vibe/agents/*.toml + ~/.vibe/prompts/*.md)
# all — All tools (default)
#
# Output is written to integrations/<tool>/ relative to the repo root.
@@ -457,6 +458,40 @@ ${body}
HEREDOC
}
convert_vibe() {
local file="$1"
local name description slug outdir agent_file prompt_file body
name="$(get_field "name" "$file")"
description="$(get_field "description" "$file")"
slug="$(slugify "$name")"
body="$(get_body "$file")"
# Mistral Vibe uses two files per agent:
# 1. A TOML configuration file in ~/.vibe/agents/<slug>.toml
# 2. A markdown prompt file in ~/.vibe/prompts/<slug>.md
outdir="$OUT_DIR/vibe"
agent_file="$outdir/agents/${slug}.toml"
prompt_file="$outdir/prompts/${slug}.md"
mkdir -p "$outdir/agents" "$outdir/prompts"
# Write the TOML agent configuration
cat > "$agent_file" <<HEREDOC
agent_type = "agent"
system_prompt_id = "${slug}"
HEREDOC
# Write the markdown prompt file
cat > "$prompt_file" <<HEREDOC
# ${name}
${description}
${body}
HEREDOC
}
# Aider and Windsurf are single-file formats — accumulate into temp files
# then write at the end.
AIDER_TMP="$(mktemp)"
@@ -575,6 +610,7 @@ run_conversions() {
qwen) convert_qwen "$file" ;;
kimi) convert_kimi "$file" ;;
osaurus) convert_osaurus "$file" ;;
vibe) convert_vibe "$file" ;;
aider) accumulate_aider "$file" ;;
windsurf) accumulate_windsurf "$file" ;;
esac
@@ -605,7 +641,7 @@ main() {
esac
done
local valid_tools=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "kimi" "codex" "osaurus" "hermes" "all")
local valid_tools=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "kimi" "codex" "osaurus" "hermes" "vibe" "all")
local valid=false
for t in "${valid_tools[@]}"; do [[ "$t" == "$tool" ]] && valid=true && break; done
if ! $valid; then
@@ -624,7 +660,7 @@ main() {
local tools_to_run=()
if [[ "$tool" == "all" ]]; then
tools_to_run=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "kimi" "codex" "osaurus" "hermes")
tools_to_run=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "kimi" "codex" "osaurus" "hermes" "vibe")
else
tools_to_run=("$tool")
fi
@@ -635,7 +671,7 @@ main() {
if $use_parallel && [[ "$tool" == "all" ]]; then
# Tools that write to separate dirs can run in parallel; buffer output so each tool's output stays together
local parallel_tools=(antigravity gemini-cli opencode cursor openclaw qwen codex osaurus hermes)
local parallel_tools=(antigravity gemini-cli opencode cursor openclaw qwen codex osaurus hermes vibe)
local parallel_out_dir
parallel_out_dir="$(mktemp -d)"
info "Converting: ${#parallel_tools[@]}/${n_tools} tools in parallel (output buffered per tool)..."
+42 -3
View File
@@ -25,6 +25,7 @@
# codex -- Copy custom agent TOML files to ~/.codex/agents/
# osaurus -- Copy skills to ~/.osaurus/skills/
# hermes -- Copy lazy-router plugin to ~/.hermes/plugins/ and enable it
# vibe -- Copy agents and prompts to ~/.vibe/agents/ and ~/.vibe/prompts/
# all -- Install for all detected tools (default)
#
# Selection (compose freely; empty = everything):
@@ -49,7 +50,7 @@
#
# Env: CLAUDE_CONFIG_DIR, COPILOT_AGENT_DIR, CURSOR_RULES_DIR, GEMINI_AGENTS_DIR,
# OPENCODE_AGENTS_DIR, OPENCLAW_DIR, QWEN_AGENTS_DIR, CODEX_AGENTS_DIR,
# OSAURUS_SKILLS_DIR, HERMES_HOME, HERMES_PLUGIN_DIR
# OSAURUS_SKILLS_DIR, HERMES_HOME, HERMES_PLUGIN_DIR, VIBE_HOME
# override default install paths (checked before hardcoded defaults).
#
# --- USAGE-END --- (sentinel for usage(); do not remove)
@@ -128,7 +129,7 @@ INTEGRATIONS="$REPO_ROOT/integrations"
# shellcheck source=lib.sh
. "$SCRIPT_DIR/lib.sh"
ALL_TOOLS=(claude-code copilot antigravity gemini-cli opencode openclaw cursor aider windsurf qwen kimi codex osaurus hermes)
ALL_TOOLS=(claude-code copilot antigravity gemini-cli opencode openclaw cursor aider windsurf qwen kimi codex osaurus hermes vibe)
# Directories scanned for installable agents. Intentionally includes strategy/
# (its frontmatter-less NEXUS docs are filtered out by is_agent_file at scan time);
@@ -264,6 +265,7 @@ resolve_dest() {
codex) var="CODEX_AGENTS_DIR" ;;
osaurus) var="OSAURUS_SKILLS_DIR" ;;
hermes) var="HERMES_PLUGIN_DIR" ;;
vibe) var="VIBE_HOME" ;;
esac
if [[ -n "$var" && -n "${!var:-}" ]]; then printf '%s' "${!var}"; else printf '%s' "$def"; fi
}
@@ -276,7 +278,7 @@ resolve_tool_path() {
opencode) bin="opencode" ;; openclaw) bin="openclaw" ;; cursor) bin="cursor" ;;
aider) bin="aider" ;; windsurf) bin="windsurf" ;; qwen) bin="qwen" ;;
kimi) bin="kimi" ;; codex) bin="codex" ;; antigravity) bin="" ;;
osaurus) bin="osaurus" ;; hermes) bin="hermes" ;;
osaurus) bin="osaurus" ;; hermes) bin="hermes" ;; vibe) bin="vibe" ;;
esac
[[ -n "$bin" ]] && command -v "$bin" 2>/dev/null
}
@@ -375,6 +377,7 @@ detect_kimi() { command -v kimi >/dev/null 2>&1; }
detect_codex() { command -v codex >/dev/null 2>&1 || [[ -d "${HOME}/.codex" ]]; }
detect_osaurus() { command -v osaurus >/dev/null 2>&1 || [[ -d "${HOME}/.osaurus" ]]; }
detect_hermes() { command -v hermes >/dev/null 2>&1 || [[ -d "${HERMES_HOME:-${HOME}/.hermes}" ]]; }
detect_vibe() { command -v vibe >/dev/null 2>&1 || [[ -d "${VIBE_HOME:-${HOME}/.vibe}" ]]; }
is_detected() {
case "$1" in
@@ -392,6 +395,7 @@ is_detected() {
codex) detect_codex ;;
osaurus) detect_osaurus ;;
hermes) detect_hermes ;;
vibe) detect_vibe ;;
*) return 1 ;;
esac
}
@@ -413,6 +417,7 @@ tool_label() {
codex) printf "%-14s %s" "Codex" "(~/.codex/agents)" ;;
osaurus) printf "%-14s %s" "Osaurus" "(~/.osaurus/skills)" ;;
hermes) printf "%-14s %s" "Hermes" "(~/.hermes/plugins)" ;;
vibe) printf "%-14s %s" "Mistral Vibe" "(~/.vibe/agents)" ;;
esac
}
@@ -930,6 +935,39 @@ install_codex() {
ok "Codex: $count agents -> $dest"
}
install_vibe() {
local src_agents="$INTEGRATIONS/vibe/agents"
local src_prompts="$INTEGRATIONS/vibe/prompts"
local dest; dest="$(resolve_dest vibe "${HOME}/.vibe")"
local count=0
[[ -d "$src_agents" && -d "$src_prompts" ]] || { err "integrations/vibe missing. Run convert.sh first."; return 1; }
mkdir -p "$dest/agents" "$dest/prompts"
local agent_file prompt_file slug
while IFS= read -r -d '' agent_file; do
slug="$(basename "$agent_file" .toml)"
slug_allowed "$slug" || continue
# Find the corresponding prompt file
prompt_file="$src_prompts/$slug.md"
[[ -f "$prompt_file" ]] || continue
install_file "$agent_file" "$dest/agents/"
install_file "$prompt_file" "$dest/prompts/"
incr count
done < <(find "$src_agents" -maxdepth 1 -name "*.toml" -print0)
ok "Mistral Vibe: $count agents -> $dest/agents/ and $dest/prompts/"
}
vibe_home_dir() {
printf '%s\n' "${VIBE_HOME:-${HOME}/.vibe}"
}
hermes_home_dir() {
printf '%s\n' "${HERMES_HOME:-${HOME}/.hermes}"
}
@@ -1074,6 +1112,7 @@ install_tool() {
codex) install_codex ;;
osaurus) install_osaurus ;;
hermes) install_hermes ;;
vibe) install_vibe ;;
esac
}
+2 -1
View File
@@ -14,6 +14,7 @@
"kimi": {"id":"kimi","label":"Kimi","short":"Kimi","kebab":"kimi","accent":"#0F0F12","icon":"kimi","order":11,"scope":{"user":true,"project":false},"detect":{"dirs":[],"agentsDir":".config/kimi/agents"},"version":{"bin":"kimi","args":["--version"]},"format":"kimi-agent","installKind":"per-agent","slugFrom":"name","dest":{"user":[".config/kimi/agents/{slug}/agent.yaml",".config/kimi/agents/{slug}/system.md"],"project":[]}},
"openclaw": {"id":"openclaw","label":"OpenClaw","short":"openclaw","kebab":"openclaw","accent":"#E11D48","icon":null,"order":12,"scope":{"user":true,"project":false},"detect":{"dirs":[".openclaw"],"agentsDir":".openclaw/agency-agents"},"version":{"bin":"openclaw","args":["--version"]},"format":"openclaw-workspace","installKind":"per-agent","slugFrom":"name","dest":{"user":[".openclaw/agency-agents/{slug}/SOUL.md",".openclaw/agency-agents/{slug}/AGENTS.md",".openclaw/agency-agents/{slug}/IDENTITY.md"],"project":[]}},
"windsurf": {"id":"windsurf","label":"Windsurf","short":"Windsurf","kebab":"windsurf","accent":"#09B6A2","icon":"windsurf","order":13,"scope":{"user":false,"project":true},"detect":{"dirs":[".codeium"],"agentsDir":null},"version":{"bin":"windsurf","args":["--version"]},"format":"windsurf-rules","installKind":"roster","slugFrom":null,"dest":{"user":[],"project":[".windsurfrules"]}},
"hermes": {"id":"hermes","label":"Hermes","short":"Hermes","kebab":"hermes","accent":"#7C3AED","icon":null,"order":14,"scope":{"user":true,"project":false},"detect":{"dirs":[".hermes"],"agentsDir":".hermes/plugins"},"version":{"bin":"hermes","args":["--version"]},"format":"hermes-router-plugin","installKind":"plugin","slugFrom":null,"dest":{"user":[".hermes/plugins/agency-agents-router"],"project":[]}}
"hermes": {"id":"hermes","label":"Hermes","short":"Hermes","kebab":"hermes","accent":"#7C3AED","icon":null,"order":14,"scope":{"user":true,"project":false},"detect":{"dirs":[".hermes"],"agentsDir":".hermes/plugins"},"version":{"bin":"hermes","args":["--version"]},"format":"hermes-router-plugin","installKind":"plugin","slugFrom":null,"dest":{"user":[".hermes/plugins/agency-agents-router"],"project":[]}},
"vibe": {"id":"vibe","label":"Mistral Vibe","short":"Vibe","kebab":"vibe","accent":"#FA520F","icon":null,"order":15,"scope":{"user":true,"project":true},"detect":{"dirs":[".vibe"],"agentsDir":".vibe/agents"},"version":{"bin":"vibe","args":["--version"]},"format":"vibe-toml","installKind":"per-agent","slugFrom":"name","dest":{"user":[".vibe/agents/{slug}.toml",".vibe/prompts/{slug}.md"],"project":[".vibe/agents/{slug}.toml",".vibe/prompts/{slug}.md"]}}
}
}