| Crates.io | harness-locate |
| lib.rs | harness-locate |
| version | 0.5.0 |
| created_at | 2025-12-28 14:11:54.227658+00 |
| updated_at | 2026-01-20 18:33:35.645794+00 |
| description | Cross-platform library for configuration, path discovery and MCP server management for agentic code harnesses (Claude Code, OpenCode, Goose, AMP Code, Copilot CLI) |
| homepage | |
| repository | https://github.com/neiii/harness-barn |
| max_upload_size | |
| id | 2008860 |
| size | 369,382 |
Cross-platform harness path discovery for AI coding CLI tools.
use harness_locate::{Harness, HarnessKind};
// Check all installed harnesses
for harness in Harness::installed()? {
println!("{} is installed", harness.kind());
}
# Ok::<(), harness_locate::Error>(())
use harness_locate::{Harness, HarnessKind, Scope};
let harness = Harness::locate(HarnessKind::ClaudeCode)?;
let config_dir = harness.config(&Scope::Global)?;
println!("Config at: {}", config_dir.display());
# Ok::<(), harness_locate::Error>(())
use harness_locate::{Harness, HarnessKind};
use harness_locate::mcp::{McpServer, StdioMcpServer};
let server = McpServer::Stdio(StdioMcpServer {
command: "npx".to_string(),
args: vec!["-y".to_string(), "@modelcontextprotocol/server-filesystem".to_string()],
env: Default::default(),
cwd: None,
enabled: true,
timeout_ms: None,
});
// Check compatibility
let harness = Harness::new(HarnessKind::OpenCode);
if harness.supports_mcp_server(&server) {
println!("Server is supported");
}
| Harness | Skills | Commands | MCP | Rules | Agents |
|---|---|---|---|---|---|
| Claude Code | Yes | Yes | Yes | Yes | Yes |
| OpenCode | Yes | Yes | Yes | Yes | Yes |
| Goose | Yes | No | Yes | Yes | No |
| AMP Code | Yes | Yes | Yes | Yes | No |
| Copilot CLI | Yes | No | Yes | Yes | Yes |
| Crush | Yes | No | Yes | Yes | No |
Different harnesses use different directory names. Use HarnessKind::directory_names() to query programmatically:
| Resource | OpenCode | Claude Code | Goose | AMP Code | Copilot CLI | Crush |
|---|---|---|---|---|---|---|
| Skills | skill/ |
skills/ |
skills/ |
skills/ |
skills/ |
skills/ |
| Commands | command/ |
commands/ |
- | commands/ |
- | - |
| Agents | agent/ |
agents/ |
- | - | agents/ |
- |
| Plugins | plugin/ |
plugins/ |
- | - | - | - |
Note: Rules are stored at the root level, not in a named subdirectory.
Note: OpenCode uses singular names; all others use plural.
Note: Copilot CLI uses .github/ for project-scoped agents and rules.
For directory-based resources (skills, commands):
path - Directory locationexists - Whether directory existsstructure - Flat or Nested layoutfile_format - Expected file formatSkills use nested structure (one subdirectory per skill):
~/.config/opencode/skill/
my-skill/
SKILL.md
Commands use flat structure (files directly in directory):
~/.config/opencode/command/
my-command.md
another-command.md
This pattern applies across all harnesses that support the resource type.
For file-based configuration (MCP):
file - Config file pathkey_path - JSON pointer to relevant sectionformat - JSON, YAML, etc.MIT