Both scripts handled an unknown option with `error ...; usage`, and usage()
always ended in `exit 0`:
$ ./scripts/convert.sh --tol codex; echo $?
[ERR] Unknown option: --tol
...usage...
0
so a mistyped flag in CI or a wrapper script read as success. usage() now
takes a status. --help still prints to stdout and exits 0; an unknown
option prints the usage text to stderr and exits 1, the same as a bad
--tool or --division value already does.
convert.sh --help also printed a hard-coded `sed -n '3,28p'`. The option
notes live on lines 33-34, so --parallel and --jobs never appeared, and
--out was only in the synopsis. It now uses USAGE-START/END sentinels, as
install.sh has for a while, and the option list covers --tool and --out.
test-cli-usage.sh checks both scripts: an unknown option exits non-zero
with its name and the usage on stderr and nothing on stdout, --help exits 0
without printing the sentinels, and convert.sh --help describes --tool,
--out, --parallel and --jobs. It fails on main at the first check and runs
in check-tools.yml.
strategy/runbooks.json names agents by file stem, the corpus id the desktop
app maps to catalog entries ("engineering-frontend-developer"). The installer
only accepted the slug built from `name:` ("frontend-developer"), and for
206 of the 279 agents those differ. Of the 36 agents the four runbooks list,
35 could not be selected by the ids the runbooks give them:
$ install.sh --tool claude-code --agent engineering-frontend-developer --dry-run
[ERR] Unknown agent 'engineering-frontend-developer'. Use --list agents ...
So there was no way to install a runbook's team from the CLI without
translating every id by hand.
resolve_agent now takes a slug, a display name (as before, via slugify), or a
file stem, and returns the install slug. Slugs are tried first. No stem
equals a different agent's slug today, and stems are unique, so nothing that
resolved before resolves differently now.
Resolution also stops rescanning the roster per request. agent_slug_exists
ran get_field over all 279 files for each requested agent; roster_index
builds the slug/stem table once in the parent shell. A 36-line agents file
went from ~10,000 get_field calls to 279.
test-agent-selection.sh gains a stem case and feeds each runbook's roster to
--agents-file, checking that it resolves to exactly its own agent count. It
fails on main at the first runbook. The usage text and the README selection
section say which ids are accepted, with an example of installing a
runbook's team.
A sequential install called install_tool bare under set -e, so the first
tool that returned 1 exited the whole script. With copilot, cursor, qwen,
codex and hermes detected and no integrations/cursor:
[1/5] copilot [OK]
[2/5] cursor [ERR] integrations/cursor missing. Run convert.sh first.
(exit 1)
qwen, codex and hermes were never attempted, and nothing said so. The same
happens for any ensure_converted failure or an OpenClaw registration error.
Each tool now runs in a subshell with errexit on. It is not
`install_tool "$t" || failed+=(...)`: bash ignores errexit for everything on
the left of ||, subshells included, so a failing cp inside a tool would carry
on as if it had worked. Instead the parent turns errexit off for that one
command, and the subshell turns it back on for itself.
A failed tool is recorded and the loop moves on. The done box reads
"Installed 2 of 3 tool(s)" instead of "Done!", and the run ends with
"Failed: cursor — see the [ERR] line under each above" and exit 1. A clean
install is unchanged. Nothing in install_* sets globals the parent reads
afterwards, and the SKIPPED_LOG cleanup trap does not fire in a ( )
subshell, so running tools in a subshell loses nothing.
Parallel mode is untouched; its log replay on failure is item 1 of #917.
test-install-continue-after-failure.sh builds a fixture repo with
gemini-cli and qwen output and no cursor output, installs all three, and
checks that qwen still installs, cursor's error is shown, the summary names
cursor, and the exit is non-zero. It also checks that a clean run still
exits 0. It fails on main at "qwen ... was never installed" and runs in
check-tools.yml.
path_collision_group put claude-code and copilot in their own group on the
assumption that they write <division>-<slug>.md. They copy the source file
under its own name, and 73 of the 279 agents are named <slug>.md already:
all 20 in game-development/, 38 in specialized/, 6 in spatial-computing/ and
9 elsewhere. For those, the file is the same one gemini-cli, opencode, qwen
and zcode write.
$ install.sh --tool claude-code,qwen --agent game-designer --path out --no-convert
[OK] Claude Code: 1 agents -> out
[OK] Qwen Code: installed 1 agents to out
$ head -2 out/game-designer.md
---
name: 'game-designer' <- qwen's frontmatter; the Claude Code file is gone
Both tools report success and the install exits 0. A full install of any of
those pairs into one --path loses 73 files the same way.
The six tools are now one group. That also refuses a pair like claude-code
and gemini-cli for a selection with no slug-named agent in it, which could
technically share a directory; the guard works per tool pair, and a full
install collides on 73 files, so treating the pair as colliding is the
honest answer. claude-code with codex, cursor, kimi and the other
distinct-output tools still share a --path as before.
test-install.sh picks a slug-named agent from game-development/ and checks
that claude-code,qwen into one --path is refused and writes nothing. The
refusal comes before conversion, so the case stays cheap.
#915 made registration failures visible (main swallowed them with `|| true` and
reported success). But it returned at the first failure, so every agent after it
went unregistered. In real OpenClaw 2026.9.6 with one registration forced to fail,
batch 2 registered only 1 of the 2 agents that could have succeeded.
Keep registering the rest, name every failure in one message at the end, and
still exit non-zero. Verified against real OpenClaw (node:24, official npm
package): the failure case now registers both good agents and exits 1; the
normal install and the re-run are unchanged. #915's own test still passes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#916 stops cp from writing through a symlink at an agent's destination, which on
main overwrites whatever the link points at (verified: a user's file was replaced
by an agent). But it made one stray link fatal: under `set -e` the refusal aborted
the install at the first link, leaving a partial roster (57 of 279 in testing).
It also refused our own links, so re-installing without --link after a --link
install failed for every file (main fails there too, with "are the same file").
- A link into this clone ($REPO_ROOT) is ours: remove it and copy. That's the
intended --link -> copy switch, and the clone's sources stay untouched.
- Any other link is skipped with a warning, recorded, and the install continues.
The final summary lists what was not installed. A temp file carries the list so
it survives the parallel installer's subshells.
- test-install.sh: #916's case now asserts skip-and-continue (sentinel intact,
link left in place, the rest of the selection installs, summary reports it);
new case for --link then copy (link replaced by a real file, source unchanged).
65 passed, 0 failed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
`rm -rf "$dest/"` follows a symlink and empties its target. basename ignores a
trailing slash, so HERMES_PLUGIN_DIR=".../agency-agents-router/" passed every
check, and a symlinked destination (our own --link install, or a user's folder)
had its target's contents deleted. #903's ownership check didn't cover it: the
check reads through the link and the rm still follows it.
- Strip all trailing slashes from the destination before any check.
- A symlinked destination is removed with `rm -f` (the link itself), never
`rm -rf`.
- test-install-hermes-destination.sh: two new cases (trailing slash on a
symlink to a folder with a matching plugin.yaml; re-install over a --link
install). Both fail before this commit and pass after.
Found by a destructive-path matrix (25 scenarios, throwaway container, fake HOME
with sentinel files): main fails 10 (deletes unrelated dirs, files and symlink
targets at the plugin path); the series without this commit fails 2 (H8/H9);
with it, 25/25.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The Hermes installer printed "[OK] enabled plugin" and "Done!" while leaving agency-agents-router disabled or absent. On current Hermes this hit every user: the default plugins: block contains a column-0 "# ====" banner, and `hermes plugins enable/disable` writes enabled:/disabled: below it.
- Bound the enabled: sub-block at the first sibling key; sweep stale entries out of disabled: (Hermes: "an explicit disable wins"); handle inline [], [a,b], disabled: above enabled:, trailing comments, corrupted-scalar recovery; bail on shapes that can't be edited line-wise. (@guozi-lab)
- A column-0 comment no longer ends the plugins: block, and the rewrite's exit status propagates (`|| return 1`) so a bail warns instead of reporting success. (maintainer follow-up)
- check-hermes-config-rewrite.py: 16 cases, including Hermes' real shape.
Verified in real Hermes (official installer, 9a0a162) on configs Hermes wrote itself, with a live turn on local qwen3.8-27b: main -> "agency_agents_delegate does not exist"; this change -> delegated: true, real subagent, real result.
Closes#879
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds DeepSeek Harness as an integration target: 279 agency-* SKILL.md skills installed to ${DSH_HOME:-~/.dsh}/skills (or DSH_SKILLS_DIR for project scope).
Verified in DeepSeek Harness itself (@deepseek-ai/dsh 0.1.7-rc.2, installed via the documented npx path on Ubuntu 26.04 arm64): the repo installer placed 279 skills, and dsh's own skill-filesystem parser accepted all 279 with zero warnings (a planted invalid name and a missing description were both rejected with dsh's own messages).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#871 shrank the aider integration from 3.8M characters of concatenated agents
to a 97K roster index, because aider keeps a conventions file in context for a
whole session. The fix only reached new installs.
install_aider refuses to overwrite an existing CONVENTIONS.md, which is right —
it is aider's own user-authored file and the one on disk may be the reader's.
But "already exists (remove to reinstall)" says nothing about which file it is,
so anyone holding the pre-index roster re-ran the installer, read that, and
kept the broken file. The people the fix was written for were the ones it could
not reach.
Our generated file has always opened with "# The Agency — AI Agent
Conventions", so the installer can now tell its own stale copy from someone
else's conventions and say which it is. Neither branch writes anything.
Verified in a container, all three cases:
stale Agency roster -> names it, reports 3800039 bytes, says to delete and re-run
user's own file -> "leaving your file alone", file intact
no file -> installs, 97065 bytes
Windsurf has the same guard and the same gap; #870 already handles it there, so
this leaves that path alone rather than colliding with it.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Aider loads a conventions file into context and keeps it there for the whole
session — that is what the file is for, and the docs say to load it with
--read so prompt caching can hold it. This integration concatenated every
agent body into it. At 279 agents that is 3,816,372 characters, roughly a
million tokens. No model takes that. Anyone who ran
./scripts/install.sh --tool aider
got a CONVENTIONS.md that either blows the context window on the first turn
or bills for a million tokens trying.
CONVENTIONS.md is now the roster index it was described as: one entry per
agent with the name, the description, the division, and the path to the
agent file. 96,823 characters, down from 3.8 million. The header explains
how to pull a single agent's full instructions into the session:
/read-only /path/to/agency-agents/engineering/engineering-frontend-developer.md
Naming an agent in a prompt still works the way it did — the description is
what the model needed for that, and it is still there.
test-convert-outputs.sh now holds the index to being an index: it fails if
CONVENTIONS.md grows past 250,000 characters, if it does not list exactly
one path per roster agent, or if any path it prints does not resolve. The
existing round-trip check on the accumulated file still covers the names and
descriptions.
ensure_hermes_plugin_enabled() hardcoded a 2-space indent for the inserted `- agency-agents-router` line. Hermes writes plugins.enabled items at 4 spaces, so the new line and the next existing item collapsed into one plain scalar ("agency-agents-router - disk-cleanup") and every previously enabled plugin silently dropped (#839, and #689 diagnosed the same in July). The inserter now matches the existing item indent (default 4), appends after existing entries so order is preserved, and is idempotent on re-run. scripts/check-hermes-config-rewrite.{sh,py} runs seven regression cases; a small workflow runs it on every PR.
Reproduced on main with a 4-space config and verified fixed with this patch; installer suite 36/0; the regression script passes 7/7.
Fixes#839. Closes#689 (same fix, proposed first by @harshsinghmp).
Co-Authored-By: Harsh Singh <32476777+harshsinghmp@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
resolve_dest() for claude-code now appends /agents to CLAUDE_CONFIG_DIR (the config root that replaces ~/.claude); a value already ending in /agents is used verbatim and a trailing slash is stripped. detect_claude_code() honors CLAUDE_CONFIG_DIR so relocated configs are detected. Three regression cases in scripts/test-install.sh.
Fixes#578. The diagnosis and the same fix were first proposed by @halindrome in #579 (June); this lands the current-main version with tests.
Co-Authored-By: Shane McCarron <520688+halindrome@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* Reapply "test(install): add a regression suite for install.sh + CI on Linux and macOS (#772)" (#827)
This reverts commit 4bab3cf4a2.
* fix(install): refuse --path only for tools that would overwrite each other; re-land installer test suite (#772)
Re-lands the install.sh regression suite from #772 (reverted in #827) together
with the guard change that makes it pass, so CI goes green in one step.
Background. #825 made --path refuse more than one --tool, on #819's report that
several tools sharing one destination clobber each other. That was right in
spirit and over-broad in practice, and it was implemented without verifying
the premise. Measured by installing one agent with every tool into a sandbox
and comparing what landed:
<division>-<slug>.md (raw copy) claude-code, copilot
<slug>.md (converted) gemini-cli, opencode, qwen, zcode
agency-<slug>/SKILL.md antigravity, osaurus
Tools in the same group write identical filenames and silently overwrite each
other (qwen + gemini-cli lose a file while both print [OK]). Tools in different
groups coexist (claude-code + codex, claude-code + qwen). Every other tool's
output is distinct.
The guard now refuses --path only for a colliding pair, naming both tools and
the reason, and allows the rest. path_collision_group() holds the measured
table; re-measure if a converter's naming changes.
The suite's two-tool --path cases used claude-code + copilot, which collide:
the "installs exactly one agent" count of 1 was passing because copilot had
overwritten claude-code's identical file. They now use claude-code + codex and
assert that BOTH outputs survive, which a single count cannot show; a new case
asserts the colliding pair is refused. codex has no committed output, so those
cases convert (only the two raw-copiers work under --no-convert in a fresh
checkout).
Verified under bash 3.2 (the macOS CI leg): 29 passed, 0 failed, 1 xfail.
Guard spot-checked against all three measured groups plus a cross-group pair.
Suite, workflow and CONTRIBUTING note by @SergiorCode (#772). Refs #772#819#825#827.
Co-Authored-By: SergiorCode <SergiorCode@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(install): auto-convert never fired in a fresh checkout — README.md read as generated output
ensure_converted decided a converted tool's output was present if its
integrations/<tool>/ directory contained any file. Every one of those
directories ships a committed README.md, so in a fresh checkout the check
always found a file, skipped convert.sh, and the installer then hard-failed
"integrations/<tool> missing. Run convert.sh first." — the exact flow #426's
auto-convert was added to prevent. This affected every converted tool; it was
masked locally by generated outputs left behind in the working tree, and
surfaced only when the test suite ran in a clean checkout.
Only files other than README.md now count as generated output. Verified in a
clean worktree under bash 3.2: the suite's serial-control case (claude-code +
codex into one --path) now auto-converts codex and both outputs land;
29 passed, 0 failed, 1 xfail.
Refs #426
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: SergiorCode <SergiorCode@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Four install/convert bugs reported by @sunilkumarvalmiki (#817-#820), each
verified in a sandbox before and after the change.
- convert.sh --tool all --parallel silently skipped kimi: the parallel batch
listed 11 tools and the sequential batch 2, so the 14th tool ran in neither
(kimi output: 0 files vs 273 for every other tool). Add kimi to the parallel
batch — it writes to its own integrations/kimi/<slug>/ dir so it is
parallel-safe. (#817)
- The sequential batch's progress counter was hardcoded idx=8, stale from an
older batch size, printing "aider (8/14)" instead of 12/14. Derive it from
the parallel list length so it can never drift again; now prints 13/14 and
14/14. Same root cause as #817. (#818)
- --path is a documented single-destination override; with several --tool
values every tool resolved to the same directory and clobbered each other.
Refuse --path with more than one tool. Deliberately NOT restricting the path
itself: the override is the supported way to redirect installs (e.g. to a
sandbox), and validating it against an expected dir would break that. (#819)
- clean_tool_output runs rm -rf on $OUT_DIR/$1. The tool name is validated
upstream so this is not reachable today, but a plain-slug guard on $1 makes a
future direct caller unable to steer it outside $OUT_DIR via "../" or "/".
A prefix check would not do: "$OUT_DIR/../x" still starts with the prefix. (#820)
Fixes#817Fixes#818Fixes#819Fixes#820
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* Add Research division with Research Synthesist agent
New division for literature review, source evaluation, and evidence
synthesis. Wired into divisions.json, convert.sh, lint-agents.sh,
install.sh, and the lint-agents CI workflow.
* chore(hermes): regenerate agent count 272 -> 273 for research division (#770)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Prashant Raj Bista <prashant.bista.18@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* feat(tools): add ZCode (Z.ai GLM agent harness)
ZCode reads per-agent markdown from `.zcode/agents/{slug}.md` (project) and
`~/.config/zcode/agents/{slug}.md` (global), with `name` + `description` YAML
frontmatter and an optional `tools` list — the same plain-agent-markdown shape
as Qwen.
- tools.json: add the `zcode` entry (dual-scope, per-agent, format `zcode-md`).
- convert.sh: add `convert_zcode` (byte-identical to the qwen converter,
output to integrations/zcode/agents/) + register in the dispatch, valid_tools,
tools_to_run, and parallel_tools.
- install.sh: add `zcode` to ALL_TOOLS, `install_zcode`, `detect_zcode`, and the
resolve_dest / bin / is_detected / display / label dispatches.
Directories + file format verified against ZCode's published docs. Renderer
contract: `zcode-md` output is byte-identical to `qwen-md`, verified by
diffing `convert.sh --tool zcode` against `--tool qwen` (243/243 files match).
check-tools.sh passes (16 tools consistent across tools.json, install.sh, and
convert.sh); bash -n clean on both scripts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WdX6PvnCfRgYD11yVpXVor
* zcode: gitignore generated output + add integration README
Bring the ZCode integration in line with the other tools: the 243 generated
agent files (integrations/zcode/agents/*.md) are output of `convert.sh`, not
source — add a .gitignore rule so they can't be committed, and add
integrations/zcode/README.md documenting generate/install (matching the vibe
and qwen integration READMEs).
Verified: generated agents are now git-ignored, the README is tracked, and
check-tools.sh still passes at 16 tools.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
* zcode: fix user-scope install path to ~/.zcode/agents (per ZCode docs)
The user-scope dest was ~/.config/zcode/agents/, but the official ZCode docs
state subagents are read from ~/.zcode/agents/<name>.md — so user-scope
installs landed where ZCode never looks. (detect.agentsDir and project scope
were already correct at .zcode/agents, so this was an internal inconsistency.)
Point tools.json dest.user, install_zcode's default, the header comment, and
the list display at ~/.zcode/agents; drop the stale ~/.config/zcode detection
clause; update the integration README. Keep format `zcode-md` distinct — ZCode's
native format supports color/model/permissions, so it will diverge from gemini-md
as the converter matures rather than being a permanent alias.
Verified: a default user-scope install now writes to ~/.zcode/agents/<slug>.md
(not ~/.config/zcode); check-tools.sh passes at 16 tools; install.sh syntax and
tools.json JSON both valid.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The help text advertised `--tool <a,b>` (a comma list), but --tool took a
single value and validated it whole, so `--tool claude-code,cursor` failed
with "Unknown tool 'claude-code,cursor'". --division and --agent already
split on commas; --tool didn't (#671).
Split --tool on commas, trim each entry, and validate each against
ALL_TOOLS (mirrors --division), so a bad entry still errors clearly by
name. Single-tool use is unchanged.
Verified: --tool claude-code,cursor installs both; "claude-code, cursor"
(with spaces) works; --tool claude-code,nope errors on 'nope'; --tool
cursor still works.
Fixes#671
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
install.sh hardcoded the division set in two lists (AGENT_DIRS,
ALL_DIVISIONS), and both had gone stale — missing healthcare (#655). So
`--tool claude-code`/`copilot` skipped healthcare's 2 agents,
`--division healthcare` errored "Unknown division", the interactive team
list omitted it, and the agent count was low by 2 (#668).
Derive both lists from divisions.json (the single source of truth), using
the same no-jq awk/grep/sed parse as check-divisions.sh. ALL_DIVISIONS is
now exactly the divisions.json entries; AGENT_DIRS is that set plus
strategy/ (preserving the intentional scan of its frontmatter-less docs,
which is_agent_file filters out). This is the same fix pattern as #659
(check-agent-originality.sh) and #666 (build-hermes-plugin.py): a derived
list can't drift, so check-divisions.sh needn't be extended to cover it.
Verified: ALL_DIVISIONS resolves to 17 (healthcare in, strategy out),
strategy still scanned, and `--division healthcare --dry-run` now finds
2 agents instead of "Unknown division".
Fixes#668
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
install_hermes() resolved `dest` from HERMES_PLUGIN_DIR and ran `rm -rf
"$dest"`. The var name invites setting it to the plugins *parent*
(~/.hermes/plugins) rather than the full plugin path, in which case the
rm -rf wiped the entire plugins directory and every other plugin in it.
Always target the agency-agents-router subdir (append it when the resolved
path doesn't already end in it), and add a defensive guard that refuses to
remove any path whose basename isn't `agency-agents-router`. Verified: with
HERMES_PLUGIN_DIR set to the plugins parent, a sibling plugin's data now
survives the install.
Fixes#669
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* 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>
Antigravity moved its skill directories: global skills now load from
~/.gemini/config/skills/ and project skills from <project>/.agents/skills/
(the old ~/.gemini/antigravity/skills/ is stale). Confirmed against Google's
Antigravity Skills docs.
- tools.json: antigravity → skill-md format, new user+project dests, scope
user+project (keeps the `agency-` slug prefix for namespacing).
- convert.sh: emit standard Agent-Skills frontmatter only (name + description);
drop risk/source/date_added — the date stamp made output non-deterministic,
and it's the reason the app had kept Antigravity recognized-only. Now byte-
identical to the osaurus skill-md shape. Removed the now-unused
ANTIGRAVITY_DATE_ADDED constant.
- install.sh: install + detect against ~/.gemini/config/skills/.
- Docs updated.
check-tools.sh passes (tools.json / install.sh / convert.sh consistent).
Path discovery + skill-md approach by Pedro Remedios (msitarzewski/agency-agents-app#32).
Co-authored-by: Pedro Remedios <pedro.remedios@gmail.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
resolve_dest honors OSAURUS_SKILLS_DIR but the header's Env: line omitted it.
One-line doc add for completeness. Follow-up to #603.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>