mirror of
https://github.com/msitarzewski/agency-agents.git
synced 2026-07-06 08:18:57 +03:00
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:
committed by
GitHub
parent
ac0fb2e563
commit
90ae2b27d1
@@ -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/
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"]}}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user