diff --git a/.gitignore b/.gitignore index a5bd4a72..602fb349 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/README.md b/README.md index f7123f56..1d52ac12 100644 --- a/README.md +++ b/README.md @@ -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): diff --git a/integrations/vibe/README.md b/integrations/vibe/README.md new file mode 100644 index 00000000..3075bd00 --- /dev/null +++ b/integrations/vibe/README.md @@ -0,0 +1,116 @@ +# Mistral Vibe Integration + +Mistral Vibe uses two files per agent: +- A TOML configuration file (`~/.vibe/agents/.toml`) +- A Markdown prompt file (`~/.vibe/prompts/.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/.toml +~/.vibe/prompts/.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/.toml +integrations/vibe/prompts/.md +``` + +### Agent TOML File + +The minimal Vibe agent configuration: + +```toml +agent_type = "agent" +system_prompt_id = "" +``` + +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 +``` diff --git a/scripts/convert.sh b/scripts/convert.sh index 33e0410f..719e75a2 100755 --- a/scripts/convert.sh +++ b/scripts/convert.sh @@ -22,6 +22,7 @@ # codex — Codex custom agent TOML files (~/.codex/agents/*.toml) # osaurus — Osaurus skill files (~/.osaurus/skills//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// 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/.toml + # 2. A markdown prompt file in ~/.vibe/prompts/.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" < "$prompt_file" </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 } diff --git a/tools.json b/tools.json index f5b2dff1..998919f8 100644 --- a/tools.json +++ b/tools.json @@ -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"]}} } }