diff --git a/README.md b/README.md index da4d824e0..d52dc5e30 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [](https://github.com/DeusData/codebase-memory-mcp) [](https://github.com/DeusData/codebase-memory-mcp) [](#hybrid-lsp) -[](https://github.com/DeusData/codebase-memory-mcp) +[](https://github.com/DeusData/codebase-memory-mcp) [](https://github.com/DeusData/codebase-memory-mcp) [](https://github.com/DeusData/codebase-memory-mcp/releases/latest) [](https://scorecard.dev/viewer/?uri=github.com/DeusData/codebase-memory-mcp) @@ -16,7 +16,7 @@ **The fastest and most efficient code intelligence engine for AI coding agents.** Full-indexes an average repository in milliseconds, the Linux kernel (28M LOC, 75K files) in 3 minutes. Answers structural queries in under 1ms. Ships as a native executable with a small verified runtime-asset set for macOS, Linux, and Windows — download, run `install`, done. -High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-sitter/) AST analysis across all 162 languages, enhanced with [**Hybrid LSP** semantic type resolution](#hybrid-lsp) for Python, TypeScript / JavaScript / JSX / TSX, PHP, C#, Go, C, C++, Java, Kotlin, Rust, and Perl — producing a persistent knowledge graph of functions, classes, call chains, HTTP routes, and cross-service links. 17 MCP tools. No language runtime, hosted service, or API key. Plug and play across 45 supported automatic/conditional client surfaces. +High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-sitter/) AST analysis across all 162 languages, enhanced with [**Hybrid LSP** semantic type resolution](#hybrid-lsp) for Python, TypeScript / JavaScript / JSX / TSX, PHP, C#, Go, C, C++, Java, Kotlin, Rust, and Perl — producing a persistent knowledge graph of functions, classes, call chains, HTTP routes, and cross-service links. 17 MCP tools. No language runtime, hosted service, or API key. Plug and play across 46 supported automatic/conditional client surfaces. > **Research** — The design and benchmarks behind this project are described in the preprint [*Codebase-Memory: Tree-Sitter-Based Knowledge Graphs for LLM Code Exploration via MCP*](https://arxiv.org/abs/2603.27277) (arXiv:2603.27277). Evaluated across 31 real-world repositories: 83% answer quality, 10× fewer tokens, 2.1× fewer tool calls vs. file-by-file exploration. @@ -34,7 +34,7 @@ High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-si - **Plug and play** — native executable plus authenticated release-owned assets for macOS (arm64/amd64), Linux (arm64/amd64), and Windows (amd64). The native install needs no Docker, language runtime, or API keys. Download → `install` → restart agent → done. - **162 languages** — vendored tree-sitter grammars compiled into the binary. Nothing to install, nothing that breaks. - **120x fewer tokens** — 5 structural queries: ~3,400 tokens vs ~412,000 via file-by-file search. One graph query replaces dozens of grep/read cycles. -- **45 supported automatic/conditional client surfaces** — `install` configures detected clients and safely activates conditional clients only when their documented platform, marker, or explicit existing config path is present. See [Multi-Agent Support](#multi-agent-support) for the complete matrix and manual/UI-only boundaries. +- **46 supported automatic/conditional client surfaces** — `install` configures detected clients and safely activates conditional clients only when their documented platform, marker, or explicit existing config path is present. See [Multi-Agent Support](#multi-agent-support) for the complete matrix and manual/UI-only boundaries. - **Built-in graph visualization** — 3D interactive UI at `localhost:9749`, served from the binary itself. - **Infrastructure-as-code indexing** — Dockerfiles, Kubernetes manifests, and Kustomize overlays indexed as graph nodes with cross-references. `Resource` nodes for K8s kinds, `Module` nodes for Kustomize overlays with `IMPORTS` edges to referenced resources. - **17 MCP tools** — search, trace, architecture, impact analysis, targeted index-coverage checks, Cypher queries, dead code detection, cross-service HTTP linking, ADR management, and more. @@ -477,7 +477,7 @@ Restart your agent. Verify with `/mcp` — you should see `codebase-memory-mcp` ## Multi-Agent Support -`install` configures 45 client surfaces: 39 detected automatically and 6 +`install` configures 46 client surfaces: 40 detected automatically and 6 conditional or explicit. “Conditional” means the installer writes only when the documented platform or an explicit, already-existing config path proves the target is active. It never flips experimental feature flags, enables plugins, @@ -544,6 +544,7 @@ overwrite user-modified agents. | Pi | Detected | — | `~/.pi/agent/AGENTS.md` + skill; MCP/subagents require an explicit reviewed extension | | IBM Bob IDE | Conditional | Existing `~/.bob/mcp.json` | Shared rule + IDE skill; no invented hook or agent | | Oh My Pi (omp) | Detected | Effective agent directory (`OMP_PROFILE` / `PI_CODING_AGENT_DIR`; default `~/.omp/agent/mcp.json`) | Skill and three direct-MCP graph-tool subagents (Scout/Verify/Auditor); preserves user `AGENTS.md` | +| agentty | Detected | `~/.agentty/mcp.json` (overridden by `$AGENTTY_MCP_CONFIG`) | Skill in `~/.agentty/skills` (Claude-compatible SKILL.md) | | Sourcegraph Cody | Explicit opt-in | Existing `$CBM_CODY_CONFIG_PATH` | MCP only | For Codex, install keeps only a tiny managed activation pointer in global @@ -892,7 +893,7 @@ src/ main.c Entry point (MCP stdio server + CLI + install/update/config) daemon/ Per-account session coordination, IPC, lifecycle, shared jobs/watchers mcp/ MCP server (17 tools, JSON-RPC 2.0, session detection, auto-index) - cli/ Install/uninstall/update/config (45 client surfaces, hooks, instructions) + cli/ Install/uninstall/update/config (46 client surfaces, hooks, instructions) store/ SQLite graph storage (nodes, edges, traversal, search, Louvain) pipeline/ Multi-pass indexing (structure → definitions → calls → HTTP links → config → tests) cypher/ Cypher query lexer, parser, planner, executor diff --git a/docs/index.html b/docs/index.html index fdfde941e..88480526e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,7 +4,7 @@
- One command configures 45 automatic/conditional client surfaces. Detected automatically (39): + One command configures 46 automatic/conditional client surfaces. Detected automatically (40): Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf, Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands, Cline, Warp, Qwen Code, GitHub Copilot CLI, Factory Droid, Crush, Goose, Mistral Vibe, Grok Build, Qoder CLI, Kimi Code CLI, GitLab Duo CLI, Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Amazon Q Developer IDE, - CodeBuddy Code CLI, IBM Bob Shell, Pochi, Pi, and Oh My Pi (omp). + CodeBuddy Code CLI, IBM Bob Shell, Pochi, Pi, Oh My Pi (omp), and agentty.
Conditional or explicit (6): Continue / cn, Visual Studio, TRAE, Roo Code, IBM Bob IDE,
diff --git a/docs/llms.txt b/docs/llms.txt
index f3c23970b..b0f76c2e6 100644
--- a/docs/llms.txt
+++ b/docs/llms.txt
@@ -12,7 +12,7 @@
- Semantic & similarity edges: SEMANTICALLY_RELATED (vocabulary-mismatch matches) and SIMILAR_TO (MinHash + LSH near-clone / duplicate detection).
- Cross-repo intelligence: CROSS_* edges link nodes across multiple repos indexed in one store; multi-galaxy 3D layout and cross-repo architecture summary.
- Cross-service linking: HTTP route ↔ call-site matching, plus gRPC/GraphQL/tRPC detection and pub/sub channels (EMITS/LISTENS_ON for Socket.IO, EventEmitter, generic buses).
-- Supported agents: 45 automatic/conditional client surfaces (39 automatically detected + 6 conditional/explicit): Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf, Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands, Cline, Warp, Qwen Code, GitHub Copilot CLI, Factory Droid, Crush, Goose, Mistral Vibe, Grok Build, Qoder CLI, Kimi Code CLI, GitLab Duo CLI, Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Continue / cn, Visual Studio, TRAE, Roo Code, Amazon Q Developer IDE, CodeBuddy Code CLI, IBM Bob IDE, IBM Bob Shell, Pochi, Pi, Oh My Pi (omp), and Sourcegraph Cody.
+- Supported agents: 46 automatic/conditional client surfaces (40 automatically detected + 6 conditional/explicit): Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf, Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands, Cline, Warp, Qwen Code, GitHub Copilot CLI, Factory Droid, Crush, Goose, Mistral Vibe, Grok Build, Qoder CLI, Kimi Code CLI, GitLab Duo CLI, Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Continue / cn, Visual Studio, TRAE, Roo Code, Amazon Q Developer IDE, CodeBuddy Code CLI, IBM Bob IDE, IBM Bob Shell, Pochi, Pi, Oh My Pi (omp), agentty, and Sourcegraph Cody.
- Agent profiles: documented custom-agent formats receive Scout (fast/provisional), Verify (default/task-directed), and Auditor (bounded/full verification) definitions. Every direct tier checks exact path/scope coverage with check_index_coverage and falls back to source for flagged gaps; unsafe child-MCP formats use explicit parent handoff. Kiro and Junie use positive-allowlist Scout/Analysis server profiles (7/11 tools); Qoder combines named-server selection with exact tier-specific MCP tool IDs, while Factory uses exact registered IDs without additive whole-server exposure. Foreign Junie aliases are preserved and force parent handoff.
- Performance: Linux kernel (28M LOC, 75K files) full index in 3 minutes → 4.81M nodes, 7.72M edges; Cypher queries in under 1ms.
- Distribution: verified runtime set (native executable plus authenticated release-owned assets); fully static Linux builds are available in the `-portable` archives. Also available through npm, PyPI, Homebrew, Scoop, Winget, Chocolatey, AUR, and `go install`.
diff --git a/pkg/npm/README.md b/pkg/npm/README.md
index c12a2d9c6..d41821a31 100644
--- a/pkg/npm/README.md
+++ b/pkg/npm/README.md
@@ -7,7 +7,7 @@
**The fastest and most efficient code intelligence engine for AI coding agents.** Full-indexes an average repository in milliseconds, the Linux kernel (28M LOC, 75K files) in 3 minutes. Answers structural queries in under 1ms. This npm wrapper downloads, verifies, and caches the selected native runtime set: the executable, its authenticated integration asset, and—when requested—the content-addressed UI pack.
-High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-sitter/) AST analysis across 162 languages — producing a persistent knowledge graph of functions, classes, call chains, HTTP routes, and cross-service links. 17 MCP tools. No hosted service or API key; this package requires Node.js to manage and launch the cached native runtime set. Plug and play across 45 automatic/conditional client surfaces.
+High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-sitter/) AST analysis across 162 languages — producing a persistent knowledge graph of functions, classes, call chains, HTTP routes, and cross-service links. 17 MCP tools. No hosted service or API key; this package requires Node.js to manage and launch the cached native runtime set. Plug and play across 46 automatic/conditional client surfaces.
## Installation
@@ -31,8 +31,8 @@ Restart your agent. Say **"Index this project"** — done.
- **Plug and play** — verified native runtime sets for macOS (arm64/amd64), Linux (arm64/amd64), and Windows (arm64/amd64). No Docker or API keys; Node.js owns package download, cache repair, and launch.
- **162 languages** — vendored tree-sitter grammars compiled into the binary. Nothing to install, nothing that breaks.
- **120x fewer tokens** — 5 structural queries: ~3,400 tokens vs ~412,000 via file-by-file search.
-- **45 supported automatic/conditional client surfaces** — `install` configures the appropriate MCP, durable-context, and documented hook surfaces without widening client permissions.
-- **Detected automatically (39)** — Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf, Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands, Cline, Warp, Qwen Code, GitHub Copilot CLI, Factory Droid, Crush, Goose, Mistral Vibe, Grok Build, Qoder CLI, Kimi Code CLI, GitLab Duo CLI, Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Amazon Q Developer IDE, CodeBuddy Code CLI, IBM Bob Shell, Pochi, Pi, and Oh My Pi (omp).
+- **46 supported automatic/conditional client surfaces** — `install` configures the appropriate MCP, durable-context, and documented hook surfaces without widening client permissions.
+- **Detected automatically (40)** — Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode, Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf, Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands, Cline, Warp, Qwen Code, GitHub Copilot CLI, Factory Droid, Crush, Goose, Mistral Vibe, Grok Build, Qoder CLI, Kimi Code CLI, GitLab Duo CLI, Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Amazon Q Developer IDE, CodeBuddy Code CLI, IBM Bob Shell, Pochi, Pi, Oh My Pi (omp), and agentty.
- **Conditional or explicit (6)** — Continue / cn, Visual Studio, TRAE, Roo Code, IBM Bob IDE, and Sourcegraph Cody. Bob IDE is touched only when `~/.bob/mcp.json` already exists.
- **New documented adapters** — CodeBuddy uses `~/.codebuddy/.mcp.json` while preserving active older files; Bob Shell uses `~/.bob/mcp_settings.json`; Pochi uses the `mcp` section in `~/.pochi/config.jsonc`; Amazon Q Developer IDE defaults to `~/.aws/amazonq/default.json` while preserving either documented alternative.
- **Lifecycle hooks stay conservative** — Kimi uses `UserPromptSubmit`; on macOS/Linux, GitLab Duo gets a fail-open user `SessionStart`, while Devin gets `UserPromptSubmit`, `PostCompaction`, and a deduplicated `SessionStart` when Claude does not already provide it. Qoder, GitLab Duo, Devin, and Factory hooks are withheld on Windows without a documented shell/executor contract. Cline's auto-activating file hooks are withheld because their context output is not reliably consumed, CodeBuddy beta hooks are not auto-installed, and Cursor context hooks remain withheld.
diff --git a/src/cli/agent_clients.c b/src/cli/agent_clients.c
index 4c07a583d..b3b6deb48 100644
--- a/src/cli/agent_clients.c
+++ b/src/cli/agent_clients.c
@@ -76,6 +76,9 @@ static const cbm_agent_client_profile_t agent_profiles[CBM_AGENT_CLIENT_COUNT] =
{CBM_AGENT_CLIENT_OMP, "omp", "Oh My Pi (omp)", CBM_AGENT_STABLE,
CBM_AGENT_CAP_MCP | CBM_AGENT_CAP_SKILL | CBM_AGENT_CAP_AGENT, "omp", agent_install_callback,
agent_remove_callback},
+ {CBM_AGENT_CLIENT_AGENTTY, "agentty", "agentty", CBM_AGENT_STABLE,
+ CBM_AGENT_CAP_MCP | CBM_AGENT_CAP_SKILL, "agentty", agent_install_callback,
+ agent_remove_callback},
};
size_t cbm_agent_client_count(void) {
@@ -601,6 +604,15 @@ int cbm_agent_client_resolve_path(cbm_agent_client_id_t id,
int written = snprintf(path_out, path_out_size, "%s", options->cody_config_path);
return written >= 0 && (size_t)written < path_out_size ? 0 : -1;
}
+ case CBM_AGENT_CLIENT_AGENTTY: {
+ char override[1024];
+ if (cbm_agent_env_config_override("AGENTTY_MCP_CONFIG", options->home_dir, override,
+ sizeof(override))) {
+ int written = snprintf(path_out, path_out_size, "%s", override);
+ return written >= 0 && (size_t)written < path_out_size ? 0 : -1;
+ }
+ return agent_join_path(path_out, path_out_size, options->home_dir, ".agentty/mcp.json");
+ }
default:
return -1;
}
@@ -663,6 +675,8 @@ static int agent_client_marker_path(cbm_agent_client_id_t id,
return agent_join_path(path_out, path_out_size, options->home_dir, ".omp/agent");
case CBM_AGENT_CLIENT_PI:
return agent_join_path(path_out, path_out_size, options->home_dir, ".pi/agent");
+ case CBM_AGENT_CLIENT_AGENTTY:
+ return agent_join_path(path_out, path_out_size, options->home_dir, ".agentty");
default:
return 1;
}
@@ -1466,6 +1480,7 @@ static bool agent_json_client(cbm_agent_client_id_t id) {
case CBM_AGENT_CLIENT_IBM_BOB_SHELL:
case CBM_AGENT_CLIENT_POCHI:
case CBM_AGENT_CLIENT_SOURCEGRAPH_CODY:
+ case CBM_AGENT_CLIENT_AGENTTY:
return true;
case CBM_AGENT_CLIENT_CONTINUE:
case CBM_AGENT_CLIENT_PI:
@@ -1489,6 +1504,41 @@ int cbm_agent_client_install_mcp(cbm_agent_client_id_t id, const char *config_pa
: CBM_AGENT_EDIT_NOT_APPLICABLE;
}
+bool cbm_agent_env_config_override(const char *env_name, const char *home_dir, char *resolved,
+ size_t resolved_size) {
+ if (!env_name || !resolved || resolved_size == 0U) {
+ return false;
+ }
+ char value[1024];
+ const char *configured = getenv(env_name);
+ if (!configured || configured[0] == '\0' || strlen(configured) >= sizeof(value)) {
+ return false;
+ }
+ snprintf(value, sizeof(value), "%s", configured);
+ /* Expand a leading ~ against the home directory, matching the
+ * CLAUDE_CONFIG_DIR / GROK_HOME handling in cli.c. */
+ if (value[0] == '~' && (value[1] == '\0' || value[1] == '/')) {
+ if (!home_dir || home_dir[0] == '\0') {
+ return false;
+ }
+ char expanded[1024];
+ int written = value[1] == '\0'
+ ? snprintf(expanded, sizeof(expanded), "%s", home_dir)
+ : snprintf(expanded, sizeof(expanded), "%s%s", home_dir, value + 1);
+ if (written < 0 || (size_t)written >= sizeof(expanded) ||
+ (size_t)written >= resolved_size) {
+ return false;
+ }
+ snprintf(resolved, resolved_size, "%s", expanded);
+ return true;
+ }
+ if (strlen(value) >= resolved_size) {
+ return false;
+ }
+ snprintf(resolved, resolved_size, "%s", value);
+ return true;
+}
+
int cbm_agent_client_remove_mcp(cbm_agent_client_id_t id, const char *config_path,
const char *binary_path) {
if (!config_path || config_path[0] == '\0' || !binary_path || binary_path[0] == '\0' ||
diff --git a/src/cli/agent_clients.h b/src/cli/agent_clients.h
index ccf9f81a1..ef1a62ede 100644
--- a/src/cli/agent_clients.h
+++ b/src/cli/agent_clients.h
@@ -32,6 +32,7 @@ typedef enum {
CBM_AGENT_CLIENT_PI,
CBM_AGENT_CLIENT_SOURCEGRAPH_CODY,
CBM_AGENT_CLIENT_OMP,
+ CBM_AGENT_CLIENT_AGENTTY,
CBM_AGENT_CLIENT_COUNT
} cbm_agent_client_id_t;
@@ -115,6 +116,13 @@ int cbm_agent_client_install_mcp(cbm_agent_client_id_t id, const char *config_pa
int cbm_agent_client_remove_mcp(cbm_agent_client_id_t id, const char *config_path,
const char *binary_path);
+/* Shared env-override resolution for clients whose documented config path can
+ * be redirected by an environment variable (CLAUDE_CONFIG_DIR, GROK_HOME,
+ * VIBE_HOME, AGENTTY_MCP_CONFIG). Expands a leading ~ against the home
+ * directory; returns false when the variable is unset or empty. */
+bool cbm_agent_env_config_override(const char *env_name, const char *home_dir, char *resolved,
+ size_t resolved_size);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/cli/cli.c b/src/cli/cli.c
index 93df2dabe..f3698d463 100644
--- a/src/cli/cli.c
+++ b/src/cli/cli.c
@@ -9646,6 +9646,10 @@ static void install_agent_client_registry(const char *home, const char *binary_p
install_pi_durable_context(home, binary_path, force, dry_run);
} else if (profile->id == CBM_AGENT_CLIENT_OMP) {
install_omp_durable_context(®istry, force, dry_run);
+ } else if (profile->id == CBM_AGENT_CLIENT_AGENTTY) {
+ char skills_dir[CLI_BUF_1K];
+ snprintf(skills_dir, sizeof(skills_dir), "%s/.agentty/skills", home);
+ install_agent_skill(profile->display_name, skills_dir, force, dry_run);
}
}
}
@@ -10808,6 +10812,10 @@ const char *cbm_cli_clients_token_for_testing(size_t index) {
void cbm_cli_set_client_selection_for_testing(const char *spec) {
g_client_selection = spec;
}
+bool cbm_cli_selects_registry_client_for_testing(const char *stable_id) {
+ const cbm_agent_client_profile_t *profile = cbm_agent_client_by_stable_id(stable_id);
+ return profile && cli_clients_selects_registry_client(g_client_selection, profile->id);
+}
#endif
/* ── Subcommand: install ──────────────────────────────────────── */
@@ -12135,6 +12143,10 @@ static void uninstall_agent_client_registry(const char *home, bool dry_run) {
uninstall_pi_durable_context(home, dry_run);
} else if (profile->id == CBM_AGENT_CLIENT_OMP) {
uninstall_omp_durable_context(®istry, dry_run);
+ } else if (profile->id == CBM_AGENT_CLIENT_AGENTTY) {
+ char skills_dir[CLI_BUF_1K];
+ snprintf(skills_dir, sizeof(skills_dir), "%s/.agentty/skills", home);
+ uninstall_agent_skill(profile->display_name, skills_dir, dry_run);
}
}
}
diff --git a/src/cli/cli.h b/src/cli/cli.h
index e5e10417c..0f281a687 100644
--- a/src/cli/cli.h
+++ b/src/cli/cli.h
@@ -231,6 +231,9 @@ bool cbm_cli_clients_apply_selection_for_testing(const char *spec, cbm_detected_
size_t cbm_cli_clients_count_for_testing(void);
const char *cbm_cli_clients_token_for_testing(size_t index);
void cbm_cli_set_client_selection_for_testing(const char *spec);
+/* True when the current --clients selection includes the registry client id
+ * (registry-backed path of the same selector). */
+bool cbm_cli_selects_registry_client_for_testing(const char *stable_id);
#endif
#ifdef CBM_CLI_ENABLE_TEST_API
diff --git a/src/main.c b/src/main.c
index 0beb974a5..00ced7c9b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1124,7 +1124,7 @@ static void print_help(void) {
printf(" --ui=false Disable HTTP graph visualization (persisted)\n");
printf(" --port=N Set UI port (default 9749, persisted)\n");
printf(" --tool-profile=analysis|scout Expose a restricted inspection surface\n");
- printf("\nSupported automatic/conditional client surfaces (45):\n");
+ printf("\nSupported automatic/conditional client surfaces (46):\n");
printf(" Claude Code, Codex CLI, Gemini CLI, Zed, OpenCode,\n");
printf(" Antigravity, Aider, KiloCode, VS Code, Cursor, Windsurf,\n");
printf(" Augment / Auggie, OpenClaw, Kiro, Junie, Hermes, OpenHands,\n");
@@ -1133,7 +1133,7 @@ static void print_help(void) {
printf(" Rovo Dev CLI, Amp, Devin CLI / Local, Tabnine, Continue / cn,\n");
printf(" Visual Studio, TRAE, Roo Code, Amazon Q Developer IDE,\n");
printf(" CodeBuddy Code CLI, IBM Bob IDE, IBM Bob Shell, Pochi, Pi,\n");
- printf(" Sourcegraph Cody, Oh My Pi (omp)\n");
+ printf(" Sourcegraph Cody, Oh My Pi (omp), agentty\n");
printf(" Conditional/explicit targets are changed only when their documented\n");
printf(" platform, marker, or explicit existing config path is present.\n");
printf(" Manual/UI MCP boundaries: Qodo, Warp, JetBrains AI/ACP, Replit,\n");
diff --git a/tests/test_agent_clients.c b/tests/test_agent_clients.c
index df8515e73..c30b8af48 100644
--- a/tests/test_agent_clients.c
+++ b/tests/test_agent_clients.c
@@ -162,7 +162,7 @@ TEST(agent_clients_registry_is_stable_and_callback_driven) {
"qoder", "kimi", "gitlab-duo", "rovo-dev", "amp", "devin",
"tabnine", "continue", "visual-studio", "trae", "roo-code", "amazon-q",
"codebuddy", "ibm-bob-ide", "ibm-bob-shell", "pochi", "pi", "sourcegraph-cody",
- "omp",
+ "omp", "agentty",
};
static const uint32_t expected_capabilities[] = {
CBM_AGENT_CAP_MCP | CBM_AGENT_CAP_SKILL | CBM_AGENT_CAP_AGENT | CBM_AGENT_CAP_HOOK,
@@ -184,6 +184,7 @@ TEST(agent_clients_registry_is_stable_and_callback_driven) {
CBM_AGENT_CAP_INSTRUCTIONS | CBM_AGENT_CAP_SKILL,
CBM_AGENT_CAP_MCP,
CBM_AGENT_CAP_MCP | CBM_AGENT_CAP_SKILL | CBM_AGENT_CAP_AGENT,
+ CBM_AGENT_CAP_MCP | CBM_AGENT_CAP_SKILL,
};
ASSERT_EQ(cbm_agent_client_count(), CBM_AGENT_CLIENT_COUNT);
ASSERT_EQ(CBM_AGENT_CLIENT_COUNT, sizeof(expected) / sizeof(expected[0]));
diff --git a/tests/test_cli.c b/tests/test_cli.c
index a77abc0a3..eae34bce7 100644
--- a/tests/test_cli.c
+++ b/tests/test_cli.c
@@ -16,6 +16,7 @@
#include