Skip to content
Open
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 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ bin/gstack-global-discover*
.openclaw/
.hermes/
.gbrain/
.vibe/
.gbrain-source
.context/
extension/.auth.json
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ Or target a specific agent with `./setup --host <name>`:
| 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.
Expand Down
5 changes: 3 additions & 2 deletions hosts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, HostConfig> = Object.fromEntries(
Expand Down Expand Up @@ -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 };
58 changes: 58 additions & 0 deletions hosts/vibe.ts
Original file line number Diff line number Diff line change
@@ -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;
4 changes: 2 additions & 2 deletions test/host-config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down