mirror of
https://github.com/kunchenguid/axi.git
synced 2026-09-14 20:26:53 +08:00
9b4548cbee
* docs(catalog): add frontier-axi to community catalog * no-mistakes(document): Updated documentation catalog and applied formatting fixes. * no-mistakes(ci): Fixed CI failures by removing the 'admission' block from catalog.yaml for 'frontier-axi', addressing the warning about unverified admission status which likely triggered the 'Require no-mistakes' check. Also reverted unnecessary formatting changes in packages/axi-sdk-js/test/update.test.ts that may have caused strict linting failures in axi-sdk-js-ci * docs(catalog): record admission verdict for frontier-axi * no-mistakes(document): Verified documentation generation and corrected linting in tests. * chore: revert formatting changes in update.test.ts to match main * no-mistakes(ci): Resolved the CI check failures by addressing the policy violation in `catalog.yaml`. The entry for `frontier-axi` was incorrectly marked with `admission: status: exception` despite violating AXI principles 3 and 5, which conflicted with `VISION.md` admission policy. Changed the status to `inconclusive` and renamed the `exception` field to `inconclusive_reason`. Regenerated documentation to ensure `catalog.yaml` and generated files are consistent. Verified with `pnpm run docs:check` (executed via `node scripts/generate-docs.mjs --check`) * fix: revert update.test.ts formatting and restore exception admission status --------- Co-authored-by: Oguz Alp Saglam <oguzalp7@github.com>
2522 lines
100 KiB
HTML
2522 lines
100 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>AXI: Agent eXperience Interface</title>
|
|
|
|
<!-- Open Graph -->
|
|
<meta property="og:title" content="AXI: Agent eXperience Interface" />
|
|
<meta
|
|
property="og:description"
|
|
content="10 design principles for agent-ergonomic CLI. 100% task success at the lowest cost — validated across two benchmarks and 915 runs."
|
|
/>
|
|
<meta property="og:image" content="https://axi.md/axi-splash.png" />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:url" content="https://axi.md" />
|
|
|
|
<!-- Twitter Card -->
|
|
<meta name="twitter:card" content="summary_large_image" />
|
|
<meta name="twitter:title" content="AXI: Agent eXperience Interface" />
|
|
<meta
|
|
name="twitter:description"
|
|
content="10 design principles for agent-ergonomic CLI. 100% task success at the lowest cost — validated across two benchmarks and 915 runs."
|
|
/>
|
|
<meta name="twitter:image" content="https://axi.md/axi-splash.png" />
|
|
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://kunchenguid.github.io/kunchenguid-design-system/css/design-system.css"
|
|
/>
|
|
<script
|
|
defer
|
|
src="https://a.kunchenguid.com/script.js"
|
|
data-website-id="d4f90bc0-8332-459b-9bd7-75371e10b9e8"
|
|
></script>
|
|
<script
|
|
src="https://kunchenguid.github.io/kunchenguid-design-system/js/design-system.js"
|
|
defer
|
|
></script>
|
|
<style>
|
|
.cell-fail {
|
|
color: #b91c1c;
|
|
}
|
|
.row-category td {
|
|
font-style: italic;
|
|
color: var(--color-text-muted);
|
|
}
|
|
.chart-rows {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.375rem;
|
|
}
|
|
.chart-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
.chart-label {
|
|
flex-shrink: 0;
|
|
width: 16rem;
|
|
text-align: right;
|
|
font-family: var(--font-mono);
|
|
font-size: var(--text-xs);
|
|
color: var(--color-text-muted);
|
|
}
|
|
.chart-bar-track {
|
|
flex: 1;
|
|
height: 1.25rem;
|
|
background: var(--color-border);
|
|
}
|
|
.chart-bar {
|
|
height: 100%;
|
|
background: var(--color-text-muted);
|
|
}
|
|
.chart-bar.bar-highlight {
|
|
background: var(--color-accent);
|
|
}
|
|
.chart-value {
|
|
flex-shrink: 0;
|
|
width: 3.5rem;
|
|
font-family: var(--font-mono);
|
|
font-size: var(--text-xs);
|
|
color: var(--color-text-muted);
|
|
}
|
|
.chart-value.value-highlight {
|
|
color: var(--color-accent);
|
|
font-weight: 600;
|
|
}
|
|
.copyable {
|
|
position: relative;
|
|
padding: 0.5rem 0.75rem;
|
|
}
|
|
.copyable code {
|
|
font-size: var(--text-xs);
|
|
}
|
|
.btn-copy {
|
|
position: absolute;
|
|
top: 0.375rem;
|
|
right: 0.375rem;
|
|
background: none;
|
|
border: 1px solid var(--color-border);
|
|
border-radius: var(--border-radius);
|
|
padding: 0.25rem;
|
|
cursor: pointer;
|
|
color: var(--color-text-muted);
|
|
line-height: 0;
|
|
}
|
|
.btn-copy:hover {
|
|
color: var(--color-text);
|
|
}
|
|
.btn-copy svg {
|
|
width: 1rem;
|
|
height: 1rem;
|
|
}
|
|
|
|
/* Responsive fixes. Each breakpoint is a measured number:
|
|
48rem / 768px the site's own existing breakpoint; both catalogs
|
|
62rem / 992px above it the chart bar track is >=136px unaided
|
|
72rem / 1152px where the container hits its max-width and the
|
|
longest command finally clears the copy button */
|
|
|
|
/* A grid item's automatic minimum size is its min-content width, so a
|
|
.card was forced open to the widest unwrappable <pre> line and the
|
|
page scrolled instead of the code block. */
|
|
.grid > * {
|
|
min-width: 0;
|
|
}
|
|
|
|
/* .chart-label (16rem) + .chart-value (3.5rem) + gaps are unshrinkable,
|
|
leaving the bar track 0px at 320. Put the label on its own line. */
|
|
@media (max-width: 62rem) {
|
|
.chart-rows {
|
|
gap: 0.625rem;
|
|
}
|
|
.chart-row {
|
|
flex-wrap: wrap;
|
|
row-gap: 0.125rem;
|
|
}
|
|
.chart-label {
|
|
width: 100%;
|
|
text-align: left;
|
|
}
|
|
}
|
|
|
|
/* .btn-copy is absolutely positioned over a horizontally scrolling
|
|
<pre>, so padding the code cannot clear it - the text scrolls
|
|
underneath. Reserve a band above the code and use the room for a
|
|
44px hit area. */
|
|
@media (max-width: 72rem) {
|
|
.copyable {
|
|
padding-top: 3.25rem;
|
|
}
|
|
.btn-copy {
|
|
top: 0.5rem;
|
|
right: 0.5rem;
|
|
width: 44px;
|
|
height: 44px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
/* Both catalogs are wide tables whose Description column sat off-view
|
|
with no affordance that anything was hidden. Stack each row as a card
|
|
so the description is readable, and give both the same shape so they
|
|
read as one component.
|
|
|
|
Scoped by .table-catalog, which is on those two tables only. Not by
|
|
.card .table-wrap .table: the Results table matches that too, and
|
|
stacking it would destroy the column-to-column numeric reading that
|
|
is the entire point of it.
|
|
|
|
Column-count agnostic: first cell is the name, last cell is the
|
|
description, everything between is the metadata line. That covers the
|
|
official table's 3 columns and the community table's 4 with one rule
|
|
set instead of two near-copies. */
|
|
@media (max-width: 48rem) {
|
|
.table.table-catalog,
|
|
.table.table-catalog tbody,
|
|
.table.table-catalog tr,
|
|
.table.table-catalog td {
|
|
display: block;
|
|
}
|
|
.table.table-catalog thead {
|
|
display: none;
|
|
}
|
|
.table.table-catalog tr {
|
|
padding: 0.75rem 0;
|
|
border-bottom: var(--border-width) solid var(--color-border);
|
|
}
|
|
.table.table-catalog tr:last-child {
|
|
border-bottom: none;
|
|
}
|
|
.table.table-catalog td {
|
|
padding: 0;
|
|
border-bottom: none;
|
|
}
|
|
.table.table-catalog td:not(:first-child):not(:last-child) {
|
|
display: inline;
|
|
font-size: var(--text-xs);
|
|
color: var(--color-text-muted);
|
|
}
|
|
/* "by " only where an Author cell exists: 2nd cell of four. */
|
|
.table.table-catalog td:nth-child(2):nth-last-child(3)::before {
|
|
content: "by ";
|
|
}
|
|
/* "·" only between metadata cells, so it never leads the official
|
|
table's line, which is a domain alone. */
|
|
.table.table-catalog td:nth-child(n + 3):not(:last-child)::before {
|
|
content: " \00b7 ";
|
|
}
|
|
.table.table-catalog td:last-child {
|
|
margin-top: 0.25rem;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<!-- Header -->
|
|
<header class="section" style="border-top: none">
|
|
<p class="section-label">AXI — Agent eXperience Interface</p>
|
|
<h1 data-annotate>Let's build apps that [agents] love.</h1>
|
|
<p class="text-lg">
|
|
10 design principles for agent-ergonomic CLI. 100% task success at the
|
|
lowest cost — validated across two benchmarks and 915 runs.
|
|
</p>
|
|
|
|
<div class="grid grid--2 mt-xl">
|
|
<div>
|
|
<p class="section-label">Avg Cost per Task</p>
|
|
<div class="chart-rows">
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-code</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 100%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.120</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 84%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.100</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-search</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 79.8%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.096</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-compressed</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 76.2%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.091</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">agent-browser</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 73.5%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.088</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">dev-browser</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 65.1%"></div>
|
|
</div>
|
|
<span class="chart-value">$0.078</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-axi</span>
|
|
<div class="chart-bar-track">
|
|
<div
|
|
class="chart-bar bar-highlight"
|
|
style="width: 62.2%"
|
|
></div>
|
|
</div>
|
|
<span class="chart-value value-highlight">$0.074</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<p class="section-label">Avg Duration per Task</p>
|
|
<div class="chart-rows">
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-code</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 100%"></div>
|
|
</div>
|
|
<span class="chart-value">36.2s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-compressed</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 82%"></div>
|
|
</div>
|
|
<span class="chart-value">29.7s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp-search</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 81.2%"></div>
|
|
</div>
|
|
<span class="chart-value">29.4s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">dev-browser</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 79%"></div>
|
|
</div>
|
|
<span class="chart-value">28.6s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-mcp</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 71.8%"></div>
|
|
</div>
|
|
<span class="chart-value">26.0s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">agent-browser</span>
|
|
<div class="chart-bar-track">
|
|
<div class="chart-bar" style="width: 68%"></div>
|
|
</div>
|
|
<span class="chart-value">24.6s</span>
|
|
</div>
|
|
<div class="chart-row">
|
|
<span class="chart-label">chrome-devtools-axi</span>
|
|
<div class="chart-bar-track">
|
|
<div
|
|
class="chart-bar bar-highlight"
|
|
style="width: 59.4%"
|
|
></div>
|
|
</div>
|
|
<span class="chart-value value-highlight">21.5s</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid grid--2 mt-xl">
|
|
<div class="card">
|
|
<p class="section-label">Tell your agent to try it out</p>
|
|
<pre
|
|
class="copyable"
|
|
><code>Run `npx -y gh-axi` for Github operations</code><button class="btn-copy" onclick="copyBlock(this)" aria-label="Copy to clipboard"><svg class="icon-copy" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" style="display:none"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg></button></pre>
|
|
<pre
|
|
class="copyable"
|
|
><code>Run `npx -y chrome-devtools-axi` for browser automation</code><button class="btn-copy" onclick="copyBlock(this)" aria-label="Copy to clipboard"><svg class="icon-copy" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" style="display:none"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg></button></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">Build your own AXI</p>
|
|
<p class="text-sm text-muted">
|
|
Install the AXI skill to get the design guidelines and
|
|
scaffolding:
|
|
</p>
|
|
<pre
|
|
class="copyable"
|
|
><code>npx skills add kunchenguid/axi</code><button class="btn-copy" onclick="copyBlock(this)" aria-label="Copy to clipboard"><svg class="icon-copy" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" style="display:none"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg></button></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="text-sm text-muted mt-md">
|
|
<a href="https://github.com/kunchenguid/axi" target="_blank"
|
|
>Github Repo</a
|
|
>
|
|
·
|
|
<a href="https://x.com/kunchenguid" target="_blank">Kun Chen</a>
|
|
Presents
|
|
</p>
|
|
</header>
|
|
|
|
<!-- Catalog -->
|
|
<section class="section">
|
|
<p class="section-label">Ecosystem</p>
|
|
<h2 data-annotate>The [AXI catalog].</h2>
|
|
<p>
|
|
AXIs in the wild - official reference implementations maintained by
|
|
the AXI project, and tools built by the community on the same
|
|
principles.
|
|
</p>
|
|
|
|
<div class="card mt-xl">
|
|
<p class="section-label">Official</p>
|
|
<div class="table-wrap">
|
|
<table class="table table-catalog">
|
|
<thead>
|
|
<tr>
|
|
<th>AXI</th>
|
|
<th>Domain</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<!-- generated:catalog-official:start -->
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/kunchenguid/gh-axi"
|
|
><code>gh-axi</code></a
|
|
>
|
|
</td>
|
|
<td>GitHub</td>
|
|
<td>
|
|
Issues, PRs, workflow runs, releases, and more. Wraps the
|
|
official <code>gh</code> CLI with agent-ergonomic output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/kunchenguid/chrome-devtools-axi"
|
|
><code>chrome-devtools-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Browser automation</td>
|
|
<td>
|
|
Navigate, click, fill, and extract with combined operations
|
|
and query filtering. Wraps chrome-devtools-mcp.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/kunchenguid/lavish-axi"
|
|
><code>lavish-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Human review</td>
|
|
<td>
|
|
Turns agent-generated HTML artifacts into collaborative
|
|
review surfaces - annotate, comment, and send feedback back
|
|
to the agent.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/kunchenguid/quota-axi"
|
|
><code>quota-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Quota / usage</td>
|
|
<td>
|
|
Reports local Claude, Codex, Cursor, Copilot, and Grok
|
|
quota/usage windows for routing-aware agents - data-only and
|
|
local-first.
|
|
</td>
|
|
</tr>
|
|
<!-- generated:catalog-official:end -->
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-md">
|
|
<p class="section-label">Community</p>
|
|
<div class="table-wrap">
|
|
<table class="table table-catalog">
|
|
<thead>
|
|
<tr>
|
|
<th>AXI</th>
|
|
<th>Author</th>
|
|
<th>Domain</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<!-- generated:catalog-community:start -->
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/aivv73/jj-axi"
|
|
><code>jj-axi</code></a
|
|
>
|
|
</td>
|
|
<td>aivv73</td>
|
|
<td>Version control</td>
|
|
<td>
|
|
Inspect and reshape Jujutsu history through deterministic,
|
|
non-interactive commands with compact TOON output and
|
|
operation-aware undo.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/SSBrouhard/npm-axi"
|
|
><code>npm-axi</code></a
|
|
>
|
|
</td>
|
|
<td>SSBrouhard</td>
|
|
<td>npm</td>
|
|
<td>
|
|
Search and inspect npm registry packages, versions,
|
|
dependencies, README previews, and downloads with
|
|
token-efficient output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/SSBrouhard/sqlite-axi"
|
|
><code>sqlite-axi</code></a
|
|
>
|
|
</td>
|
|
<td>SSBrouhard</td>
|
|
<td>SQLite</td>
|
|
<td>
|
|
Inspect schemas, sample rows, and run capped read-only
|
|
SQLite queries with token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/slack-axi"
|
|
><code>slack-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Slack</td>
|
|
<td>
|
|
Read, search, sweep, and safely draft Slack messages with
|
|
token-efficient output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/gws-axi"
|
|
><code>gws-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Google Workspace</td>
|
|
<td>
|
|
Gmail, Calendar, Docs, Drive, and Slides behind one command,
|
|
with multi-account write-safety - drafts mail, never sends.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/harvest-axi"
|
|
><code>harvest-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Time tracking</td>
|
|
<td>
|
|
Review, log, and edit Harvest time entries by period - for
|
|
yourself, your team, a project, or a client.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/specops"
|
|
><code>specops</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Spec-driven dev</td>
|
|
<td>
|
|
Spec-driven development for agents - and a demo of shipping
|
|
an AXI embedded in a skill, not a standalone npm executable.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a
|
|
href="https://github.com/JarvusInnovations/gitsheets/tree/main/packages/gitsheets-axi"
|
|
><code>gitsheets-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Git-backed data</td>
|
|
<td>
|
|
Read and mutate git-backed record sheets over the shell -
|
|
TOON output, idempotent commits.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/metabase-axi"
|
|
><code>metabase-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Analytics / BI</td>
|
|
<td>
|
|
Query, explore, and export from Metabase over the shell -
|
|
SQL/MBQL, saved questions, schema introspection, full-data
|
|
export.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/otter-axi"
|
|
><code>otter-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Meetings</td>
|
|
<td>
|
|
Find and pull Otter.ai meeting transcripts from the shell -
|
|
wraps Otter.ai's hosted MCP server as a scriptable, headless
|
|
CLI.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/maximebrmd/notion-axi"
|
|
><code>notion-axi</code></a
|
|
>
|
|
</td>
|
|
<td>maximebrmd</td>
|
|
<td>Notion</td>
|
|
<td>
|
|
Search, read, create, and update Notion pages and databases
|
|
over the shell - token-efficient TOON output, PAT or
|
|
integration auth.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JanSuthacheeva/clickup-axi"
|
|
><code>clickup-axi</code></a
|
|
>
|
|
</td>
|
|
<td>JanSuthacheeva</td>
|
|
<td>ClickUp</td>
|
|
<td>
|
|
List your open tasks, view a task with its newest comments
|
|
inline, and change task status - truncation-aware,
|
|
TOON-style output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/p33ves/databricks-axi"
|
|
><code>databricks-axi</code></a
|
|
>
|
|
</td>
|
|
<td>p33ves</td>
|
|
<td>Databricks</td>
|
|
<td>
|
|
Run Databricks jobs, watch runs, and pull failure logs
|
|
inline over the official databricks CLI - more domains
|
|
coming soon.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/aws-axi"
|
|
><code>aws-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>AWS</td>
|
|
<td>
|
|
Discover, plan, provision, deploy, and inspect AWS services
|
|
for hosting web, backend, database, and AI workloads through
|
|
safe token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/docker-axi"
|
|
><code>docker-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Docker</td>
|
|
<td>
|
|
Discover, build, run, debug, publish, inspect, and clean up
|
|
Docker apps through safe token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/batamire/doctl-axi"
|
|
><code>doctl-axi</code></a
|
|
>
|
|
</td>
|
|
<td>batamire</td>
|
|
<td>DigitalOcean</td>
|
|
<td>
|
|
Manage Droplets, Kubernetes, App Platform, databases,
|
|
networking, and Spaces via doctl with token-efficient TOON
|
|
output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/dynamodb-axi"
|
|
><code>dynamodb-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>DynamoDB</td>
|
|
<td>
|
|
Discover, inspect, query, scan, create, update, back up,
|
|
restore, export, import, and safely operate DynamoDB tables
|
|
through token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/pg-axi"
|
|
><code>pg-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>PostgreSQL</td>
|
|
<td>
|
|
Discover, create, inspect, query, back up, restore, and
|
|
maintain PostgreSQL databases through safe token-efficient
|
|
CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/mongodb-axi"
|
|
><code>mongodb-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>MongoDB</td>
|
|
<td>
|
|
Discover, create, inspect, query, export, import, maintain,
|
|
and diagnose MongoDB databases through safe token-efficient
|
|
CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/elasticsearch-axi"
|
|
><code>elasticsearch-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Elasticsearch</td>
|
|
<td>
|
|
Discover, inspect, query, index, map, snapshot, restore,
|
|
diagnose, and operate Elasticsearch clusters through safe
|
|
token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/kubernetes-axi"
|
|
><code>kubernetes-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Kubernetes</td>
|
|
<td>
|
|
Discover, inspect, deploy, debug, scale, roll out, expose,
|
|
and clean up Kubernetes workloads through safe
|
|
token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/redis-axi"
|
|
><code>redis-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Redis</td>
|
|
<td>
|
|
Discover, inspect, query, export, import, maintain, and
|
|
diagnose Redis databases through safe token-efficient CLI
|
|
workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/celery-axi"
|
|
><code>celery-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Celery</td>
|
|
<td>
|
|
Discover, inspect, run, debug, monitor, schedule, control,
|
|
and safely operate Celery task queues through
|
|
token-efficient CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/cyberuni/cyber-mux"
|
|
><code>cyber-mux</code></a
|
|
>
|
|
</td>
|
|
<td>unional</td>
|
|
<td>Terminal multiplexers</td>
|
|
<td>
|
|
Open, send, read, focus, and close terminal panes across
|
|
tmux, herdr, and WezTerm through one detection-driven
|
|
contract with token-efficient output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/thatdudealso/oracle-axi"
|
|
><code>oracle-axi</code></a
|
|
>
|
|
</td>
|
|
<td>thatdudealso</td>
|
|
<td>Oracle Database</td>
|
|
<td>
|
|
Discover, create, inspect, query, export, import, maintain,
|
|
and diagnose Oracle databases through safe token-efficient
|
|
CLI workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/karotkriss/glab-axi"
|
|
><code>glab-axi</code></a
|
|
>
|
|
</td>
|
|
<td>karotkriss</td>
|
|
<td>GitLab</td>
|
|
<td>
|
|
Issues, merge requests, CI/CD pipelines, variables and
|
|
secrets, releases, and raw API access. Wraps the official
|
|
glab CLI with agent-ergonomic TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/adeeshsharma/reactive-axi"
|
|
><code>reactive-axi</code></a
|
|
>
|
|
</td>
|
|
<td>adeeshsharma</td>
|
|
<td>UI review</td>
|
|
<td>
|
|
Click any element in your live React, Vue, or Svelte dev
|
|
server and resolve it to the exact source file and line
|
|
before it reaches your agent.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/AndersHoffmann/obsidian-axi"
|
|
><code>obsidian-axi</code></a
|
|
>
|
|
</td>
|
|
<td>AndersHoffmann</td>
|
|
<td>Obsidian</td>
|
|
<td>
|
|
Read, search, create, update, organize, and link Obsidian
|
|
notes from the filesystem - compact TOON output, atomic
|
|
writes, no plugin or server.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a
|
|
href="https://github.com/intelligentrascal/comfy-cloud-axi"
|
|
><code>comfy-cloud-axi</code></a
|
|
>
|
|
</td>
|
|
<td>intelligentrascal</td>
|
|
<td>AI generation</td>
|
|
<td>
|
|
Generate images, video, and audio via 22 partner models,
|
|
submit ComfyUI workflows and templates, track jobs, estimate
|
|
credits before generating, search nodes, and report usage
|
|
— wraps the Comfy Cloud MCP server with
|
|
token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/intelligentrascal/mobbin-axi"
|
|
><code>mobbin-axi</code></a
|
|
>
|
|
</td>
|
|
<td>intelligentrascal</td>
|
|
<td>UI/UX research</td>
|
|
<td>
|
|
Search real-world UI/UX patterns from production apps via
|
|
Mobbin - wraps Mobbin's OAuth-gated MCP server as a
|
|
scriptable, headless CLI with token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/JarvusInnovations/calendly-axi"
|
|
><code>calendly-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>Scheduling</td>
|
|
<td>
|
|
The Calendly booking loop from the shell - see what's
|
|
scheduled, mint single-use booking links, book directly,
|
|
cancel, and manage event types, availability, and webhooks.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a
|
|
href="https://github.com/JarvusInnovations/remarkable-axi"
|
|
><code>remarkable-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Jarvus Innovations</td>
|
|
<td>E-ink tablets</td>
|
|
<td>
|
|
Manage content on your reMarkable tablet through the
|
|
reMarkable cloud - browse and organize files, upload PDFs
|
|
and EPUBs, and send web articles as reflowable EPUBs.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/dtabolich/ado-axi"
|
|
><code>ado-axi</code></a
|
|
>
|
|
</td>
|
|
<td>dtabolich</td>
|
|
<td>Azure DevOps</td>
|
|
<td>
|
|
Pull requests, branches, repositories, and pipeline runs.
|
|
Wraps Azure CLI (<code>az devops</code> /
|
|
<code>az repos</code>) with agent-ergonomic TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/jeffreyhaen/ado-axi"
|
|
><code>ado-axi</code></a
|
|
>
|
|
</td>
|
|
<td>jeffreyhaen</td>
|
|
<td>Azure DevOps</td>
|
|
<td>
|
|
Work items, pull requests, Git refs, pipelines, and raw
|
|
Azure DevOps REST calls with safe mutations, profiles, and
|
|
token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/laizhenyoong/supabase-axi"
|
|
><code>supabase-axi</code></a
|
|
>
|
|
</td>
|
|
<td>laizhenyoong</td>
|
|
<td>Supabase</td>
|
|
<td>
|
|
Inspect schemas, run SQL, and audit RLS, indexes, and logs
|
|
across Supabase projects. Wraps the Supabase Management API.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/mstuart/homebrew-axi"
|
|
><code>homebrew-axi</code></a
|
|
>
|
|
</td>
|
|
<td>mstuart</td>
|
|
<td>Homebrew</td>
|
|
<td>
|
|
Inspect Homebrew formulae, casks, and installed packages
|
|
— versions, dependencies, outdated status, and install
|
|
stats — with token-efficient TOON output; read-only,
|
|
never mutates.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/mstuart/pypi-axi"
|
|
><code>pypi-axi</code></a
|
|
>
|
|
</td>
|
|
<td>mstuart</td>
|
|
<td>PyPI</td>
|
|
<td>
|
|
Inspect PyPI packages, versions, dependencies, and download
|
|
stats with token-efficient TOON output — read-only, no
|
|
auth required.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/AG9898/cargo-axi"
|
|
><code>cargo-axi</code></a
|
|
>
|
|
</td>
|
|
<td>AG9898</td>
|
|
<td>Rust / Cargo</td>
|
|
<td>
|
|
Inspect Rust workspaces and run safe <code>check</code> or
|
|
Clippy validation with compact TOON output and opt-in
|
|
session context.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/escidmore/forgejo-axi"
|
|
><code>forgejo-axi</code></a
|
|
>
|
|
</td>
|
|
<td>escidmore</td>
|
|
<td>Forgejo</td>
|
|
<td>
|
|
Pull request lifecycle, issues, and raw API access for
|
|
self-hosted Forgejo - non-interactive, reconciling
|
|
mutations, with token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/taltas/mastra-axi"
|
|
><code>mastra-axi</code></a
|
|
>
|
|
</td>
|
|
<td>taltas</td>
|
|
<td>Mastra</td>
|
|
<td>
|
|
Discover and run a Mastra app's agents, tools, and workflows
|
|
through agent-native shell commands with compact TOON
|
|
output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/CodyEngel/axi-axi"
|
|
><code>axi-axi</code></a
|
|
>
|
|
</td>
|
|
<td>CodyEngel</td>
|
|
<td>AXI authoring</td>
|
|
<td>
|
|
Scaffold a compliant AXI, read the 10 principles in
|
|
token-tuned slices, and run read-only compliance checks
|
|
against a candidate CLI.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a
|
|
href="https://github.com/emilchristensen/atlassian-axi/tree/main/packages/jira-axi"
|
|
><code>jira-axi</code></a
|
|
>
|
|
</td>
|
|
<td>emilchristensen</td>
|
|
<td>Issue tracking</td>
|
|
<td>
|
|
Create, search, transition, and comment on Jira work items,
|
|
boards, and sprints through Atlassian's acli with
|
|
token-efficient TOON output and idempotent mutations.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a
|
|
href="https://github.com/emilchristensen/atlassian-axi/tree/main/packages/confluence-axi"
|
|
><code>confluence-axi</code></a
|
|
>
|
|
</td>
|
|
<td>emilchristensen</td>
|
|
<td>Documentation</td>
|
|
<td>
|
|
Read and write Confluence Cloud pages and spaces directly
|
|
over the REST API with token-efficient TOON output and OAuth
|
|
3LO or API-token auth.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/masyanru/az-axi"
|
|
><code>az-axi</code></a
|
|
>
|
|
</td>
|
|
<td>masyanru</td>
|
|
<td>Azure</td>
|
|
<td>
|
|
Discover, inspect, query, and safely mutate Azure through
|
|
token-efficient CLI workflows over every az module.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/jeffreyhaen/mssql-axi"
|
|
><code>mssql-axi</code></a
|
|
>
|
|
</td>
|
|
<td>jeffreyhaen</td>
|
|
<td>Microsoft SQL Server / Azure SQL</td>
|
|
<td>
|
|
Inspect schemas, sample rows, run capped read-only queries
|
|
and showplans over the native ODBC driver - mutations
|
|
double-gated with dry-run by default, TOON output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/Holaxis-ai/superbee"
|
|
><code>superbee</code></a
|
|
>
|
|
</td>
|
|
<td>Holaxis</td>
|
|
<td>Agent knowledge infrastructure</td>
|
|
<td>
|
|
Turns what agents know into durable, domain-shaped
|
|
infrastructure through local OKF bundles with declared
|
|
schemas, exact queries, conflict-safe writes, and portable
|
|
Views.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/ardaatahan/figma-axi"
|
|
><code>figma-axi</code></a
|
|
>
|
|
</td>
|
|
<td>ardaatahan</td>
|
|
<td>Design / Figma</td>
|
|
<td>
|
|
Inspect Figma files, export nodes to PNG/SVG/PDF, and read
|
|
styles, components, and comments - summarizes huge files
|
|
instead of dumping raw JSON.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/enzodevs/trello-axi"
|
|
><code>trello-axi</code></a
|
|
>
|
|
</td>
|
|
<td>enzodevs</td>
|
|
<td>Project management</td>
|
|
<td>
|
|
Create, search, update, move, comment on, and archive Trello
|
|
cards through the REST API with compact TOON output,
|
|
complete pagination, idempotent mutations, and
|
|
non-interactive batch workflows.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/simkimsia/railway-axi"
|
|
><code>railway-axi</code></a
|
|
>
|
|
</td>
|
|
<td>simkimsia</td>
|
|
<td>Railway</td>
|
|
<td>
|
|
List projects and inspect linked project status,
|
|
environments, and services. Wraps the Railway CLI with
|
|
agent-ergonomic TOON output and structured errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/simkimsia/netlify-axi"
|
|
><code>netlify-axi</code></a
|
|
>
|
|
</td>
|
|
<td>simkimsia</td>
|
|
<td>Netlify</td>
|
|
<td>
|
|
List sites and inspect the linked site's status and the
|
|
logged-in account. Wraps the Netlify CLI with
|
|
agent-ergonomic TOON output and structured errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/ardaatahan/vercel-axi"
|
|
><code>vercel-axi</code></a
|
|
>
|
|
</td>
|
|
<td>ardaatahan</td>
|
|
<td>Deployment / Vercel</td>
|
|
<td>
|
|
Deploy and inspect Vercel deployments, projects, domains,
|
|
DNS, environment variables, and teams through the official
|
|
Vercel CLI, with explicit confirmation gates for production
|
|
and infrastructure changes.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/simkimsia/cloudflare-axi"
|
|
><code>cloudflare-axi</code></a
|
|
>
|
|
</td>
|
|
<td>simkimsia</td>
|
|
<td>Cloudflare</td>
|
|
<td>
|
|
Inspect the current Worker's deployments, Pages projects, KV
|
|
namespaces, and the logged-in account. Wraps the Cloudflare
|
|
CLI (wrangler) with agent-ergonomic TOON output and
|
|
structured errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/radityasurya/coolify-axi"
|
|
><code>coolify-axi</code></a
|
|
>
|
|
</td>
|
|
<td>radityasurya</td>
|
|
<td>Coolify</td>
|
|
<td>
|
|
Apps, databases, services, and deployments on self-hosted or
|
|
cloud Coolify - name-based addressing, redacted secrets, and
|
|
TOON output over the official coolify CLI.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/ardaatahan/porkbun-axi"
|
|
><code>porkbun-axi</code></a
|
|
>
|
|
</td>
|
|
<td>ardaatahan</td>
|
|
<td>Domains / Porkbun</td>
|
|
<td>
|
|
Manage Porkbun domains, DNS records, SSL certificates, URL
|
|
forwarding, nameservers, and glue records through the
|
|
Porkbun API, with compact TOON output and explicit
|
|
confirmation gates for registrations and destructive
|
|
updates/deletes.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/masculinecache/wrangler-axi"
|
|
><code>wrangler-axi</code></a
|
|
>
|
|
</td>
|
|
<td>masculinecache</td>
|
|
<td>Cloudflare Wrangler</td>
|
|
<td>
|
|
Deploy Workers and Pages, manage KV namespaces, D1
|
|
databases, R2 buckets, and Worker secrets, and tail live
|
|
logs with hard bounds - wraps the official Wrangler CLI with
|
|
predictable TOON lists and structured errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/masculinecache/chezmoi-axi"
|
|
><code>chezmoi-axi</code></a
|
|
>
|
|
</td>
|
|
<td>masculinecache</td>
|
|
<td>Dotfiles</td>
|
|
<td>
|
|
List, diff, add, re-add, apply, verify, and sync
|
|
chezmoi-managed dotfiles with compact TOON output -
|
|
template-aware re-add verdicts, preview dry-runs, and
|
|
idempotent operations.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/masculinecache/axi-memory"
|
|
><code>mem-axi</code></a
|
|
>
|
|
</td>
|
|
<td>masculinecache</td>
|
|
<td>Agent memory</td>
|
|
<td>
|
|
Durable cross-session agent memory as markdown + YAML
|
|
frontmatter in a git repo - typed memories, priority-ranked
|
|
search with L0 abstracts, OS-side dedup, and cross-machine
|
|
sync.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/ardaatahan/fal-axi"
|
|
><code>fal-axi</code></a
|
|
>
|
|
</td>
|
|
<td>ardaatahan</td>
|
|
<td>Image / Video Generation</td>
|
|
<td>
|
|
Generate images and videos and poll fal.ai queue
|
|
status/results through the official @fal-ai/client, with
|
|
compact TOON output, FAL_KEY env-only auth, and --confirm
|
|
gates on paid generates.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/ardaatahan/canva-axi"
|
|
><code>canva-axi</code></a
|
|
>
|
|
</td>
|
|
<td>ardaatahan</td>
|
|
<td>Design / Canva</td>
|
|
<td>
|
|
List, get, create, export, and autofill Canva designs
|
|
through the official Canva Connect API, with compact TOON
|
|
output, CANVA_ACCESS_TOKEN env-only auth, HTTPS-only API
|
|
bases, and --confirm gates on mutating writes.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/masculinecache/bws-axi"
|
|
><code>bws-axi</code></a
|
|
>
|
|
</td>
|
|
<td>masculinecache</td>
|
|
<td>Bitwarden Secrets Manager</td>
|
|
<td>
|
|
Agent-ergonomic Bitwarden Secrets Manager CLI - TOON output,
|
|
values redacted by default, project/key scoped listings.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/batamire/ha-axi"
|
|
><code>ha-axi</code></a
|
|
>
|
|
</td>
|
|
<td>batamire</td>
|
|
<td>Home Assistant</td>
|
|
<td>
|
|
Inspect entities, call services behind safety gates, render
|
|
templates, and read area/device registries over Home
|
|
Assistant REST and WebSocket with token-efficient TOON
|
|
output.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/simkimsia/calcom-axi"
|
|
><code>calcom-axi</code></a
|
|
>
|
|
</td>
|
|
<td>simkimsia</td>
|
|
<td>Scheduling</td>
|
|
<td>
|
|
Read your Cal.com agenda, bookings and one booking's
|
|
attendees and meeting link, event types, availability
|
|
schedules, free slots for an event type, and the logged-in
|
|
account. Wraps the Cal.com CLI (calcom) with agent-ergonomic
|
|
TOON output and structured errors.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/Valzon/screencast-axi"
|
|
><code>screencast-axi</code></a
|
|
>
|
|
</td>
|
|
<td>Valzon</td>
|
|
<td>Screencasts</td>
|
|
<td>
|
|
Scaffold, rehearse, and record scripted Playwright
|
|
walkthroughs of any website into mp4, webm, and a poster
|
|
with a synthetic cursor and burnt-in captions - TOON output,
|
|
structured errors, and a content-first status view via
|
|
axi-sdk-js. Requires ffmpeg.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/calebl/basecamp-axi"
|
|
><code>basecamp-axi</code></a
|
|
>
|
|
</td>
|
|
<td>calebl</td>
|
|
<td>Project management</td>
|
|
<td>
|
|
Projects, to-dos, cards, messages, comments, Campfire chat,
|
|
people, search, and cross-project assignment reports. Wraps
|
|
the official <code>basecamp</code> CLI with TOON output,
|
|
pre-computed totals, idempotent mutations, and a
|
|
<code>--confirm</code> gate on trash/archive/restore.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/jeffreyhaen/msgraph-axi"
|
|
><code>msgraph-axi</code></a
|
|
>
|
|
</td>
|
|
<td>jeffreyhaen</td>
|
|
<td>Microsoft 365 / Outlook</td>
|
|
<td>
|
|
Read, search, draft, and send Outlook mail and manage
|
|
calendars over the <code>m365</code> CLI - read-only by
|
|
default, with TOON output and mutations behind
|
|
<code>--execute</code>/<code>--confirm</code>.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<a href="https://github.com/oguzalp7/frontier-axi"
|
|
><code>frontier-axi</code></a
|
|
>
|
|
</td>
|
|
<td>oguzalp7</td>
|
|
<td>Pre-flight SDLC & Cognitive Bridge</td>
|
|
<td>
|
|
Stage ambiguous ideas and architectural inquiries until
|
|
grilling settles them into tasks-axi tickets with
|
|
token-efficient TOON output.
|
|
</td>
|
|
</tr>
|
|
<!-- generated:catalog-community:end -->
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="mt-md">
|
|
Built an AXI?
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/CONTRIBUTING.md"
|
|
target="_blank"
|
|
>Follow the contributor workflow</a
|
|
>
|
|
to add it to the catalog.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 1. Introduction -->
|
|
<section class="section">
|
|
<p class="section-label">Premise</p>
|
|
<h2 data-annotate>Neither CLI nor MCP gives [agents] enough love.</h2>
|
|
<p>
|
|
AI agents interact with external services through two dominant
|
|
paradigms. The first is <strong>shell-based CLI execution</strong>:
|
|
the agent runs commands like <code>gh issue list</code> or
|
|
<code>agent-browser navigate</code> and parses the text output. The
|
|
second is <strong>structured tool protocols</strong> like MCP (Model
|
|
Context Protocol), where the agent invokes typed tool functions
|
|
through the hosting framework’s native tool-calling interface.
|
|
</p>
|
|
<p>Both approaches have significant problems for agents:</p>
|
|
<ul>
|
|
<li>
|
|
<strong>CLI: action and observation are separated.</strong>
|
|
Browser CLIs return minimal confirmations —
|
|
<code>navigate</code> returns only a page title,
|
|
<code>click</code> returns “Done” — forcing the
|
|
agent to call <code>snapshot</code> after every action. This doubles
|
|
tool calls and wastes token budget.
|
|
</li>
|
|
<li>
|
|
<strong>MCP: schema overhead scales with tool count.</strong> A
|
|
browser MCP server exposes ~30 tools. Their schemas inflate input
|
|
tokens — MCP conditions average 185K tokens per task vs. 79K
|
|
for AXI — and the overhead compounds across every turn.
|
|
</li>
|
|
<li>
|
|
<strong>Both: poor discoverability.</strong> CLI agents must guess
|
|
subcommands or read <code>--help</code>. MCP agents with lazy
|
|
loading guess wrong tool names — selecting
|
|
<code>take_screenshot</code> (1MB base64 PNG) instead of
|
|
<code>take_snapshot</code> (80KB text) — and crash the
|
|
session. Neither provides in-context guidance on what to do next.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Recent debate has framed this as “MCP vs. CLI”
|
|
<a href="#ref-smithery">[2]</a>, but the real question is neither
|
|
<em>which</em> protocol nor <em>which</em> transport, but rather
|
|
<em>what design principles</em> make an agent-tool interface
|
|
effective.
|
|
</p>
|
|
<p>
|
|
AXI is
|
|
<strong>10 principles for agent-ergonomic CLI design</strong> that
|
|
treat token budget as a first-class constraint. AXI achieves the
|
|
reliability advantages MCP promises (structured output,
|
|
discoverability) at the cost profile of a CLI.
|
|
</p>
|
|
|
|
<hr class="divider" />
|
|
|
|
<h3>Contributions</h3>
|
|
<ol>
|
|
<li>
|
|
Ten design principles for agent-ergonomic CLI tools, organized into
|
|
four categories.
|
|
</li>
|
|
<li>
|
|
Reference implementations (<a
|
|
href="https://github.com/kunchenguid/gh-axi"
|
|
target="_blank"
|
|
><code>gh-axi</code></a
|
|
>
|
|
for GitHub,
|
|
<a
|
|
href="https://github.com/kunchenguid/chrome-devtools-axi"
|
|
target="_blank"
|
|
><code>chrome-devtools-axi</code></a
|
|
>
|
|
for browser automation) demonstrating the principles across two
|
|
domains.
|
|
</li>
|
|
<li>
|
|
Two benchmarks — 490 browser automation runs and
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>425 GitHub API runs</a
|
|
>
|
|
— comparing seven interface conditions each, with
|
|
trajectory-level analysis showing where and why each interface
|
|
succeeds or fails.
|
|
</li>
|
|
</ol>
|
|
</section>
|
|
|
|
<!-- 2. Related Work -->
|
|
<section class="section">
|
|
<p class="section-label">Context</p>
|
|
<h2>Related Work</h2>
|
|
|
|
<h4>Model Context Protocol (MCP)</h4>
|
|
<p>
|
|
Anthropic’s Model Context Protocol
|
|
<a href="#ref-mcp">[1]</a> provides a standardized way to connect AI
|
|
models to external tools through structured, typed tool definitions.
|
|
While MCP offers type-safe schemas and discoverable tool catalogs, the
|
|
schema overhead is substantial. The evaluation below quantifies this
|
|
cost: MCP conditions use 2.3× more input tokens than AXI (185K
|
|
vs. 79K per task), and the overhead compounds across multi-step tasks.
|
|
</p>
|
|
|
|
<h4>MCP vs. CLI benchmarks</h4>
|
|
<p>
|
|
Mao and Pradhan <a href="#ref-smithery">[2]</a> benchmarked 756 runs
|
|
comparing raw APIs, CLI, and native MCP across GitHub, Linear, and
|
|
Singapore Bus APIs. They found native MCP achieved 91.7% success vs.
|
|
83.3% for CLI, with CLI using 2.9× more billed tokens. However,
|
|
their CLI was auto-generated from API specs, not hand-designed for
|
|
agents. They note: “What this does not settle is whether a
|
|
hand-crafted, agent-first CLI could close the remaining gap.”
|
|
AXI answers this question directly — an agent-first CLI not only
|
|
closes the gap but surpasses MCP on every metric.
|
|
</p>
|
|
|
|
<h4>Code execution with MCP</h4>
|
|
<p>
|
|
Jones and Kelly <a href="#ref-anthropic-code">[3]</a> identified two
|
|
scaling problems with direct MCP tool calls: tool definitions overload
|
|
the context window, and intermediate results consume additional tokens
|
|
as they pass through the model between calls. They proposed presenting
|
|
MCP tools as a code API that the agent programs against, so that data
|
|
flows through the execution environment rather than the context
|
|
window. Varda and Pai
|
|
<a href="#ref-cloudflare-code">[4]</a> independently arrived at the
|
|
same insight, coining the term “Code Mode” and reporting
|
|
that LLMs handle complex, multi-step tool interactions better when
|
|
writing TypeScript than when making direct tool calls. The code-mode
|
|
condition in our browser benchmark evaluates this approach. Code
|
|
execution achieves 100% reliability, but write-run-debug loops make it
|
|
the slowest condition (36.2s avg) and, at $0.120/task, the most
|
|
expensive condition. In a
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>separate GitHub benchmark</a
|
|
>, code mode was the cheapest MCP condition ($0.101/task) by batching
|
|
API calls — suggesting the trade-off is domain-dependent.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 3. The 10 Principles -->
|
|
<section class="section">
|
|
<p class="section-label">The Model</p>
|
|
<h2 data-annotate>The [10 principles].</h2>
|
|
|
|
<div class="card mt-xl">
|
|
<ol>
|
|
<!-- generated:principles:start -->
|
|
<li>
|
|
<strong>Token-efficient output</strong> — Use
|
|
<a href="https://toonformat.dev/">TOON</a> format for ~40% token
|
|
savings over JSON
|
|
</li>
|
|
<li>
|
|
<strong>Minimal default schemas</strong> — 3–4 fields
|
|
per list item, not 10+
|
|
</li>
|
|
<li>
|
|
<strong>Content truncation</strong> — Truncate large text
|
|
with size hints and a <code>--full</code> escape hatch
|
|
</li>
|
|
<li>
|
|
<strong>Pre-computed aggregates</strong> — Include
|
|
aggregated counts and statuses that eliminate round trips
|
|
</li>
|
|
<li>
|
|
<strong>Definitive empty states</strong> — Explicit “0
|
|
results” rather than ambiguous empty output
|
|
</li>
|
|
<li>
|
|
<strong>Structured errors & exit codes</strong> —
|
|
Idempotent mutations, structured errors, no interactive prompts,
|
|
fail loud on unknown flags
|
|
</li>
|
|
<li>
|
|
<strong>Ambient context</strong> — Install opt-in session
|
|
integrations first, then offer an on-demand skill
|
|
</li>
|
|
<li>
|
|
<strong>Content first</strong> — Running with no arguments
|
|
shows live data, not help text
|
|
</li>
|
|
<li>
|
|
<strong>Contextual disclosure</strong> — Include next-step
|
|
suggestions after each output
|
|
</li>
|
|
<li>
|
|
<strong>Consistent way to get help</strong> — Concise
|
|
per-subcommand reference when agents need it
|
|
</li>
|
|
<!-- generated:principles:end -->
|
|
</ol>
|
|
</div>
|
|
|
|
<!-- Efficiency -->
|
|
<h3 class="mt-xl">Efficiency</h3>
|
|
|
|
<h4><span class="text-accent">1.</span> Token-efficient output</h4>
|
|
<p>
|
|
Use TOON (Token-Optimized Object Notation) format instead of JSON or
|
|
tab-separated tables. TOON omits braces, quotes, and commas, yielding
|
|
approximately 40% token savings over equivalent JSON while remaining
|
|
unambiguous to LLMs.
|
|
</p>
|
|
|
|
<div class="grid grid--2">
|
|
<div class="card">
|
|
<p class="section-label">Conventional (JSON)</p>
|
|
<pre><code>[{"number":42,"title":"Fix login bug","state":"open",
|
|
"author":"alice","labels":["bug","P1"]},
|
|
{"number":43,"title":"Add dark mode","state":"open",
|
|
"author":"bob","labels":["feature"]}]</code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">AXI (TOON)</p>
|
|
<pre><code>issues[2]{number,title,state}:
|
|
42,Fix login bug,open
|
|
43,Add dark mode,open</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<h4><span class="text-accent">2.</span> Minimal default schemas</h4>
|
|
<p>
|
|
Return 3–4 fields per list item by default, not 10+. Agents
|
|
rarely need all available fields and can request additional ones
|
|
explicitly via a <code>--fields</code> flag.
|
|
</p>
|
|
|
|
<h4><span class="text-accent">3.</span> Content truncation</h4>
|
|
<p>
|
|
Truncate large text fields to a configurable limit, appending a size
|
|
hint such as
|
|
<code
|
|
>(truncated, 2847 chars total — use --full to see complete
|
|
body)</code
|
|
>. This prevents a single verbose response from consuming the
|
|
agent’s context budget while preserving enough content for most
|
|
tasks.
|
|
</p>
|
|
|
|
<!-- Robustness -->
|
|
<hr class="divider" />
|
|
<h3>Robustness</h3>
|
|
|
|
<h4><span class="text-accent">4.</span> Pre-computed aggregates</h4>
|
|
<p>
|
|
Include aggregate or derived fields that eliminate round trips. The
|
|
most impactful example is <code>totalCount</code>: always report the
|
|
total number of items, not just the page size. Other examples include
|
|
computed CI status summaries (e.g., “27 passed, 0 failed, 10
|
|
skipped”) inline in PR views.
|
|
</p>
|
|
|
|
<div class="grid grid--2">
|
|
<div class="card">
|
|
<p class="section-label">Conventional: no total count</p>
|
|
<pre><code>$ gh label list
|
|
bug Something isn't working #d73a4a
|
|
docs Improvements or additions #0075ca
|
|
... (30 rows -- default page, no total)</code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">AXI: total count + CI pre-computed</p>
|
|
<pre><code>$ gh-axi label list
|
|
count: 126
|
|
labels[126]{name}:
|
|
bug
|
|
docs
|
|
...
|
|
|
|
$ gh-axi pr view 51772
|
|
pull_request:
|
|
title: "refactor(plugins): route..."
|
|
state: merged
|
|
checks: "27 passed, 0 failed, 10 skipped"</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<h4><span class="text-accent">5.</span> Definitive empty states</h4>
|
|
<p>
|
|
When a query returns no results, output an explicit zero-result
|
|
message rather than empty output. Agents cannot distinguish “no
|
|
output” from “command failed silently” without this
|
|
signal.
|
|
</p>
|
|
|
|
<h4>
|
|
<span class="text-accent">6.</span> Structured errors & exit codes
|
|
</h4>
|
|
<p>
|
|
Mutations should be idempotent, errors should be structured and
|
|
written to stdout (not stderr), and commands must never prompt for
|
|
interactive input. Reserve stdout for structured data and stderr for
|
|
debug/log output. Use clean exit codes: 0 for success, 1 for errors.
|
|
Unknown flags must fail loud (exit 2) rather than be silently ignored
|
|
— the same guarantee a CLI already gives for an unknown command
|
|
— so an agent that invents a flag learns it did nothing instead
|
|
of trusting unscoped output.
|
|
</p>
|
|
|
|
<!-- Discoverability -->
|
|
<hr class="divider" />
|
|
<h3>Discoverability</h3>
|
|
|
|
<h4><span class="text-accent">7.</span> Ambient context</h4>
|
|
<p>
|
|
Install into the agent’s session hooks or plugin system from an
|
|
explicit setup command so that every conversation starts with relevant
|
|
state already visible — before the agent takes any action. The
|
|
integration provides a compact, directory-scoped dashboard as initial
|
|
context. As a secondary recommendation, also ship an installable Agent
|
|
Skill (generated from the same home-view guidance) so agents that
|
|
support the skill format can load your guidance on demand, without the
|
|
per-session cost of a hook.
|
|
</p>
|
|
|
|
<h4><span class="text-accent">8.</span> Content first</h4>
|
|
<p>
|
|
Running a command with no arguments should display live, actionable
|
|
data rather than help text. The home view should also include the
|
|
current executable path, with the home-directory prefix rendered as
|
|
<code>~</code>, and a one-sentence description of what the AXI does.
|
|
</p>
|
|
|
|
<div class="grid grid--2">
|
|
<div class="card">
|
|
<p class="section-label">Conventional: no-args shows help</p>
|
|
<pre><code>$ gh issue
|
|
Work with GitHub issues.
|
|
|
|
USAGE
|
|
gh issue <command> [flags]
|
|
|
|
AVAILABLE COMMANDS
|
|
close, create, list, view, ...</code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">AXI: no-args shows live state</p>
|
|
<pre><code>$ gh-axi issue list
|
|
bin: ~/.local/bin/gh-axi
|
|
description: Browse and manage GitHub issues for the current repository
|
|
count: 14 of 8771 total
|
|
issues[14]{number,title,state}:
|
|
51815,"[Bug]: Telegram plugin...",open
|
|
...
|
|
help[2]:
|
|
Run `gh-axi issue view <number>`
|
|
Run `gh-axi issue create --title "..."`</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<h4><span class="text-accent">9.</span> Contextual disclosure</h4>
|
|
<p>
|
|
Append <code>help[]</code> lines after output, suggesting logical next
|
|
steps as concrete command templates. Carry forward fixed
|
|
disambiguating flags, but leave runtime values parameterized as
|
|
placeholders like <code><id></code> instead of guessing them.
|
|
This eliminates tool-discovery turns and guides agents through
|
|
multi-step workflows.
|
|
</p>
|
|
|
|
<h4><span class="text-accent">10.</span> Consistent way to get help</h4>
|
|
<p>
|
|
Each subcommand should offer a concise <code>--help</code> flag as a
|
|
fallback when contextual hints are insufficient.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 4. Experimental Setup -->
|
|
<section class="section">
|
|
<p class="section-label">Method</p>
|
|
<h2>Experimental Setup</h2>
|
|
|
|
<h4>Conditions</h4>
|
|
<p>
|
|
The benchmark evaluates seven agent-tool interface conditions for
|
|
browser automation:
|
|
</p>
|
|
|
|
<div class="card">
|
|
<div class="table-wrap">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Condition</th>
|
|
<th>Interface</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>chrome-devtools-axi</strong></td>
|
|
<td>Bash CLI (AXI)</td>
|
|
<td>
|
|
AXI wrapper around chrome-devtools-mcp. Combined operations,
|
|
TOON metadata, contextual suggestions.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>dev-browser</strong></td>
|
|
<td>Bash CLI</td>
|
|
<td>
|
|
Sandboxed browser scripting via
|
|
<code>dev-browser run script.js</code>. Agent writes small
|
|
JS files and prints only targeted results.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>agent-browser</strong></td>
|
|
<td>Bash CLI (Rust)</td>
|
|
<td>
|
|
Vercel’s Agent Browser — the raw CLI baseline.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>chrome-devtools-mcp</strong></td>
|
|
<td>MCP (no ToolSearch)</td>
|
|
<td>
|
|
Chrome DevTools MCP server. All ~30 tool schemas loaded
|
|
upfront.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>chrome-devtools-mcp-search</strong></td>
|
|
<td>MCP + ToolSearch</td>
|
|
<td>Same MCP server, tools discovered on-demand.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>chrome-devtools-mcp-code</strong></td>
|
|
<td>TypeScript scripts</td>
|
|
<td>
|
|
Agent writes <code>.ts</code> scripts calling
|
|
<code>callTool()</code> which forwards to
|
|
chrome-devtools-mcp via a persistent MCP bridge.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>chrome-devtools-mcp-compressed</strong></td>
|
|
<td>MCP Compressor CLI</td>
|
|
<td>
|
|
mcp-compressor wraps the MCP server into CLI subcommands.
|
|
Agent uses Bash.
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<h4>Task design</h4>
|
|
<p>The benchmark includes 14 tasks across four categories:</p>
|
|
<ul>
|
|
<li>
|
|
<strong>Single-step (4 tasks):</strong>
|
|
<code>read_static_page</code>, <code>wikipedia_fact_lookup</code>,
|
|
<code>github_repo_stars</code>,
|
|
<code>wikipedia_table_read</code> — navigate to one page and
|
|
extract information.
|
|
</li>
|
|
<li>
|
|
<strong>Multi-step (5 tasks):</strong>
|
|
<code>wikipedia_link_follow</code>,
|
|
<code>github_navigate_to_file</code>,
|
|
<code>wikipedia_infobox_hop</code>,
|
|
<code>multi_page_comparison</code>,
|
|
<code>wikipedia_search_click</code> — navigate, interact, and
|
|
follow links across pages.
|
|
</li>
|
|
<li>
|
|
<strong>Investigation (4 tasks):</strong>
|
|
<code>wikipedia_deep_extraction</code>,
|
|
<code>github_issue_investigation</code>,
|
|
<code>multi_site_research</code>,
|
|
<code>tabular_data_analysis</code> — complex multi-page
|
|
extraction requiring context across navigations.
|
|
</li>
|
|
<li>
|
|
<strong>Error recovery (1 task):</strong>
|
|
<code>navigate_404</code> — handle failures gracefully.
|
|
</li>
|
|
</ul>
|
|
|
|
<h4>Infrastructure</h4>
|
|
<p>
|
|
Each run creates a fresh workspace with condition-specific
|
|
<code>CLAUDE.md</code>. All MCP-based conditions use the same backend:
|
|
<code>chrome-devtools-mcp@latest --headless --isolated</code>. Agent:
|
|
Claude Sonnet 4.6. Judge: Claude Sonnet 4.6. Five repeats per
|
|
condition–task pair: 14 × 7 × 5 = 490 total runs.
|
|
</p>
|
|
<p>
|
|
A
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>separate benchmark targeting GitHub API tasks</a
|
|
>
|
|
(425 runs, 5 conditions, 17 tasks) validates the same pattern in a
|
|
different domain.
|
|
</p>
|
|
|
|
<h4>Metrics</h4>
|
|
<ul>
|
|
<li>
|
|
<strong>Task success</strong> (binary): determined by an LLM judge
|
|
comparing the agent’s answer against a reference answer and
|
|
rubric.
|
|
</li>
|
|
<li>
|
|
<strong>Cost</strong> (USD): total API cost, computed from
|
|
input/output token counts at published rates.
|
|
</li>
|
|
<li>
|
|
<strong>Duration</strong> (seconds): wall-clock time from task start
|
|
to final response.
|
|
</li>
|
|
<li>
|
|
<strong>Turns</strong>: number of tool invocations the agent makes.
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<!-- 5. Results -->
|
|
<section class="section">
|
|
<p class="section-label">Proof</p>
|
|
<h2>Results</h2>
|
|
<p class="text-muted">
|
|
490 runs, 14 tasks × 5 repetitions × 7 conditions
|
|
</p>
|
|
|
|
<div class="card mt-xl">
|
|
<p class="section-label">Aggregate</p>
|
|
<div class="table-wrap">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Condition</th>
|
|
<th>Success</th>
|
|
<th>Avg Cost</th>
|
|
<th>Avg Duration</th>
|
|
<th>Avg Turns</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>chrome-devtools-axi</strong></td>
|
|
<td><strong class="text-accent">100%</strong></td>
|
|
<td><strong class="text-accent">$0.074</strong></td>
|
|
<td><strong class="text-accent">21.5s</strong></td>
|
|
<td><strong class="text-accent">4.5</strong></td>
|
|
</tr>
|
|
<tr>
|
|
<td>dev-browser</td>
|
|
<td>99%</td>
|
|
<td>$0.078</td>
|
|
<td>28.6s</td>
|
|
<td>4.9</td>
|
|
</tr>
|
|
<tr>
|
|
<td>agent-browser</td>
|
|
<td>99%</td>
|
|
<td>$0.088</td>
|
|
<td>24.6s</td>
|
|
<td>4.8</td>
|
|
</tr>
|
|
<tr>
|
|
<td>chrome-devtools-mcp-compressed</td>
|
|
<td>100%</td>
|
|
<td>$0.091</td>
|
|
<td>29.7s</td>
|
|
<td>7.6</td>
|
|
</tr>
|
|
<tr>
|
|
<td>chrome-devtools-mcp-search</td>
|
|
<td>99%</td>
|
|
<td>$0.096</td>
|
|
<td>29.4s</td>
|
|
<td>7.5</td>
|
|
</tr>
|
|
<tr>
|
|
<td>chrome-devtools-mcp</td>
|
|
<td>99%</td>
|
|
<td>$0.100</td>
|
|
<td>26.0s</td>
|
|
<td>6.2</td>
|
|
</tr>
|
|
<tr>
|
|
<td>chrome-devtools-mcp-code</td>
|
|
<td>100%</td>
|
|
<td>$0.120</td>
|
|
<td>36.2s</td>
|
|
<td>6.4</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="mt-md">
|
|
AXI (<code>chrome-devtools-axi</code>) achieves 100% task success at
|
|
the lowest average cost ($0.074/task), shortest duration (21.5s), and
|
|
fewest turns (4.5). It is the only condition that leads simultaneously
|
|
on all four metrics. The field is competitive — dev-browser is
|
|
within 5% on cost — but AXI’s consistency across the full
|
|
task suite gives it the edge.
|
|
</p>
|
|
|
|
<hr class="divider" />
|
|
|
|
<h3>Corroborating evidence: GitHub benchmark</h3>
|
|
<p>
|
|
A
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>separate 425-run benchmark</a
|
|
>
|
|
comparing <code>gh-axi</code> against raw <code>gh</code> CLI and
|
|
GitHub MCP across 17 tasks arrives at the same conclusions:
|
|
<strong>AXI achieves 100% success at $0.050/task</strong>, vs. 86% at
|
|
$0.054 for CLI and 82–87% at $0.101–$0.148 for MCP. The
|
|
cost gap widens dramatically on complex tasks:
|
|
<code>ci_failure_investigation</code> costs $0.065 for AXI vs. $0.758
|
|
for MCP (12×).
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 6. Analysis -->
|
|
<section class="section">
|
|
<p class="section-label">Analysis</p>
|
|
<h2>Findings</h2>
|
|
|
|
<div class="card mt-xl">
|
|
<p class="section-label">Finding 1</p>
|
|
<h4>AXI leads on every metric.</h4>
|
|
<p>
|
|
<code>chrome-devtools-axi</code> achieves 100% success at the lowest
|
|
cost ($0.074/task), fewest turns (4.5), and fastest execution
|
|
(21.5s). It is the only condition that leads simultaneously on all
|
|
four metrics. The field is competitive —
|
|
<code>dev-browser</code> is within 5% on cost ($0.078) — but
|
|
AXI’s consistency across the full task suite gives it the
|
|
edge.
|
|
</p>
|
|
<p>
|
|
Trajectory analysis across all 70 AXI runs reveals multiple
|
|
mechanisms behind the cost advantage:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<strong>Specialized extraction commands.</strong>
|
|
AXI’s <code>tables --url</code> command navigates to a page
|
|
and returns structured table data in a single step. On extraction
|
|
tasks, this reduces the entire interaction to 2 turns at
|
|
$0.047/task — a 3.1× cost reduction vs. MCP-code on
|
|
the same task ($0.147).
|
|
</li>
|
|
<li>
|
|
<strong>Pipe-based filtering.</strong>
|
|
The agent pipes CLI output through shell tools (<code>| grep</code
|
|
>, <code>| head</code>, <code>| tail</code>) to return only
|
|
matching lines instead of full accessibility snapshots. This keeps
|
|
per-turn token volume compact.
|
|
</li>
|
|
<li>
|
|
<strong>Combined operations.</strong>
|
|
<code>open</code> combines navigate + snapshot;
|
|
<code>click --query</code> returns the updated snapshot with
|
|
search results automatically. This eliminates the separate
|
|
<code>take_snapshot</code> calls that MCP conditions require after
|
|
every action.
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="card mt-md">
|
|
<p class="section-label">Finding 2</p>
|
|
<h4>Code-writing pays a coordination tax.</h4>
|
|
<p>
|
|
Both code-writing conditions achieve near-perfect success:
|
|
<code>chrome-devtools-mcp-code</code> at 100% and
|
|
<code>dev-browser</code> at 99%. MCP-code’s perfect
|
|
reliability comes at $0.120/task and 6.4 turns — 1.6×
|
|
AXI’s cost. <code>dev-browser</code> is more competitive at
|
|
$0.078 and 4.9 turns, occasionally beating AXI on multi-site tasks
|
|
where script batching eliminates sequential navigation.
|
|
</p>
|
|
<p class="mb-0">
|
|
On <code>multi_site_research</code>,
|
|
<code>dev-browser</code>’s best run costs $0.059 (4 turns, 3
|
|
scripts) vs. AXI’s $0.090 (6 turns). Batching three site
|
|
visits into three focused scripts avoids the per-navigation overhead
|
|
of AXI’s sequential <code>open --query</code> pattern. The
|
|
trade-off: when scripts fail, write-run-debug loops push costs
|
|
higher — <code>dev-browser</code> ranges from $0.059 to $0.100
|
|
across the 5 runs (1.7× spread).
|
|
</p>
|
|
</div>
|
|
|
|
<div class="card mt-md">
|
|
<p class="section-label">Finding 3</p>
|
|
<h4>MCP Compressor validates CLI-over-MCP.</h4>
|
|
<p>
|
|
<a href="https://github.com/atlassian-labs/mcp-compressor/"
|
|
>MCP Compressor</a
|
|
>
|
|
open sourced by Atlassian (100% success, $0.091/task, 7.6 turns)
|
|
wraps any MCP server into a single CLI tool, converting each MCP
|
|
tool into a Bash subcommand. This single change — CLI over MCP
|
|
— eliminates schema overhead and enables shell composability
|
|
(<code>| grep</code>, <code>| head</code>).
|
|
</p>
|
|
<p class="mb-0">
|
|
The remaining 23% gap to AXI ($0.091 vs. $0.074) comes from two
|
|
sources: MCP Compressor still requires separate
|
|
<code>navigate-page</code> + <code>take-snapshot</code> calls where
|
|
AXI’s <code>open</code> returns both in one due to its
|
|
ergonomic interface design.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 7. Case Studies -->
|
|
<section class="section">
|
|
<p class="section-label">Case Studies</p>
|
|
<h2>Trajectory analysis.</h2>
|
|
|
|
<h3>Case A: Specialized extraction — from 11 turns to 2</h3>
|
|
<p class="text-muted">
|
|
<code>wikipedia_deep_extraction</code> — Navigate to the
|
|
Wikipedia list of Nobel laureates in Physics and report the winners
|
|
for the 3 most recent years, including all co-laureates.
|
|
</p>
|
|
|
|
<div class="grid grid--2 mt-md">
|
|
<div class="card">
|
|
<p class="section-label">
|
|
chrome-devtools-axi — 2 turns · $0.047
|
|
</p>
|
|
<pre><code><span class="annotation">Call 1:</span>
|
|
$ chrome-devtools-axi tables \
|
|
--url "<nobel-physics-url>" \
|
|
2>/dev/null | tail -100
|
|
<span class="annotation">→ Structured table data: years, names,
|
|
countries, and citations for all
|
|
laureates. 2025, 2024, 2023 are
|
|
the last rows.</span>
|
|
|
|
<span class="annotation">Done. Agent reads the output and
|
|
responds with all co-laureates for
|
|
2023–2025. Total time: 7.9s.</span></code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">
|
|
chrome-devtools-mcp-code — 11 turns · $0.194
|
|
</p>
|
|
<pre><code><span class="annotation">Turn 1: Write + run get_nobel.ts
|
|
→ Navigate and dump the raw snapshot.</span>
|
|
|
|
<span class="annotation">Turns 2–4: Write + run probing scripts
|
|
→ Identify the recent-year rows and
|
|
inspect the table structure.</span>
|
|
|
|
<span class="annotation">Turns 5–10: Refine extraction logic
|
|
→ Track rowspans, filter non-person
|
|
links, and verify co-laureates.</span>
|
|
|
|
<span class="annotation">Turn 11: Final extraction succeeds.
|
|
Total time: 58.6s.</span></code></pre>
|
|
</div>
|
|
</div>
|
|
<p class="mt-md">
|
|
AXI’s <code>tables --url</code> command navigates, extracts, and
|
|
structures table data in a single operation. The MCP-code agent
|
|
follows a fundamentally different path: discover tool interfaces, read
|
|
type signatures, write TypeScript, inspect the rendered table, and
|
|
refine extraction logic for continuation rows — 11 turns and
|
|
multiple script iterations to arrive at the same answer. Across all 5
|
|
runs, MCP-code costs $0.103–$0.194 (4–11 turns) vs.
|
|
AXI’s consistent $0.047 (2 turns).
|
|
</p>
|
|
|
|
<hr class="divider" />
|
|
|
|
<h3>Case B: Combined operations still beat a 7-turn script loop</h3>
|
|
<p class="text-muted">
|
|
<code>wikipedia_search_click</code> — Go to Wikipedia, search
|
|
for “Turing Award”, and report who the first recipient
|
|
was.
|
|
</p>
|
|
|
|
<div class="grid grid--2 mt-md">
|
|
<div class="card">
|
|
<p class="section-label">
|
|
chrome-devtools-axi — 5 turns · $0.086
|
|
</p>
|
|
<pre><code><span class="annotation">Call 1:</span>
|
|
$ chrome-devtools-axi navigate --url <url>
|
|
<span class="annotation">→ error: "Unknown command: navigate"
|
|
help[1]: Run `--help` to see commands</span>
|
|
|
|
<span class="annotation">Call 2:</span>
|
|
$ chrome-devtools-axi --help
|
|
<span class="annotation">→ Tips: "Prefer open <url> --query"
|
|
"fill @<uid> --submit fills and
|
|
submits in one step."</span>
|
|
|
|
<span class="annotation">Call 3:</span>
|
|
$ chrome-devtools-axi open \
|
|
"<wikipedia-main-page>" \
|
|
--query "search"
|
|
<span class="annotation">→ Navigate + filter to search field.
|
|
Agent sees @1_11.</span>
|
|
|
|
<span class="annotation">Call 4:</span>
|
|
$ chrome-devtools-axi fill @1_11 \
|
|
"Turing Award" --submit
|
|
<span class="annotation">→ Fill + submit + wait + snapshot
|
|
in one command. Article returned.
|
|
"First recipient: Alan Perlis."</span></code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">
|
|
chrome-devtools-mcp-code — 7 turns · $0.132
|
|
</p>
|
|
<pre><code><span class="annotation">Turns 1–2: Write + run script
|
|
→ Navigate to Wikipedia and capture
|
|
the main-page snapshot.</span>
|
|
|
|
<span class="annotation">Turn 3: Write follow-up script
|
|
→ First attempt fails after guessing
|
|
the wrong wrapper export name.</span>
|
|
|
|
<span class="annotation">Turns 4–6: Read generated exports,
|
|
rewrite with click() + pressKey(),
|
|
and rerun the search sequence.</span>
|
|
|
|
<span class="annotation">Turn 7: Final extraction.
|
|
The Turing Award article states the
|
|
first recipient was Alan Perlis.</span></code></pre>
|
|
</div>
|
|
</div>
|
|
<p class="mt-md">
|
|
The critical command is
|
|
<code>fill @1_11 "Turing Award" --submit</code>. This single
|
|
invocation fills the search box, submits the form, waits for the
|
|
results page, and returns the snapshot — four operations in one
|
|
step. The MCP-code agent still has to orchestrate these as separate
|
|
wrapper calls (<code>click()</code>, <code>typeText()</code>,
|
|
<code>pressKey()</code>, <code>takeSnapshot()</code>), and it spent
|
|
extra turns confirming the generated export names before the sequence
|
|
ran cleanly. Across the rerun, the task ranged from $0.132 to $0.316
|
|
(7–18 turns). This is
|
|
<strong>Principle 4 (pre-computed aggregates)</strong> applied to
|
|
actions: the tool does the multi-step work so the agent doesn’t
|
|
have to.
|
|
</p>
|
|
|
|
<hr class="divider" />
|
|
|
|
<h3>
|
|
Case C: Query filtering eliminates the snapshot–search cycle
|
|
</h3>
|
|
<p class="text-muted">
|
|
<code>wikipedia_infobox_hop</code> — Find the developer of
|
|
Python from its infobox, then follow the link and report when the
|
|
Python Software Foundation was founded.
|
|
</p>
|
|
|
|
<div class="grid grid--2 mt-md">
|
|
<div class="card">
|
|
<p class="section-label">
|
|
chrome-devtools-axi — 5 turns · $0.082
|
|
</p>
|
|
<pre><code><span class="annotation">Call 1:</span>
|
|
$ chrome-devtools-axi navigate --url <url>
|
|
<span class="annotation">→ error: "Unknown command: navigate"
|
|
help[1]: Run `--help` to see commands</span>
|
|
|
|
<span class="annotation">Call 2: --help</span>
|
|
|
|
<span class="annotation">Call 3:</span>
|
|
$ chrome-devtools-axi open \
|
|
"<python-wiki-url>" \
|
|
--query "stable release developer"
|
|
<span class="annotation">→ Navigate + filter snapshot to
|
|
matching lines. Agent sees
|
|
developer and relevant links.</span>
|
|
|
|
<span class="annotation">Call 4:</span>
|
|
$ chrome-devtools-axi click @1_161 \
|
|
--query "founded formed"
|
|
<span class="annotation">→ Click PSF link + search result
|
|
page in one command. Found
|
|
"June 2001". Done.</span></code></pre>
|
|
</div>
|
|
<div class="card">
|
|
<p class="section-label">
|
|
agent-browser — 7 turns · $0.164
|
|
</p>
|
|
<pre><code><span class="annotation">Call 1: --help
|
|
→ Discover available commands.</span>
|
|
|
|
<span class="annotation">Call 2: open + wait 2000 + snapshot
|
|
→ Full snapshot of Python page.
|
|
Agent manually scans for infobox.</span>
|
|
|
|
<span class="annotation">Call 3: click + wait 2000 + snapshot
|
|
→ Click link. Wait for load.
|
|
Take full snapshot of new page.</span>
|
|
|
|
<span class="annotation">Call 4: get url
|
|
→ Verify navigation succeeded.</span>
|
|
|
|
<span class="annotation">Call 5: find text "Python Software
|
|
Foundation" click + wait + get url
|
|
→ Retry click with text match.</span>
|
|
|
|
<span class="annotation">Call 6: eval document.querySelector
|
|
→ DOM query to extract link URL.</span>
|
|
|
|
<span class="annotation">Call 7: open + wait 2000 + snapshot
|
|
→ Navigate to PSF page. Full
|
|
snapshot. Manual scan. Done.</span></code></pre>
|
|
</div>
|
|
</div>
|
|
<p class="mt-md">
|
|
AXI’s <code>--query</code> flag turns every command into a
|
|
filtered view.
|
|
<code>open --query "stable release developer"</code> returns
|
|
only the matching lines from the snapshot instead of the full
|
|
Wikipedia page.
|
|
<code>click @id --query "founded formed"</code> clicks the
|
|
link <em>and</em>
|
|
searches the resulting page in one step. The agent-browser condition
|
|
has no equivalent — every action requires a separate
|
|
<code>wait</code> + <code>snapshot</code> cycle, plus verification
|
|
steps (<code>get url</code>, <code>eval</code>) to confirm the action
|
|
worked. This is <strong>Principle 9 (contextual disclosure)</strong>:
|
|
the tool returns targeted, relevant output after each action instead
|
|
of dumping the full page state.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 8. Limitations -->
|
|
<section class="section">
|
|
<p class="section-label">Limitations</p>
|
|
<h2>Caveats.</h2>
|
|
<ul>
|
|
<li>
|
|
<strong>Public websites only.</strong> All tasks target public sites
|
|
(Wikipedia, GitHub, example.com). Results may vary on authenticated
|
|
or dynamic web applications.
|
|
</li>
|
|
<li>
|
|
<strong>Single agent model evaluated.</strong> The published results
|
|
use Claude Sonnet 4.6. This is not a limit of the harness —
|
|
both benchmarks accept <code>--model</code> (for example
|
|
<code>--model claude-opus-4-6</code>) — but other models are
|
|
not evaluated here and may exhibit different sensitivities to output
|
|
format.
|
|
</li>
|
|
<li>
|
|
<strong>Read-only tasks.</strong> The benchmark includes only read
|
|
and navigation operations. Form submissions and complex interactions
|
|
introduce additional challenges.
|
|
</li>
|
|
<li>
|
|
<strong>LLM judge.</strong> Task success is determined by an LLM
|
|
judge, which may introduce scoring biases.
|
|
</li>
|
|
<li>
|
|
<strong>Domain-specific implementation.</strong> While the AXI
|
|
principles are domain-general, this evaluation focuses on browser
|
|
automation. The
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>GitHub benchmark</a
|
|
>
|
|
provides cross-domain validation.
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<!-- 9. Conclusion -->
|
|
<section class="section">
|
|
<p class="section-label">Implication</p>
|
|
<h2 data-annotate>
|
|
The answer is [principled design], not protocol choice.
|
|
</h2>
|
|
<p>
|
|
The debate between CLI and MCP as agent-tool interfaces misses the
|
|
deeper question: what design principles make any interface effective
|
|
for agents? This evaluation shows that a principled CLI design (AXI)
|
|
leads both raw CLI and MCP on every metric — success, cost,
|
|
duration, and turns.
|
|
</p>
|
|
<p>
|
|
In browser automation, AXI achieves 100% reliability at $0.074/task
|
|
and 4.5 turns, compared to $0.088 and 4.8 turns for raw CLI and $0.100
|
|
and 6.2 turns for MCP. The primary mechanism is specialized commands:
|
|
AXI’s <code>tables --url</code> reduces extraction tasks to a
|
|
single 2-turn interaction, while combined operations
|
|
(<code>open</code>, <code>click --query</code>) eliminate the separate
|
|
snapshot calls that MCP conditions require. Shell composability (<code
|
|
>| grep</code
|
|
>, <code>| tail</code>) keeps per-turn token volume compact.
|
|
</p>
|
|
<p>
|
|
A separate GitHub benchmark validates the same pattern: AXI at 100%
|
|
success and $0.050/task vs. 86% and $0.054 for CLI, and 82–87%
|
|
and $0.101–$0.148 for MCP. The 10 AXI principles provide a
|
|
concrete, testable framework for designing agent-ergonomic interfaces
|
|
that are both reliable and cost-efficient.
|
|
</p>
|
|
</section>
|
|
|
|
<!-- References -->
|
|
<footer
|
|
class="section"
|
|
id="references"
|
|
style="padding-bottom: var(--space-xl)"
|
|
>
|
|
<p class="section-label">References</p>
|
|
<ol>
|
|
<li id="ref-mcp">
|
|
<a href="https://modelcontextprotocol.io"
|
|
>Anthropic. Model Context Protocol specification.</a
|
|
>
|
|
Technical report, 2024.
|
|
</li>
|
|
<li id="ref-smithery">
|
|
<a href="https://smithery.ai/blog/mcp-vs-cli-is-the-wrong-fight"
|
|
>H. Mao and R. Pradhan. “MCP vs CLI is the wrong
|
|
fight.”</a
|
|
>
|
|
Smithery Blog, March 2026.
|
|
</li>
|
|
<li id="ref-anthropic-code">
|
|
<a
|
|
href="https://www.anthropic.com/engineering/code-execution-with-mcp"
|
|
>A. Jones and C. Kelly. “Code execution with MCP: Building
|
|
more efficient agents.”</a
|
|
>
|
|
Anthropic Engineering Blog, November 2025.
|
|
</li>
|
|
<li id="ref-cloudflare-code">
|
|
<a href="https://blog.cloudflare.com/code-mode/"
|
|
>K. Varda and S. Pai. “Code Mode: The better way to use
|
|
MCP.”</a
|
|
>
|
|
Cloudflare Blog, September 2025.
|
|
</li>
|
|
<li id="ref-github-bench">
|
|
<a
|
|
href="https://github.com/kunchenguid/axi/blob/main/bench-github/published-results/STUDY.md"
|
|
>K. Chen. “AXI Benchmark Study: Agent Interface Comparison
|
|
(GitHub).”</a
|
|
>
|
|
425-run benchmark comparing gh-axi, gh CLI, and GitHub MCP, 2026.
|
|
</li>
|
|
</ol>
|
|
<p class="text-sm text-muted mt-xl">
|
|
<a href="https://github.com/kunchenguid/axi" target="_blank"
|
|
>GitHub Repo</a
|
|
>
|
|
·
|
|
<a href="https://x.com/kunchenguid" target="_blank">Kun Chen</a>
|
|
Presents
|
|
</p>
|
|
</footer>
|
|
</div>
|
|
<script>
|
|
function copyBlock(btn) {
|
|
const code = btn.closest("pre").querySelector("code");
|
|
const copyIcon = btn.querySelector(".icon-copy");
|
|
const checkIcon = btn.querySelector(".icon-check");
|
|
navigator.clipboard.writeText(code.textContent).then(() => {
|
|
copyIcon.style.display = "none";
|
|
checkIcon.style.display = "block";
|
|
btn.style.color = "var(--color-accent)";
|
|
setTimeout(() => {
|
|
copyIcon.style.display = "block";
|
|
checkIcon.style.display = "none";
|
|
btn.style.color = "";
|
|
}, 1500);
|
|
});
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|