Files
pbakaus_impeccable/docs/HARNESSES.md
T
83c37e453a feat: add Mistral Vibe harness support (#373)
* feat: add Mistral Vibe harness support

Mistral Vibe is Mistral AI's open-source CLI coding assistant that ships an
Agent Skills system at .vibe/skills/{name}/SKILL.md with slash-command
invocation, mapping cleanly onto the existing transformer pipeline. Adds
Vibe as a 14th first-class harness:

- PROVIDER_PLACEHOLDERS entry in scripts/lib/utils.js (model, config_file
  = AGENTS.md, ask_instruction, command_prefix) mirroring the Qoder shape.
- PROVIDERS entry in scripts/lib/transformers/providers.js with configDir
  .vibe and frontmatterFields user-invocable, license, compatibility,
  metadata, allowed-tools (Vibe docs do not document argument-hint).
- transformVibe named export in scripts/lib/transformers/index.js for
  test-spy parity.
- vibe added to FILE_DOWNLOAD_PROVIDER_CONFIG_DIRS so the download
  endpoint accepts /api/download/skill/vibe/* and resolves to
  dist/vibe/.vibe/.
- .vibe added to PROVIDER_DIRS, PROVIDER_ALIASES, PROVIDER_DISPLAY,
  PROVIDER_INPUT_ORDER, GLOBAL_HARNESS_HINTS, and the normalizeForHash
  provider regex in cli/bin/commands/skills.mjs so the CLI detects
  existing Vibe installs.
- docs/HARNESSES.md updated: official docs row, frontmatter support
  column, directory structure row, and Last verified date bumped.
- docs/DEVELOP.md, README.md (install instructions, providers list,
  Supported Tools), .github issue/PR templates, sync-generated-output
  workflow, and AGENTS.md extended with Vibe.

The dynamic providers.test.js loop picks up Vibe automatically; all 160
provider tests pass including the 14 new Mistral Vibe cases. The build
regenerates dist/vibe/.vibe/skills/impeccable/ with correct frontmatter
and .vibe-substituted script paths. Generated harness output is left
unstaged per the source-first policy; the sync-generated-output workflow
(now listing .vibe) will commit it back to main after merge.

Co-Authored-By: Mistral Vibe <noreply@mistral.ai>

* Address review on Vibe harness support

Verified the Vibe claims against the docs and the mistralai/mistral-vibe
source, then tightened what the tables say.

- model placeholder: 'Mistral', not 'the model'. Vibe is Mistral's own
  first-party CLI, so it belongs with gemini -> Gemini and codex -> GPT
  rather than with the provider-agnostic harnesses. SKILL.src.md's one
  use of {{model}} now renders 'Mistral is capable of extraordinary
  work.' instead of a lowercase 'the model'.
- Docs links point at the skills page, not the product overview, matching
  every other row in both tables.
- disable-model-invocation is No, not TBD. The field appears nowhere in
  Vibe's source; unknown frontmatter keys are silently ignored.
- Split the directory row into project and global scopes the way the Pi
  row already does. Vibe reads .vibe/skills/ and .agents/skills/ at the
  project level and ~/.vibe/skills/ and ~/.agents/skills/ globally; the
  global .agents dir was missing, and project .agents/skills/ was sitting
  in the global column. Sources: vibe/core/paths/_local_config_files.py
  and vibe/core/config/harness_files/_paths.py.
- Restored 'Last verified' to 2026-04-28 and dated the Vibe row on its
  own. Only that row was checked, and this file warns against trusting
  stale claims, so a blanket re-date made ten other rows look fresher
  than they are.

AI assistance: written with Claude Code.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Mistral Vibe <noreply@mistral.ai>
Co-authored-by: Paul Bakaus <paul.bakaus@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-20 14:50:32 -07:00

8.6 KiB

Harness Skills Capabilities Reference

Source of truth for what each AI coding harness supports in terms of agent skills. Used to inform provider configs in scripts/lib/transformers/providers.js.

Last verified: 2026-04-28 (subagent landscape spot-checked 2026-06-28; Mistral Vibe row verified 2026-07-16)

This file is point-in-time. Capabilities move fast; verify live before relying on any "only X supports Y" claim. Notably, the subagent table below lists Impeccable's emission targets, not the support landscape (see its note).

Official Documentation

Harness Docs URL
Claude Code https://code.claude.com/docs/en/skills
Cursor https://cursor.com/docs/context/skills
Gemini CLI https://geminicli.com/docs/cli/skills/
Codex CLI https://developers.openai.com/codex/skills
GitHub Copilot (Agents) https://code.visualstudio.com/docs/copilot/customization/agent-skills
Kiro https://kiro.dev/docs/skills/
OpenCode https://opencode.ai/docs/skills/
Pi https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/skills.md
Qoder https://docs.qoder.com/extensions/skills
Trae TBD (no official skills docs found yet)
Rovo Dev https://support.atlassian.com/rovo/docs/extend-rovo-dev-cli-with-agent-skills
Mistral Vibe https://docs.mistral.ai/vibe/code/cli/skills

Spec Compliance

All harnesses follow the Agent Skills specification to varying degrees. The spec defines these frontmatter fields: name, description, license, compatibility, metadata, allowed-tools.

Provider-specific extensions beyond the spec: user-invocable, argument-hint, disable-model-invocation, allowed-tools (extended syntax), model, effort, context, agent, hooks, subtask, mcp.

Frontmatter Support

Fields marked with * are spec-standard. Others are provider extensions.

Field Claude Code Cursor Gemini Codex Copilot Kiro OpenCode Pi Qoder Rovo Dev Mistral Vibe
name* Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
description* Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
license* Yes Yes Ignored No Yes Yes Yes Yes Yes Yes Yes
compatibility* Yes Yes Ignored No Yes Yes Yes Yes Yes Yes Yes
metadata* Yes Yes Ignored No Yes Yes Yes Yes Yes Yes Yes
allowed-tools* Yes No Ignored No No No Yes Yes Yes Yes Yes
user-invocable Yes No No No Yes No Yes No Yes Yes Yes
argument-hint Yes No No No Yes No Yes No Yes Yes No
disable-model-invocation Yes Yes No No Yes No Yes Yes TBD TBD No
model Yes No No No No No Yes No No No No
effort Yes No No No No No No No No No No
context Yes No No No No No No No No No No
agent Yes No No No No No Yes No No No No
hooks Yes No No Yes No No No No No No No

Notes:

  • Gemini CLI validates only name and description; other spec fields are parsed but ignored.
  • Codex CLI uses a separate agents/openai.yaml sidecar for skill metadata (icons, branding, MCP tools, invocation control). Codex also auto-discovers subagents bundled inside an installed skill's agents/ folder (TOML), which is how Impeccable ships its asset-producer. Standalone custom agents can still live under .codex/agents/ or ~/.codex/agents/, but Impeccable no longer installs anything there.
  • Codex CLI hooks ship under [features].hooks = true (still flagged), require /hooks trust ceremony per-update, and are disabled on Windows.
  • Kiro recognizes user-invocable and disable-model-invocation per community reports but does not formally document them.
  • Unknown fields are silently ignored by all harnesses.

Hook surface used by Impeccable

Harness Edit hook Startup hook Manifest location Notes
Claude Code Yes (PostToolUse) No .claude/settings.json Project-local settings entry installed by npx impeccable skills install/update. Runs .claude/skills/impeccable/scripts/hook.mjs.
Codex CLI Yes (PostToolUse) No .codex/hooks.json Project-local manifest installed with the .agents/skills/impeccable payload. Runs .agents/skills/impeccable/scripts/hook.mjs from the git root. Requires normal /hooks trust approval.
Cursor Yes (preToolUse) No .cursor/hooks.json Project-level manifest installed with .cursor/skills/impeccable. Runs hook-before-edit.mjs to block bad proposed writes before they land. Reloads on save; restart Cursor if hooks do not pick up.
All other harnesses No No n/a No documented hook surface today. Skill and commands still ship.

Skill Directory Structure

Harness Native directory Also reads
Claude Code .claude/skills/ -
Cursor .cursor/skills/ .agents/skills/, .claude/skills/
Gemini CLI .gemini/skills/ .agents/skills/
Codex CLI .agents/skills/ (primary) -
GitHub Copilot .github/skills/ .agents/skills/, .claude/skills/
Kiro .kiro/skills/ -
OpenCode .opencode/skills/ .agents/skills/, .claude/skills/
Pi .pi/skills/ (project), ~/.pi/agent/skills/ (global) .agents/skills/
Qoder .qoder/skills/ ~/.qoder/skills/ (user-level)
Trae China .trae-cn/skills/ TBD
Trae International .trae/skills/ TBD
Rovo Dev .rovodev/skills/ ~/.rovodev/skills/ (user-level)
Mistral Vibe .vibe/skills/ (project), ~/.vibe/skills/ (global) .agents/skills/ (project), ~/.agents/skills/ (global)

All harnesses support the {skill-name}/SKILL.md directory structure with optional reference/, scripts/, and assets/ subdirectories.

Native Subagent Directory Structure (Impeccable emission targets)

Scope: this table is where Impeccable emits native subagent files, not a map of which harnesses support subagents. Subagents are broadly supported now: Cursor (auto-delegation + /name invocation, https://cursor.com/docs/subagents), GitHub Copilot, and Google Antigravity ship them too. Impeccable only writes native files where there is a stable, documented on-disk format to target.

Harness Native directory File format
Claude Code .claude/agents/ (installed plugin) Markdown with YAML frontmatter
Codex CLI <skill>/agents/ (nested, auto-discovered) TOML

Impeccable keeps canonical agent prompts under skill/agents/ and emits provider-native files only for harnesses with a documented on-disk subagent format. Claude reads its agents from the installed plugin; Codex auto-discovers the TOML bundled inside the installed skill's own agents/ folder, so the normal skills install carries it with no separate sidecar.

Spawn / permission model (matters more than directory support when building skills):

Harness Who can spawn a subagent
Claude Code Programmatically, from within the skill/agent flow.
Codex CLI Only if the user has allowed sub-agents / parallel work; otherwise the skill must ask once, then stop (see skill/reference/critique.md <codex> gate).
Cursor Agent-chosen: auto-delegated by the Agent, or user-invoked via /name. Not reliably skill-spawnable.
Others Varies; treat as unavailable unless verified, and degrade loudly.

Placeholder / Variable Substitution

Claude Code supports runtime variable substitution directly in SKILL.md bodies: $ARGUMENTS, $0-$N, ${CLAUDE_SKILL_DIR}, ${CLAUDE_SESSION_ID}. No other harness supports substitution in skills.

Some harnesses have separate "custom commands" systems (distinct from skills) with their own substitution:

Harness Command system Substitution syntax
Gemini CLI .gemini/commands/ (TOML) {{args}}, !{shell}, @{file}
Codex CLI .codex/prompts/ $ARGNAME
OpenCode .opencode/commands/ $ARGUMENTS, $1-$N, !`shell`

Our build system handles cross-provider placeholders at compile time via replacePlaceholders() for {{model}}, {{config_file}}, {{ask_instruction}}, and {{available_commands}}.