tamarillo — coding harness inspectiontheta-spec
and theta were created).
~400K public GitHub repositories containing configuration files for AI coding
assistants (harnesses) were fetched. ~400K was the count at time of collection
after exhaustively searching GitHub public repos[†].
The process to get the data is pretty straightforward
filter criteria: PATTERNS per harness were defined (explained in detail in appendix A)repo search: Code searches on GitHub's REST API filtered against harness configuration filesenriching stage: GitHub's GraphQL API was used to enrich files with commit count, file bytes, creation date, etc..cursorrules file signals that someone set it up, not necessarily that Cursor is
daily used). This is a lower bound on harness adoption.
[†] the number of repositories fetched does include a negligible amount of forks of already captured repos (<0.1%). This were excluded for the analysis.
x-day window, filtered by the date each harness config format became publicly available.mcp.json MCP
tool configuration files.
Every harness exposes a different set of configuration surfaces. As the ecosystem evolves and
matures, a certain degree of consistency and convergence is seen. That is, many harnesses share configurations
because at the end of the day they share functionality, or expose functionally equivalent behavior that is configured
similarly.
CLAUDE.md, .cursorrules, copilot-instructions.md, HERMES.md, SOUL.md, AGENTS.md. One per repo, usually at root..cursor/rules/*.mdc, .github/instructions/*.instructions.md..claude/agents/*.md, .codex/agents/*.toml.SKILL.md inside a skills/ directory..github/prompts/*.prompt.md, .continue/prompts/, .pi/prompts/..windsurf/workflows/*.md, .clinerules/workflows/*.md..mcp.json, .vscode/mcp.json, .cursor/mcp.json, .codex/mcp.json..cursor/hooks.json, .windsurf/hooks.json, .github/hooks/*.json, .codex/hooks.json..claude-plugin/plugin.json, .cursor-plugin/plugin.json, .opencode/plugins/..aiderignore, .cursorignore, .codeiumignore.config.yaml, settings.json, MEMORY.md, USER.md, model selection, etc..claude/commands/*.md, .opencode/commands/*.md.| full_name | n_files | harnesses_in | surfaces_in | stars | language | owner_type |
|---|---|---|---|---|---|---|
| tomevault-io/gemini-extensions | 4585 | rest | plugin, system_prompt | 0 | Organization | |
| Brmbobo/Web2podcast | 4398 | claude, rest | agent, system_prompt, tool_mcp | 1 | Python | User |
| tomevault-io/cursor-plugins | 3704 | cursor | rule | 0 | Organization | |
| Nelsonmbigili/Replication_MigrateLib | 2584 | copilot | prompt | 0 | HTML | User |
| alpgul/Cursorrules-Database | 2056 | cursor | rule, system_prompt | 1 | TypeScript | User |
| netbarros/psique | 1523 | codex, rest | skill, system_prompt | 6 | JavaScript | User |
| tomevault-io/copilot-plugins | 1513 | copilot | system_prompt | 0 | Organization | |
| ZTech-Inc/ZTech_Agents | 1431 | hermes, rest | settings, system_prompt | 0 | Python | Organization |
| engremran07/gsmvault | 1151 | claude, codex, copilot, rest | agent, legacy, prompt, rule, settings, skill, system_prompt | 0 | Python | User |
| udbfd68-cell/AURION-APP | 1125 | claude, codex, hermes, rest | settings, skill, system_prompt | 0 | Python | User |
| blacktop/ipsw-diffs | 1087 | hermes, rest | settings, system_prompt | 687 | User | |
| kohebth/agent-skill-sets | 1058 | claude, rest | skill | 0 | Python | User |
| michellab/paramfit-tests | 1057 | cursor | rule | 0 | Roff | Organization |
| a5c-ai/babysitter | 1040 | claude, codex, cursor, rest | agent, other, plugin, settings, system_prompt | 585 | JavaScript | Organization |
| fabioeducacross/DesignSystem-Vuexy | 972 | claude, copilot, cursor, rest | skill, system_prompt | 0 | Python | User |
| nguoikhongten02022005-cell/doan3-webquanlynhahang | 957 | claude, codex, copilot | agent, skill, system_prompt | 0 | Python | User |
| mdegans/agora-agents | 936 | hermes | system_prompt | 0 | Rust | User |
| harborgrid-justin/white-cross | 874 | claude, rest | agent, system_prompt | 1 | TypeScript | User |
| HIDORAKAI002/ai-workspace-archive | 853 | claude, codex, copilot, cursor, hermes, rest | agent, ignore, other, plugin, prompt, rule, settings, system_prompt, tool_mcp | 7 | TypeScript | User |
| ewail/FreeMat | 826 | cursor, hermes | rule, settings | 9 | HTML | User |
| Hariharahari/SEL | 823 | rest | system_prompt | 0 | User | |
| Hariharahari/Agents | 822 | rest | system_prompt | 0 | User | |
| agency-black/Blackmind | 791 | claude, codex, rest | skill, system_prompt, tool_mcp | 0 | Python | Organization |
| openclaw/skills | 791 | claude, codex, copilot, hermes, rest | other, plugin, prompt, rule, settings, system_prompt, tool_mcp | 4208 | Python | Organization |
| rudironsoni/Synaxis | 754 | claude, codex, copilot, cursor, rest | ignore, legacy, prompt, rule, settings, skill, system_prompt, tool_mcp | 2 | C# | User |
[20 KB, 5 MB] with uncertainty estimated via bootstrap (200 resamples of
the repos, not the CCDF points — because CCDF points are correlated
order statistics). The results show a consistent α amongst harnesses. The harness agnostic
α≈1.3 describes a Pareto-ish tailed distribution.
This speaks again to the pressenece of power laws in software and the
preferential attachment dynamics
on harness configuration files.commit_count per file indicates how many times each config file was
touched. The following can be seen
| harness | n | P25 | P50 | P75 | P90 | P95 | P99 |
|---|---|---|---|---|---|---|---|
| all adopters | 396048 | 0 | 0 | 1 | 6 | 26 | 692 |
| claude | 121744 | 0 | 0 | 1 | 4 | 20 | 505 |
| cursor | 62402 | 0 | 0 | 1 | 5 | 24 | 670 |
| codex | 61814 | 0 | 0 | 2 | 21 | 125 | 3839 |
| copilot | 58576 | 0 | 0 | 1 | 5 | 23 | 994 |
| hermes | 49204 | 0 | 0 | 3 | 22 | 94 | 1841 |
| rest | 115065 | 0 | 0 | 0 | 5 | 22 | 692 |
/search/code. GitHub caps any single query at 1000
results, queries were therefore adapted to be size-sharded by file byteSize until every shard
returns under that cap. The output is one row per matched (repo, file) pair
carrying full name, harness, label, path, and the blob SHA.Repository query per repo to pull stars, forks, primary language, owner type
(User or Organization), createdAt, pushedAt, default-branch commit total,
topics and license.Blob.byteSize
plus the most recent commit, yielding
per-file size, last_commit_date, and commit_count.repo_created_at (the date the
repository itself was created on GitHub) anchors every cumulative and rolling chart
— rolling share, the two absolute-share stackplots (config-file anchor and product
launch anchor), the Codex-vs-Claude ratio chart, and the surface-category
evolution. Each curve is clipped at the harness's HARNESS_RELEASE
(config-file date) or HARNESS_LAUNCH (product-launch date) so the cumulative
count never credits a harness for repos that were created before it existed.
last_commit_date (the most recent commit touching a specific config file) anchors
the per-file recency and churn views — push recency, alive-share, config churn —
falling back to repo_created_at when GraphQL does not return a path-scoped
commit.
~/.cursor/, ~/.claude/, ~/.codex/) are out of reach.
Every curve is a lower bound on real adoption..cursorrules proves
that someone set Cursor up at least once. Whether the harness is still being
used daily is not observable from the file's existence.filename:MEMORY.md matches a Hermes memory store and an unrelated
MEMORY.md in some other repo equally; harness attribution is
pattern matched, not verified through reading and analyzing content./search/code sweep. Each row is one
query, the harness + label pair determines how the found file is
classified. Content-grep patterns (*-content) match keyword presence
inside files, not filenames.
Data collected: 2025-05-05. Forks and templates are excluded.
Two date columns are recorded per harness. Config-file release is when the
harness's specific config file format became usable in repositories — that is the
date used in the rolling-share and cumulative charts. Product launch is when
the harness product itself first became publicly available, which can be much
earlier. For example, Cursor launched ~March 2023 but .cursorrules only appeared
in April 2024. Copilot has been around since June 2021 but copilot-instructions.md
only appeared in September 2024. The methodology section discusses why the
config-file date is the cleaner signal for the rolling-share charts, and the
product-launch chart below mirrors the catch-up chart against the launch dates..aider.conf.yml) — PyPI v0.5.0 (source)
| label | query |
|---|---|
config-yml | filename:.aider.conf.yml |
aiderignore | filename:.aiderignore |
model-settings | filename:.aider.model.settings.yml |
model-metadata | filename:.aider.model.metadata.json |
conventions-md | filename:CONVENTIONS.md |
AmazonQ.md) — agent mode (source)
| label | query |
|---|---|
system-prompt | filename:AmazonQ.md |
rules | filename:.md path:.amazonq/rules |
config | filename:settings.json path:.amazonq |
mcp | filename:mcp.json path:.amazonq |
agents | filename:.json path:.amazonq/cli-agents |
prompts | filename:.md path:.amazonq/prompts |
| label | query |
|---|---|
guidelines | filename:.augment-guidelines |
rules | filename:.md path:.augment/rules |
skills | filename:SKILL.md path:.augment/skills |
commands | filename:.md path:.augment/commands |
settings | filename:settings.json path:.augment |
plugin | filename:plugin.json path:.augment-plugin |
marketplace | filename:marketplace.json path:.augment-plugin |
augmentignore | filename:.augmentignore |
CLAUDE.md) — research preview (source)
| label | query |
|---|---|
system-prompt | filename:CLAUDE.md |
settings | filename:settings.json path:.claude |
settings-local | filename:settings.local.json path:.claude |
rules | filename:.md path:.claude/rules |
agents | filename:.md path:.claude/agents |
commands | filename:.md path:.claude/commands |
skills | filename:SKILL.md path:.claude/skills |
output-styles | filename:.md path:.claude/output-styles |
loop | filename:loop.md path:.claude |
plugin | filename:plugin.json path:.claude-plugin |
.clinerules/) — v2.x (source)
| label | query |
|---|---|
clinerules | filename:.clinerules |
clineignore | filename:.clineignore |
roomodes | filename:.roomodes |
roorules | filename:.md path:.roo/rules |
roo-mcp | filename:mcp.json path:.roo |
rooignore | filename:.rooignore |
skills | filename:SKILL.md path:.cline/skills |
rules-dir | filename:.md path:.clinerules |
roo-skills | filename:SKILL.md path:.roo/skills |
clinerules-workflows | path:.clinerules/workflows |
AGENTS.md) — open-sourced (source)
| label | query |
|---|---|
config | filename:config.toml path:.codex |
agents-override | filename:AGENTS.override.md |
agents-toml | filename:.toml path:.codex/agents |
rules-starlark | filename:.rules path:.codex/rules |
hooks | filename:hooks.json path:.codex |
mcp | filename:mcp.json path:.codex |
skills | filename:SKILL.md path:.codex/skills |
config.json) — VS Code extension first public (source)
| label | query |
|---|---|
config-yaml | filename:config.yaml path:.continue |
config-json | filename:config.json path:.continue |
rules | filename:.continuerules |
rules-dir | filename:.md path:.continue/rules |
prompts | filename:.md path:.continue/prompts |
prompts-legacy | filename:.prompt path:.continue/prompts |
continueignore | filename:.continueignore |
skills | filename:SKILL.md path:.continue/skills |
mcp-servers | filename:.json path:.continue/mcpServers |
settings | filename:settings.json path:.continue |
copilot-instructions.md) — VS Code 1.94 (source)
| label | query |
|---|---|
system-prompt | filename:copilot-instructions.md |
instructions | filename:instructions.md path:.github/instructions |
agents | filename:.agent.md path:.github |
skills | filename:SKILL.md path:.github/skills |
prompts | filename:.prompt.md |
hooks | filename:.json path:.github/hooks |
setup-steps | filename:copilot-setup-steps.yml path:.github/workflows |
.cursorrules) — v0.32.x changelog (source)
| label | query |
|---|---|
rules-md | filename:.md path:.cursor/rules |
rules-mdc | filename:.mdc |
cursorrules | filename:.cursorrules |
agents | filename:.md path:.cursor/agents |
mcp | filename:mcp.json path:.cursor |
hooks | filename:hooks.json path:.cursor |
skills | filename:SKILL.md path:.cursor/skills |
cursorignore | filename:.cursorignore |
plugin | filename:plugin.json path:.cursor-plugin |
marketplace-manifest | filename:marketplace.json path:.cursor-plugin |
GEMINI.md) — CLI launch (source)
| label | query |
|---|---|
system-prompt | filename:GEMINI.md |
settings | filename:settings.json path:.gemini |
geminiignore | filename:.geminiignore |
commands | filename:.toml path:.gemini/commands |
skills | filename:SKILL.md path:.gemini/skills |
agents | filename:.md path:.gemini/agents |
policies | filename:.toml path:.gemini/policies |
extension | filename:gemini-extension.json |
| label | query |
|---|---|
instructions | filename:.goosehints |
skills | filename:SKILL.md path:.goose/skills |
agents | filename:.md path:.goose/agents |
recipes | filename:.yaml path:.goose/recipes |
recipes-json | filename:.json path:.goose/recipes |
gooseignore | filename:.gooseignore |
SOUL.md) — initial release (source)
SOUL.mdoriginated in the openclaw/hermes lineage (soul.md, openclaw docs) and is not documented as a config file by any other harness.MEMORY.mdandUSER.mdare hermes conventions but the filenames are generic. Without content analysis, matches cannot be distinguished from unrelated documentation files that share the same name.
| label | query |
|---|---|
system-prompt | filename:HERMES.md |
system-prompt-dot | filename:.hermes.md |
soul | filename:SOUL.md |
memory | filename:MEMORY.md |
user-profile | filename:USER.md |
cli-config | filename:cli-config.yaml |
cli-config-example | filename:cli-config.yaml.example |
plans | path:.hermes/plans extension:md |
skills | filename:SKILL.md path:.hermes/skills |
personalities | path:.hermes/personalities extension:md |
| label | query |
|---|---|
junie-agents-md | filename:AGENTS.md path:.junie |
ai-rules | filename:.md path:.aiassistant/rules |
aiignore | filename:.aiignore |
junie-guidelines | filename:guidelines.md path:.junie |
noai | filename:.noai |
review-guidelines | filename:review-guidelines.md path:.ai |
review-rules | filename:review-rules.md path:.ai |
review-guidelines-root | filename:REVIEW_GUIDELINES.md |
opencode.json) — initial release (source)
| label | query |
|---|---|
config-json | filename:opencode.json |
config-jsonc | filename:opencode.jsonc |
agents | filename:.md path:.opencode/agents |
skills | filename:SKILL.md path:.opencode/skills |
commands | filename:.md path:.opencode/commands |
tools | path:.opencode/tools |
plugins | path:.opencode/plugins |
package-json | filename:package.json path:.opencode |
PI.md) — initial release (source)
| label | query |
|---|---|
system-prompt | filename:SYSTEM.md path:.pi |
append-system-prompt | filename:APPEND_SYSTEM.md path:.pi |
settings | filename:settings.json path:.pi |
skills | filename:SKILL.md path:.pi/skills |
extensions | path:.pi/extensions |
prompts | filename:.md path:.pi/prompts |
shallow configuration surface — limited pattern coverage.
| label | query |
|---|---|
config | filename:.tabnine.json |
rules | filename:tabnine-rules.json |
.trae/rules/) — v1.0.0 beta (source)
| label | query |
|---|---|
rules | filename:.md path:.trae/rules |
mcp | filename:mcp.json path:.trae |
skills | filename:SKILL.md path:.trae/skills |
ignore | filename:.ignore path:.trae |
.windsurfrules) — Wave 1 launch (source)
| label | query |
|---|---|
rules | filename:.md path:.windsurf/rules |
windsurfrules | filename:.windsurfrules |
skills | filename:SKILL.md path:.windsurf/skills |
workflows | filename:.md path:.windsurf/workflows |
hooks | filename:hooks.json path:.windsurf |
codeiumignore | filename:.codeiumignore |
deployment | filename:windsurf_deployment.yaml |
tamarillo — coding harness inspection