#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>
Tooling: add Osaurus (Anthropic Agent-Skills SKILL.md format) as a conversion
and install target, wired into convert.sh (convert_osaurus + dispatch/valid/all/
parallel lists, --osaurus flag) and install.sh (detect/label/dest/install_osaurus
+ dispatch). Generated output lands in integrations/osaurus/agency-*/SKILL.md and
is gitignored like every other tool's output (regenerate via convert.sh osaurus).
Docs/guardrails — make the division contract discoverable, since it lived only
in scattered script comments and tripped up multiple contributors:
- CONTRIBUTING.md: complete the division list to all 16 (was missing academic/
gis/sales) and document that divisions.json is the source of truth (CI-checked
by check-divisions.sh), how to propose a new division, and that strategy/
(NEXUS playbooks) and integrations/ (generated output) are NOT divisions.
- install.sh: correct the stale "sync with convert.sh / lint-agents.sh" comment —
install.sh intentionally keeps strategy/ in AGENT_DIRS (filtered at scan time),
so it is deliberately NOT the same set as the other two.
- .gitignore: ignore integrations/osaurus/agency-*/ (the osaurus output was the
one tool whose generated files weren't excluded).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Account for the 9 agents merged in #450-456, #568, #569:
- README: add 3 Engineering rows (Multi-Agent Systems Architect,
Drupal/WordPress Shopping Cart Engineer) + 6 Specialized rows
(CFO, ESG & Sustainability Officer, Data Privacy Officer,
Operations Manager, M&A Integration Manager, Organizational
Psychologist); bump Stats + acknowledgements 209 -> 218.
- install.sh: fix `--list` as the final argument aborting with
exit 1 under set -e (shift 2 with only one positional). Now
treats a missing/flag-like value as "all" and shifts once.
Roster drift is now zero (218 linked rows = 218 source agents);
convert/install auto-discover the new agents via AGENT_DIRS
(specialized/ + engineering/). lint: 0 errors, 218 files.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: installer v2 — selective install, interactive TUI, consolidate cluster
One coherent, dependency-free installer (bash 3.2+, zero deps) that
consolidates 7 conflicting install.sh PRs and fixes#532.
Selective install (compose freely; empty = everything):
- --division / --agent / --agents-file filter across both source tools and
the flat converted outputs via a slug-based allow-set (#157, #487)
- --list [tools|teams|agents] and --dry-run
Install mechanics:
- --link symlink vs copy (#233); --path + env-var fallbacks (#216);
auto-run convert.sh when integration files are missing (#426);
resolve_tool_path dynamic detection (#327); set -e-safe increments (#505)
Interactive wizard (pure bash):
- Tools -> Teams -> Review, arrow-key nav, space toggle, a/n all/none,
live / search, live agent counts, inline OpenCode capacity warning,
alt-screen takeover with trap-based Ctrl-C restore, non-TTY fallback
#532: installing a subset keeps you under OpenCode's ~119 scanner cap
(upstream anomalyco/opencode#27988); installer warns when exceeded; README
documents it.
New scripts/lib.sh holds shared frontmatter/slug helpers (used by
convert.sh too) + ANSI/TUI primitives.
Closes#157, #216, #233, #327, #426, #487, #505.
Co-Authored-By: kienbui1995 <kienbui1995@users.noreply.github.com>
Co-Authored-By: Shiven0504 <Shiven0504@users.noreply.github.com>
Co-Authored-By: rounakkumarsingh <rounakkumarsingh@users.noreply.github.com>
Co-Authored-By: toukanno <toukanno@users.noreply.github.com>
Co-Authored-By: ilyaivasyk <ilyaivasyk@users.noreply.github.com>
Co-Authored-By: Jason2031 <Jason2031@users.noreply.github.com>
Co-Authored-By: ShaoJiaZhen <ShaoJiaZhen@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(installer): robust arrow-key reading (bash 3.2 integer timeouts + SS3)
read_key used a fractional -t 0.01 timeout, which bash 3.2 (/bin/bash on
macOS) doesn't support — so arrow-key escape bytes ([A/[B) leaked through
and were parsed as letter commands (toggling instead of moving). Rewrite
to read the sequence byte-by-byte with integer timeouts and handle both
CSI ([) and SS3 (O) cursor modes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(installer): clear-to-end-of-line per row so frames don't bleed
draw_frame only cleared below the frame (\033[0J), so when a new screen's
lines were shorter than the previous screen's, the old tails (tool paths,
warnings) bled through on the right. Now erase-to-eol (\033[K) on every
line before the screen-clear.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(installer): 2-column grid for Tools/Teams on the Review screen
Replaces the wrapping space-joined 'Tools:'/'Teams:' lines with a compact
column-major 2-column grid (each item on its own line, like the selectors),
so long rosters stay readable and on-screen instead of wrapping.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(installer): Review layout — space after Teams, warning below Install
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(installer): consistent screen layout across all 3 screens
Standard vertical rhythm everywhere: pager -> description -> content ->
selection summary -> navigation -> warnings. Splits the selector footer
into separate summary/nav/warning lines (SEL_SUMMARY_FN/SEL_NAV/
SEL_WARN_FN) and reorders the Review screen to match.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: kienbui1995 <kienbui1995@users.noreply.github.com>
Co-authored-by: Shiven0504 <Shiven0504@users.noreply.github.com>
Co-authored-by: rounakkumarsingh <rounakkumarsingh@users.noreply.github.com>
Co-authored-by: toukanno <toukanno@users.noreply.github.com>
Co-authored-by: ilyaivasyk <ilyaivasyk@users.noreply.github.com>
Co-authored-by: Jason2031 <Jason2031@users.noreply.github.com>
Co-authored-by: ShaoJiaZhen <ShaoJiaZhen@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Migrates Gemini CLI to native subagents (~/.gemini/agents/) + quotes zk-steward description. Rebased from #472; e2e-verified with real gemini v0.43.0. Closes#473.
Co-Authored-By: Tomo Wang <tomo_wang@163.com>
Adds Codex as a conversion/install target: each agent → `~/.codex/agents/<slug>.toml` with the three required Codex fields (name, description, developer_instructions).
Validated: all 184 agents generate valid, parseable TOML (incl. 21k-char agents with embedded code blocks) via the PR's TOML basic-string escaper. Matches OpenAI's documented custom-agent schema.
Thanks @yunuskilicdev.
Adds finance/ to AGENT_DIRS in all 3 scripts, CI workflow trigger paths, CONTRIBUTING.md category list, and README.md division roster. Also fixes duplicate sales entry in lint-agents.sh.
Syncs agent directory lists (academic/, sales/, strategy/) across all three scripts: lint-agents.sh, convert.sh, install.sh. Refactors install.sh to use shared AGENT_DIRS constant, eliminating duplication. Closes#242.
Fixes Copilot agent install path (copies to both ~/.github/agents and ~/.copilot/agents for backwards compatibility) and OpenCode directory handling (searches both flat and nested layouts). Closes#218, #228, #185, #245.
Add complete support for Kimi Code CLI agent format.
- Add convert_kimi() function to generate YAML agent specs
- Add install_kimi() function to install agents to ~/.config/kimi/agents/
- Add Kimi to tool detection and installer UI
- Add integrations/kimi/ directory (generated files gitignored)
- Update integrations/README.md with Kimi documentation
- Add generated agent directories to .gitignore
Users can generate agents with: ./scripts/convert.sh --tool kimi
- Add convert_qwen() to scripts/convert.sh for generating Qwen SubAgent .md files
- Add install_qwen() to scripts/install.sh for installing to .qwen/agents/ (project-scoped)
- Add qwen detection, tool label, and install cases
- Update README.md with Qwen in supported tools table + usage section
- Add integrations/qwen/agents/ to .gitignore + create .gitkeep
- Add Qwen Code compatibility note to CONTRIBUTING.md
- Preserve tools: field in Qwen output when present in source agents
- Fix interactive installer to show dynamic [1-N] toggle range
- Update README roadmap checklist to include Qwen Code
Qwen SubAgents use minimal YAML frontmatter (name, description) with optional tools: field preserved from source. Body content passes through unchanged.
Tested with 120 agents — all convert and install successfully.
- Add sales/ to claude-code and copilot installer dir lists
- Add sales/ to lint-agents workflow trigger and changed-files filter
- Add LinkedIn Content Creator to marketing table in README
- Update agent count to 120
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After copying workspace files, call `openclaw agents add --non-interactive`
for each agent so they're immediately usable by agentId without any manual
config steps. Guarded by `command -v openclaw` so it's a no-op when OpenClaw
isn't installed. Adds a post-install reminder to restart the gateway.
Tested by Pip — an OpenClaw instance running on the machine that maintains
the agency-agents repo. 🫛
- Auto-detect ~/.openclaw directory or openclaw CLI
- Copy SOUL.md, AGENTS.md, IDENTITY.md per agent to ~/.openclaw/agency-agents/
- Add to interactive selector and tool list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add game-development to AGENT_DIRS in convert.sh, lint-agents.sh,
install.sh, and the CI workflow
- Remove maxdepth 1 from find commands so nested subdirectories
(e.g., game-development/unity/) are discovered
- Update CI git diff globs to **/*.md for recursive matching
- Remove strategy from lint AGENT_DIRS (playbooks, not agents)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prepares infrastructure for the upcoming Paid Media Division (PR #83).
Registers paid-media in convert.sh, lint-agents.sh, install.sh, and
the lint-agents GitHub Actions workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenCode docs now specify agents/ (plural) as the standard directory name;
agent/ (singular) is legacy backwards-compat. Update the converter output
path, installer source/dest paths, and .gitignore entry accordingly.