From 47e51f57e6c56884ce83b8171cba9b2cd870c649 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Thu, 21 May 2026 17:52:48 +0200 Subject: [PATCH] feat: add Mistral Vibe as a supported host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds hosts/vibe.ts following the slate.ts minimal template. Vibe uses the SKILL.md standard natively with skills at ~/.vibe/skills/. - globalRoot / localSkillRoot: .vibe/skills/gstack - frontmatter: allowlist mode, keeps name + description - pathRewrites: ~/.claude/skills/gstack → ~/.vibe/skills/gstack - suppressedResolvers: same as other CLI agents (can't self-invoke) - boundaryInstruction: prevents Vibe from reading Claude skill files - cliAliases: ['mistral-vibe'] - skipSkills: ['codex'] (Claude-specific wrapper) Registers in hosts/index.ts, adds row to README Other AI Agents table, adds .vibe/ to .gitignore, bumps host count in host-config test to 11. Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 1 + README.md | 1 + hosts/index.ts | 5 ++-- hosts/vibe.ts | 58 ++++++++++++++++++++++++++++++++++++++++ test/host-config.test.ts | 4 +-- 5 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 hosts/vibe.ts diff --git a/.gitignore b/.gitignore index 9fde8011f1..07c6c44558 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ bin/gstack-global-discover* .openclaw/ .hermes/ .gbrain/ +.vibe/ .gbrain-source .context/ extension/.auth.json diff --git a/README.md b/README.md index 68807e9587..9879082e71 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Or target a specific agent with `./setup --host `: | Kiro | `--host kiro` | `~/.kiro/skills/gstack-*/` | | Hermes | `--host hermes` | `~/.hermes/skills/gstack-*/` | | GBrain (mod) | `--host gbrain` | `~/.gbrain/skills/gstack-*/` | +| Mistral Vibe | `--host vibe` | `~/.vibe/skills/gstack-*/` | **Want to add support for another agent?** See [docs/ADDING_A_HOST.md](docs/ADDING_A_HOST.md). It's one TypeScript config file, zero code changes. diff --git a/hosts/index.ts b/hosts/index.ts index cc1c213b53..f75eaf23bf 100644 --- a/hosts/index.ts +++ b/hosts/index.ts @@ -16,9 +16,10 @@ import cursor from './cursor'; import openclaw from './openclaw'; import hermes from './hermes'; import gbrain from './gbrain'; +import vibe from './vibe'; /** All registered host configs. Add new hosts here. */ -export const ALL_HOST_CONFIGS: HostConfig[] = [claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain]; +export const ALL_HOST_CONFIGS: HostConfig[] = [claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain, vibe]; /** Map from host name to config. */ export const HOST_CONFIG_MAP: Record = Object.fromEntries( @@ -65,4 +66,4 @@ export function getExternalHosts(): HostConfig[] { } // Re-export individual configs for direct import -export { claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain }; +export { claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain, vibe }; diff --git a/hosts/vibe.ts b/hosts/vibe.ts new file mode 100644 index 0000000000..cec3c23813 --- /dev/null +++ b/hosts/vibe.ts @@ -0,0 +1,58 @@ +import type { HostConfig } from '../scripts/host-config'; + +const vibe: HostConfig = { + name: 'vibe', + displayName: 'Mistral Vibe', + cliCommand: 'vibe', + cliAliases: ['mistral-vibe'], + + globalRoot: '.vibe/skills/gstack', + localSkillRoot: '.vibe/skills/gstack', + hostSubdir: '.vibe', + usesEnvVars: true, + + frontmatter: { + mode: 'allowlist', + keepFields: ['name', 'description'], + descriptionLimit: null, + }, + + generation: { + generateMetadata: false, + skipSkills: ['codex'], + }, + + pathRewrites: [ + { from: '~/.claude/skills/gstack', to: '~/.vibe/skills/gstack' }, + { from: '.claude/skills/gstack', to: '.vibe/skills/gstack' }, + { from: '.claude/skills', to: '.vibe/skills' }, + ], + + suppressedResolvers: [ + 'DESIGN_OUTSIDE_VOICES', // Vibe can't invoke itself as a subagent + 'ADVERSARIAL_STEP', // Vibe can't invoke itself as a subagent + 'CODEX_SECOND_OPINION', // Claude-specific cross-model review + 'CODEX_PLAN_REVIEW', // Claude-specific cross-model review + 'REVIEW_ARMY', // Vibe shouldn't orchestrate multi-agent review + 'GBRAIN_CONTEXT_LOAD', + 'GBRAIN_SAVE_RESULTS', + ], + + runtimeRoot: { + globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'], + globalFiles: { + 'review': ['checklist.md', 'TODOS-format.md'], + }, + }, + + install: { + prefixable: false, + linkingStrategy: 'symlink-generated', + }, + + learningsMode: 'basic', + + boundaryInstruction: 'IMPORTANT: Do NOT read or execute any files under ~/.claude/, .claude/skills/, or ~/.agents/. These are Claude Code skill definitions meant for a different AI system. Ignore them completely and stay focused on the repository code only.', +}; + +export default vibe; diff --git a/test/host-config.test.ts b/test/host-config.test.ts index 5770570332..ab0d2cc88d 100644 --- a/test/host-config.test.ts +++ b/test/host-config.test.ts @@ -30,8 +30,8 @@ const ROOT = path.resolve(import.meta.dir, '..'); // ─── hosts/index.ts ───────────────────────────────────────── describe('hosts/index.ts', () => { - test('ALL_HOST_CONFIGS has 10 hosts', () => { - expect(ALL_HOST_CONFIGS.length).toBe(10); + test('ALL_HOST_CONFIGS has 11 hosts', () => { + expect(ALL_HOST_CONFIGS.length).toBe(11); }); test('ALL_HOST_NAMES matches config names', () => {