Skip to content

docs(catalog): list official and community AXIs in alphabetical order - #219

Closed
leecalcote wants to merge 1 commit into
kunchenguid:mainfrom
leecalcote:docs/catalog-alphabetical-order
Closed

leecalcote wants to merge 1 commit into
kunchenguid:mainfrom
leecalcote:docs/catalog-alphabetical-order

Conversation

@leecalcote

Copy link
Copy Markdown

Intent

Reorder the Ecosystem AXI implementations in the catalog in README.md alphabetically, then push the feature branch to the fork (leecalcote/axi) and open a PR in upstream (kunchenguid/axi). Both the Official and Community tables are sorted A-Z by AXI name (catalog.yaml is the single source of truth; README.md and docs/index.html are regenerated via pnpm run docs:gen with no hand edits to generated regions). The two duplicate ado-axi community entries are ordered by author as tiebreak (dtabolich before jeffreyhaen). Admission-review comments travel with their superbee and vercel-axi entries. Contributor guidance in catalog.yaml header and CONTRIBUTING.md now asks for alphabetical insertion to keep the order stable.

What Changed

  • Sorted the official and community lists in catalog.yaml A-Z by AXI name. All 90 entries are still there. The two ado-axi community entries are ordered by author (dtabolich, then jeffreyhaen), and the admission-review comment blocks moved with their superbee and vercel-axi entries.
  • Regenerated the catalog tables in README.md and docs/index.html with pnpm run docs:gen. Nothing in the generated regions was edited by hand.
  • Updated the contributor guidance in the catalog.yaml header comment and in CONTRIBUTING.md: new entries now go in alphabetical order by name instead of being appended at the end.

Risk Assessment

✅ Low: The change only reorders documentation. Parsing both versions shows the same entries before and after (4 official, 86 community, deep-equal). Both lists are strictly A-Z, with author tiebreaks for ado-axi and asana-axi. The superbee and vercel-axi admission comments sit directly above their entries. Every README and docs/index.html diff hunk falls inside the generated catalog regions, and those tables list entries in exactly the catalog.yaml order.

Testing

I ran the real docs generator (docs:check, a docs:gen pass that changed nothing, and its own test file) and a YAML-level check against origin/main. I served the axi.md site locally and loaded it in an isolated headless Chrome. The Official (4) and Community (86) tables render A-Z and match catalog.yaml row for row, with screenshots of the top, the bottom, and the full section. A GitHub-style rendering of the README catalog, captured as a screenshot, shows the same order. Two adversarial runs in a throwaway sandbox also passed: a new entry inserted alphabetically lands in the correct row with nothing else moving, and manually reordered generated rows are rejected by docs:check. Three scenarios were checked only statically, so they are marked untested: entries preserved compared with origin/main, admission comments attached to their entries, and the contributor guidance text. Every scenario that ran live passed. Pushing to the fork and opening the upstream PR belong to later pipeline phases and were not run here.

  • Live validation: ✅ go - 7 of 11 scenarios driven live against the product
Scenario Result Live Evidence
Visitor opens the axi.md site and sees the Official table A-Z: chrome-devtools-axi, gh-axi, lavish-axi, quota-axi ✅ pass live site-catalog-official-and-community-top.png; rendered-site-dom-order.txt (officialSorted: true, order equals catalog.yaml)
Visitor opens the axi.md site and sees all 86 Community rows A-Z, matching catalog.yaml row for row (ado-axi first, wrangler-axi last) ✅ pass live site-catalog-full-section.png, site-catalog-community-bottom-superbee-vercel.png; rendered-site-dom-order.txt (communitySorted: true, order equals catalog.yaml)
The duplicate ado-axi entries render with author as tiebreak: dtabolich before jeffreyhaen (site, README, catalog.yaml) ✅ pass live site-catalog-official-and-community-top.png, readme-catalog-rendered-top.png, verify-catalog-output.txt
Reader views README.md's AXI Catalog as GitHub would render it and sees both tables A-Z ✅ pass live readme-catalog-rendered-top.png, readme-catalog-rendered.html; verify-catalog-output.txt (README table rows in catalog.yaml order)
Generated regions in README.md and docs/index.html were produced by pnpm run docs:gen with no hand edits (docs:check passes; docs:gen changes nothing) ✅ pass live docs-check-and-gen.txt
The reorder loses, adds, or changes no catalog entry: same 4 official and 86 community entries as origin/main, every field identical ⏸️ untested no The prior payload did not establish a live result. It checked this only by parsing catalog.yaml against origin/main with verify-catalog.mjs, which is a static comparison, not a run of the product. The…
The admission-review comments stay attached to the superbee and vercel-axi entries ⏸️ untested no The prior payload did not establish a live result. YAML comments are never rendered to any product surface, so the only check was a static parse of catalog.yaml. This property has no live surface to d…
Adversarial: a contributor follows the new guidance and inserts kafka-axi alphabetically; docs:gen places it between jj-axi and kubernetes-axi in README and site, no other row moves, and docs:check pa… ✅ pass live sandbox-alphabetical-insert.txt
Adversarial: manually reordering generated rows (ado-axi swap in README, gh-axi above chrome-devtools-axi on the site) is rejected by docs:check, and regenerating restores A-Z output ✅ pass live sandbox-hand-edit-guard.txt
Contributor guidance in the catalog.yaml header and CONTRIBUTING.md asks for alphabetical insertion ⏸️ untested no The prior payload did not establish a live result. The guidance is prose with no runtime surface and was checked only by reading the diff (git diff e15f82d..HEAD -- CONTRIBUTING.md catalog.yaml). Th…
Feature branch is pushed to the leecalcote/axi fork and a PR is opened in kunchenguid/axi ⏸️ untested no Pushing and opening the PR belong to the outer no-mistakes executor's push and PR phases. This test phase is not allowed to push or open PRs, so it could not be done here.
  • Evidence: axi.md site: Official table A-Z and Community top (ado-axi dtabolich before jeffreyhaen) (local file: ~/.no-mistakes/evidence/01M3MZE1R43PF8V9XEYZWQ4X02/site-catalog-official-and-community-top.png)
  • Evidence: axi.md site: Community table bottom (shopify-axi through wrangler-axi, including superbee and vercel-axi) (local file: ~/.no-mistakes/evidence/01M3MZE1R43PF8V9XEYZWQ4X02/site-catalog-community-bottom-superbee-vercel.png)
  • Evidence: axi.md site: full-height capture of the whole catalog section (all 90 rows) (local file: ~/.no-mistakes/evidence/01M3MZE1R43PF8V9XEYZWQ4X02/site-catalog-full-section.png)
  • Evidence: axi.md site: middle crop of the full section (databricks-axi through mesheryctl-axi) (local file: ~/.no-mistakes/evidence/01M3MZE1R43PF8V9XEYZWQ4X02/site-catalog-full-section-middle-crop.png)
  • Evidence: README.md catalog rendered GitHub-style (Official A-Z, Community A-Z with author tiebreak) (local file: ~/.no-mistakes/evidence/01M3MZE1R43PF8V9XEYZWQ4X02/readme-catalog-rendered-top.png)
Evidence: README.md catalog section rendered to HTML
<!doctype html><html><head><meta charset="utf-8"><title>README.md catalog (rendered)</title><style>/*light */
.markdown-body {
  color-scheme: light;
  /** CSS default easing. Use for hover state changes and micro-interactions. */
  /** Accelerating motion. Use for elements exiting the viewport (moving off-screen). */
  /** Smooth acceleration and deceleration. Use for elements moving or morphing within the viewport. */
  /** Decelerating motion. Use for elements entering the viewport or appearing on screen. */
  /** Constant motion with no acceleration. Use for continuous animations like progress bars or loaders. */
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  margin: 0;
  font-weight: 400;
  color: #1f2328;
  background-color: #ffffff;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
  font-size: 16px;
  line-height: 1.5;
  word-wrap: break-word;
}

.markdown-body a {
  text-decoration: underline;
  text-underline-offset: .2rem;
}

.markdown-body .octicon {
  display: inline-block;
  fill: currentColor;
  vertical-align: text-bottom;
}

.markdown-body h1:hover .anchor .octicon-link:before,
.markdown-body h2:hover .anchor .octicon-link:before,
.markdown-body h3:hover .anchor .octicon-link:before,
.markdown-body h4:hover .anchor .octicon-link:before,
.markdown-body h5:hover .anchor .octicon-link:before,
.markdown-body h6:hover .anchor .octicon-link:before {
  width: 16px;
  height: 16px;
  content: ' ';
  display: inline-block;
  background-color: currentColor;
  -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
  mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
}

.markdown-body details,
.markdown-body figcaption,
.markdown-body figure {
  display: block;
}

.markdown-body summary {
  display: list-item;
}

.markdown-body [hidden] {
  display: none !important;
}

.markdown-body a {
  background-color: rgba(0,0,0,0);
  color: #0969da;
  text-decoration: none;
}

.markdown-body abbr[title] {
  border-bottom: none;
  -webkit-text-decoration: underline dotted;
  text-decoration: underline dotted;
}

.markdown-body b,
.markdown-body strong {
  font-weight: 600;
}

.markdown-body dfn {
  font-style: italic;
}

.markdown-body h1 {
  margin: .67em 0;
  font-weight: 600;
  padding-bottom: .3em;
  font-size: 2em;
  border-bottom: 1px solid #d1d9e0b3;
}

.markdown-body mark {
  background-color: #fff8c5;
  color: #1f2328;
}

.markdown-body small {
  font-size: 90%;
}

.markdown-body sub,
.markdown-body sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

.markdown-body sub {
  bottom: -0.25em;
}

.markdown-body sup {
  top: -0.5em;
}

.markdown-body img {
  border-style: none;
  max-width: 100%;
  box-sizing: content-box;
}

.markdown-body code,
.markdown-body kbd,
.markdown-body pre,
.markdown-body samp {
  font-family: monospace;
  font-size: 1em;
}

.markdown-body figure {
  margin: 1em 2.5rem;
}

.markdown-body hr {
  box-sizing: content-box;
  overflow: hidden;
  background: rgba(0,0,0,0);
  border-bottom: 1px solid #d1d9e0b3;
  height: .25em;
  padding: 0;
  margin: 1.5rem 0;
  background-color: #d1d9e0;
  border: 0;
}

.markdown-body input {
  font: inherit;
  margin: 0;
  overflow: visible;
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
}

.markdown-body [type=button],
.markdown-body [type=reset],
.markdown-body [type=submit] {
  -webkit-appearance: button;
  appearance: button;
}

.markdown-body [type=checkbox],
.markdown-body [type=radio] {
  box-sizing: border-box;
  padding: 0;
}

.markdown-body [type=number]::-webkit-inner-spin-button,
.markdown-body [type=number]::-webkit-outer-spin-button {
  height: auto;
}

.markdown-body [type=search]::-webkit-search-cancel-button,
.markdown-body [type=search]::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
}

.markdown-body ::-webkit-input-placeholder {
  color: inherit;
  opacity: .54;
}

.markdown-body ::-webkit-file-upload-button {
  -webkit-appearance: button;
  appearance: button;
  font: inherit;
}

.markdown-body a:hover {
  text-decoration: underline;
}

.markdown-body ::placeholder {
  color: #59636e;
  opacity: 1;
}

.markdown-body hr::before {
  display: table;
  content: "";
}

.markdown-body hr::after {
  display: table;
  clear: both;
  content: "";
}

.markdown-body table {
  border-spacing: 0;
  border-collapse: collapse;
  display: block;
  width: max-content;
  max-width: 100%;
  overflow: auto;
  font-variant: tabular-nums;
}

.markdown-body td,
.markdown-body th {
  padding: 0;
}

.markdown-body details summary {
  cursor: pointer;
}

.markdown-body a:focus,
.markdown-body [role=button]:focus,
.markdown-body input[type=radio]:focus,
.markdown-body input[type=checkbox]:focus {
  outline: 2px solid var(--borderColor-accent-emphasis);
  outline-offset: -2px;
  box-shadow: none;
}

.markdown-body a:focus:not(:focus-visible),
.markdown-body [role=button]:focus:not(:focus-visible),
.markdown-body input[type=radio]:focus:not(:focus-visible),
.markdown-body input[type=checkbox]:focus:not(:focus-visible) {
  outline: solid 1px rgba(0,0,0,0);
}

.markdown-body a:focus-visible,
.markdown-body [role=button]:focus-visible,
.markdown-body input[type=radio]:focus-visible,
.markdown-body input[type=checkbox]:focus-visible {
  outline: 2px solid var(--borderColor-accent-emphasis);
  outline-offset: -2px;
  box-shadow: none;
}

.markdown-body a:not([class]):focus,
.markdown-body a:not([class]):focus-visible,
.markdown-body input[type=radio]:focus,
.markdown-body input[type=radio]:focus-visible,
.markdown-body input[type=checkbox]:focus,
.markdown-body input[type=checkbox]:focus-visible {
  outline-offset: 0;
}

.markdown-body kbd {
  display: inline-block;
  padding: 0.25rem;
  font: 11px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
  line-height: 10px;
  color: #1f2328;
  vertical-align: middle;
  background-color: #f6f8fa;
  border: solid 1px var(--borderColor-muted);
  border-bottom-color: var(--borderColor-muted);
  border-radius: 6px;
  box-shadow: inset 0 -1px 0 var(--borderColor-muted);
}

.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
  margin-top: 1.5rem;
  margin-bottom: 1rem;
  font-weight: 600;
  line-height: 1.25;
}

.markdown-body h2 {
  font-weight: 600;
  padding-bottom: .3em;
  font-size: 1.5em;
  border-bottom: 1px solid #d1d9e0b3;
}

.markdown-body h3 {
  font-weight: 600;
  font-size: 1.25em;
}

.markdown-body h4 {
  font-weight: 600;
  font-size: 1em;
}

.markdown-body h5 {
  font-weight: 600;
  font-size: .875em;
}

.markdown-body h6 {
  font-weight: 600;
  font-size: .85em;
  color: #59636e;
}

.markdown-body p {
  margin-top: 0;
  margin-bottom: 10px;
}

.markdown-body blockquote {
  margin: 0;
  padding: 0 1em;
  color: #59636e;
  border-left: .25em solid #d1d9e0;
}

.markdown-body ul,
.markdown-body ol {
  margin-top: 0;
  margin-bottom: 0;
  padding-left: 2em;
}

.markdown-body ol ol,
.markdown-body ul ol {
  list-style-type: lower-roman;
}

.markdown-body ul ul ol,
.markdown-body ul ol ol,
.markdown-body ol 

... [35878 bytes truncated] ...

ealso/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/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&#39;s hosted MCP server as a scriptable, headless CLI.</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/radityasurya/plane-axi"><code>plane-axi</code></a></td>
<td>radityasurya</td>
<td>Project tracking</td>
<td>Manage Plane projects, issues, states, priorities, and comments with sequence-ID addressing (<code>#110</code>), name-based project/state resolution, and idempotent close - for Plane Cloud or self-hosted Plane.</td>
</tr>
<tr>
<td><a href="https://github.com/brycehamrick/playwright-axi"><code>playwright-axi</code></a></td>
<td>brycehamrick</td>
<td>Browser automation</td>
<td>Navigate, click, fill, and extract with combined operations, inline filtered snapshots, and TOON output. Wraps the <code>playwright</code> npm package&#39;s agent 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/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/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/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/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/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/Azd325/router-axi"><code>router-axi</code></a></td>
<td>Azd325</td>
<td>Router / TR-064</td>
<td>Agent-ergonomic router inspection CLI - read-only TR-064 inspection (device, WAN, traffic, calls, devices, leases, Wi-Fi, guest Wi-Fi, port forwards) plus confirmed mutations (<code>wifi enable|disable</code>, <code>reboot</code>) and configuration backup over documented FRITZ!Box TR-064 interfaces.</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/elliottkan/shopify-axi"><code>shopify-axi</code></a></td>
<td>elliottkan</td>
<td>Shopify</td>
<td>Search shopify.dev and validate generated GraphQL, Liquid themes, and Polaris components against the real schemas - wraps Shopify&#39;s Dev MCP server and exits non-zero on hallucinated fields.</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/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/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/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/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/brycehamrick/tally-axi"><code>tally-axi</code></a></td>
<td>brycehamrick</td>
<td>Forms / Surveys</td>
<td>Read Tally forms and submissions field-by-field and manage FORM_RESPONSE webhooks over the public Tally REST API - pre-computed counts, truncation with a <code>--full</code> escape hatch, and token-efficient TOON output.</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/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/brycehamrick/walter-axi"><code>walter-axi</code></a></td>
<td>brycehamrick</td>
<td>AI content editing</td>
<td>Detect AI-generated patterns, humanize drafts with locked keywords, and batch QA content through the WalterWrites MCP server - <code>--confirm</code> gates on credit-consuming writes.</td>
</tr>
<tr>
<td><a href="https://github.com/brycehamrick/wordpress-axi"><code>wordpress-axi</code></a></td>
<td>brycehamrick</td>
<td>CMS / WordPress</td>
<td>Publish and moderate posts, pages, media, terms, comments, users, and settings, and inspect plugins and themes over the core WordPress REST API - new content defaults to draft, publication and deletion are <code>--confirm</code>-gated.</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>
</tbody></table>
</article></body></html>
Evidence: Live DOM row order compared with catalog.yaml

rendered official == catalog.yaml official order: true rendered community == catalog.yaml community order: true rendered official sorted: true | rendered community sorted: true | rows: 4 86

result: "\"{\\\"officialCount\\\":4,\\\"official\\\":[\\\"chrome-devtools-axi\\\",\\\"gh-axi\\\",\\\"lavish-axi\\\",\\\"quota-axi\\\"],\\\"officialSorted\\\":true,\\\"communityCount\\\":86,\\\"communitySorted\\\":true,\\\"communityFirst6\\\":[\\\"ado-axi|dtabolich\\\",\\\"ado-axi|jeffreyhaen\\\",\\\"asana-axi|brycehamrick\\\",\\\"asana-axi|elliottkan\\\",\\\"aws-axi|thatdudealso\\\",\\\"axi-axi|CodyEngel\\\"],\\\"communityLast4\\\":[\\\"vercel-axi|ardaatahan\\\",\\\"walter-axi|brycehamrick\\\",\\\"wordpress-axi|brycehamrick\\\",\\\"wrangler-axi|masculinecache\\\"],\\\"ado\\\":[\\\"ado-axi|dtabolich\\\",\\\"ado-axi|jeffreyhaen\\\"],\\\"superbeeIdx\\\":79,\\\"community\\\":[\\\"ado-axi|dtabolich\\\",\\\"ado-axi|jeffreyhaen\\\",\\\"asana-axi|brycehamrick\\\",\\\"asana-axi|elliottkan\\\",\\\"aws-axi|thatdudealso\\\",\\\"axi-axi|CodyEngel\\\",\\\"az-axi|masyanru\\\",\\\"basecamp-axi|calebl\\\",\\\"brevo-axi|brycehamrick\\\",\\\"bun-axi|mlegls\\\",\\\"bws-axi|masculinecache\\\",\\\"calcom-axi|simkimsia\\\",\\\"calendly-axi|Jarvus Innovations\\\",\\\"canva-axi|ardaatahan\\\",\\\"cargo-axi|AG9898\\\",\\\"celery-axi|thatdudealso\\\",\\\"chezmoi-axi|masculinecache\\\",\\\"clickup-axi|JanSuthacheeva\\\",\\\"clockify-axi|elliottkan\\\",\\\"cloudflare-axi|simkimsia\\\",\\\"comfy-cloud-axi|intelligentrascal\\\",\\\"confluence-axi|emilchristensen\\\",\\\"coolify-axi|radityasurya\\\",\\\"cyber-mux|unional\\\",\\\"databricks-axi|p33ves\\\",\\\"design-system-axi|isamrish\\\",\\\"docker-axi|thatdudealso\\\",\\\"doctl-axi|batamire\\\",\\\"dynamodb-axi|thatdudealso\\\",\\\"elasticsearch-axi|thatdudealso\\\",\\\"fal-axi|ardaatahan\\\",\\\"figma-axi|ardaatahan\\\",\\\"firecrawl-axi|brycehamrick\\\",\\\"forgejo-axi|escidmore\\\",\\\"frontier-axi|oguzalp7\\\",\\\"gerrit-axi|slnkjthien\\\",\\\"gitsheets-axi|Jarvus Innovations\\\",\\\"glab-axi|karotkriss\\\",\\\"gws-axi|Jarvus Innovations\\\",\\\"ha-axi|batamire\\\",\\\"harvest-axi|Jarvus Innovations\\\",\\\"homebrew-axi|mstuart\\\",\\\"jev-axi|shiftynick\\\",\\\"jira-axi|emilchristensen\\\",\\\"jj-axi|aivv73\\\",\\\"kubernetes-axi|thatdudealso\\\",\\\"linear-sdk-axi|shiftynick\\\",\\\"mastra-axi|taltas\\\",\\\"mem-axi|masculinecache\\\",\\\"mesheryctl-axi|Meshery Authors\\\",\\\"metabase-axi|Jarvus Innovations\\\",\\\"mobbin-axi|intelligentrascal\\\",\\\"mongodb-axi|thatdudealso\\\",\\\"msgraph-axi|jeffreyhaen\\\",\\\"mssql-axi|jeffreyhaen\\\",\\\"n8n-axi|brycehamrick\\\",\\\"netlify-axi|simkimsia\\\",\\\"notion-axi|maximebrmd\\\",\\\"npm-axi|SSBrouhard\\\",\\\"obsidian-axi|AndersHoffmann\\\",\\\"open-design-axi|brycehamrick\\\",\\\"oracle-axi|thatdudealso\\\",\\\"otter-axi|Jarvus Innovations\\\",\\\"pg-axi|thatdudealso\\\",\\\"plane-axi|radityasurya\\\",\\\"playwright-axi|brycehamrick\\\",\\\"porkbun-axi|ardaatahan\\\",\\\"pypi-axi|mstuart\\\",\\\"railway-axi|simkimsia\\\",\\\"reactive-axi|adeeshsharma\\\",\\\"redis-axi|thatdudealso\\\",\\\"remarkable-axi|Jarvus Innovations\\\",\\\"router-axi|Azd325\\\",\\\"screencast-axi|Valzon\\\",\\\"shopify-axi|elliottkan\\\",\\\"slack-axi|Jarvus Innovations\\\",\\\"specops|Jarvus Innovations\\\",\\\"sqlite-axi|SSBrouhard\\\",\\\"supabase-axi|laizhenyoong\\\",\\\"superbee|Holaxis\\\",\\\"tally-axi|brycehamrick\\\",\\\"trello-axi|enzodevs\\\",\\\"vercel-axi|ardaatahan\\\",\\\"walter-axi|brycehamrick\\\",\\\"wordpress-axi|brycehamrick\\\",\\\"wrangler-axi|masculinecache\\\"]}\""
help[1]:
  Run `chrome-devtools-axi snapshot` to see current page state
rendered official == catalog.yaml official order: true
rendered community == catalog.yaml community order: true
rendered official sorted: true | rendered community sorted: true | rows: 4 86
Evidence: YAML-level verification against origin/main

PASS official: same 4 entries as base (4), every field byte-identical PASS community: same 86 entries as base (86), every field byte-identical PASS official: sorted A-Z by name PASS community: sorted A-Z by name PASS ado-axi duplicates ordered by author: dtabolich before jeffreyhaen PASS every leading comment is attached to the same entry with identical text PASS superbee admission-review comment directly precedes superbee PASS vercel-axi admission-review comment directly precedes vercel-axi PASS README catalog-official: 4 rows in catalog.yaml A-Z order PASS README catalog-community: 86 rows in catalog.yaml A-Z order ALL CHECKS PASSED

PASS  official: same 4 entries as base (4), every field byte-identical
PASS  community: same 86 entries as base (86), every field byte-identical
PASS  official: sorted A-Z by name
PASS  community: sorted A-Z by name
      official order: chrome-devtools-axi, gh-axi, lavish-axi, quota-axi
      duplicate ado-axi: dtabolich before jeffreyhaen
      duplicate asana-axi: brycehamrick before elliottkan
PASS  ado-axi duplicates ordered by author: dtabolich before jeffreyhaen
      entries with a leading comment: base=[community:superbee:Holaxis, community:vercel-axi:ardaatahan] head=[community:superbee:Holaxis, community:vercel-axi:ardaatahan]
PASS  every leading comment is attached to the same entry with identical text
PASS  superbee admission-review comment directly precedes superbee
PASS  vercel-axi admission-review comment directly precedes vercel-axi
PASS  README catalog-official: 4 rows in catalog.yaml A-Z order (first: chrome-devtools-axi, last: quota-axi)
PASS  README catalog-community: 86 rows in catalog.yaml A-Z order (first: ado-axi, last: wrangler-axi)

ALL CHECKS PASSED
Evidence: Verification script used
// Semantic verification of the alphabetical catalog reorder.
// Usage: node verify-catalog.mjs <worktree> <base-catalog.yaml> <head-catalog.yaml>
import { createRequire } from "node:module";
import { readFileSync } from "node:fs";
import { join } from "node:path";

const [worktree, basePath, headPath] = process.argv.slice(2);
const require = createRequire(join(worktree, "package.json"));
const YAML = require("yaml");

let failures = 0;
const ok = (cond, msg) => {
  console.log(`${cond ? "PASS" : "FAIL"}  ${msg}`);
  if (!cond) failures += 1;
};

const baseText = readFileSync(basePath, "utf8");
const headText = readFileSync(headPath, "utf8");
const base = YAML.parse(baseText);
const head = YAML.parse(headText);

// 1. No entry lost, added, or mutated (multiset of full entries per list).
for (const list of ["official", "community"]) {
  const key = (e) => JSON.stringify(e);
  const b = base[list].map(key).sort();
  const h = head[list].map(key).sort();
  ok(
    b.length === h.length && b.every((v, i) => v === h[i]),
    `${list}: same ${h.length} entries as base (${b.length}), every field byte-identical`,
  );
}

// 2. A-Z by name, author as tiebreak.
const cmp = (a, b) =>
  a.name.localeCompare(b.name, "en", { sensitivity: "base" }) ||
  (a.author ?? "").localeCompare(b.author ?? "", "en", { sensitivity: "base" });
for (const list of ["official", "community"]) {
  const entries = head[list];
  const bad = [];
  for (let i = 1; i < entries.length; i++) {
    if (cmp(entries[i - 1], entries[i]) > 0) {
      bad.push(`${entries[i - 1].name}/${entries[i - 1].author} > ${entries[i].name}/${entries[i].author}`);
    }
    // Codepoint order must agree too (all names are lowercase ASCII).
    if (entries[i - 1].name > entries[i].name) bad.push(`codepoint: ${entries[i - 1].name} > ${entries[i].name}`);
  }
  ok(bad.length === 0, `${list}: sorted A-Z by name${bad.length ? " -> " + bad.join("; ") : ""}`);
}
console.log(`      official order: ${head.official.map((e) => e.name).join(", ")}`);

// 3. Duplicate names ordered by author.
const byName = new Map();
for (const e of head.community) byName.set(e.name, [...(byName.get(e.name) ?? []), e.author]);
for (const [name, authors] of byName) {
  if (authors.length > 1) console.log(`      duplicate ${name}: ${authors.join(" before ")}`);
}
const ado = byName.get("ado-axi") ?? [];
ok(
  ado.length === 2 && ado[0] === "dtabolich" && ado[1] === "jeffreyhaen",
  `ado-axi duplicates ordered by author: ${ado.join(" before ")}`,
);

// 4. Comments stay attached to the same entries (YAML AST commentBefore).
function commentsByEntry(text) {
  const doc = YAML.parseDocument(text);
  const out = new Map();
  for (const list of ["official", "community"]) {
    for (const item of doc.get(list).items) {
      const id = `${list}:${item.get("name")}:${item.get("author") ?? ""}`;
      if (item.commentBefore) out.set(id, item.commentBefore);
    }
  }
  return out;
}
const bc = commentsByEntry(baseText);
const hc = commentsByEntry(headText);
console.log(`      entries with a leading comment: base=[${[...bc.keys()].join(", ")}] head=[${[...hc.keys()].join(", ")}]`);
ok(
  bc.size === hc.size && [...bc].every(([k, v]) => hc.get(k) === v),
  "every leading comment is attached to the same entry with identical text",
);
const sb = hc.get("community:superbee:Holaxis") ?? "";
const vc = hc.get("community:vercel-axi:ardaatahan") ?? "";
ok(sb.includes("inspected") && sb.includes("Holaxis-ai/superbee") && sb.includes("admitted."), "superbee admission-review comment directly precedes superbee");
ok(vc.includes("inspected") && vc.includes("ardaatahan/vercel-axi") && vc.includes("admitted."), "vercel-axi admission-review comment directly precedes vercel-axi");

// 5. README generated tables (public output contract) follow the same A-Z order.
const readme = readFileSync(join(worktree, "README.md"), "utf8");
function region(text, name) {
  const s = text.indexOf(`<!-- generated:${name}:start -->`);
  const e = text.indexOf(`<!-- generated:${name}:end -->`);
  return text.slice(s, e);
}
for (const [list, regionName] of [["official", "catalog-official"], ["community", "catalog-community"]]) {
  const rows = region(readme, regionName)
    .split("\n")
    .filter((l) => l.startsWith("| [`"))
    .map((l) => {
      const cells = l.split(" | ").map((c) => c.trim());
      return { name: /\[`([^`]+)`\]/.exec(cells[0])[1], author: list === "community" ? cells[1] : undefined };
    });
  const expected = head[list].map((e) => `${e.name}/${e.author ?? ""}`);
  const got = rows.map((r) => `${r.name}/${r.author ?? ""}`);
  ok(
    got.length === expected.length && got.every((v, i) => v === expected[i]),
    `README ${regionName}: ${got.length} rows in catalog.yaml A-Z order (first: ${rows[0]?.name}, last: ${rows.at(-1)?.name})`,
  );
}

console.log(failures === 0 ? "\nALL CHECKS PASSED" : `\n${failures} CHECK(S) FAILED`);
process.exitCode = failures ? 1 : 0;
Evidence: docs:check passes; docs:gen changes nothing

$ pnpm run docs:check docs:check ok — generated regions match their sources exit=0 $ pnpm run docs:gen generated regions already up to date exit=0 $ git status --porcelain README.md docs/index.html catalog.yaml (end)

$ pnpm run docs:check
$ node scripts/generate-docs.mjs --check
docs:check ok — generated regions match their sources
exit=0

$ pnpm run docs:gen
$ node scripts/generate-docs.mjs
generated regions already up to date
exit=0

$ git status --porcelain README.md docs/index.html catalog.yaml (empty = generated output byte-identical to committed)
(end)
Evidence: Sandbox: new entry inserted alphabetically is rendered in the correct row
\### Scenario: contributor follows new guidance - inserts kafka-axi alphabetically (between jj-axi and kubernetes-axi), then runs docs:gen
$ git-style diff of catalog.yaml insertion:
--- catalog.yaml (branch)
+++ catalog.yaml (sandbox)
@@ -627,6 +627,11 @@
     author: aivv73
     domain: Version control
     description: "Inspect and reshape Jujutsu history through deterministic, non-interactive commands with compact TOON output and operation-aware undo."
+  - name: kafka-axi
+    url: https://github.com/example/kafka-axi
+    author: example
+    domain: Kafka
+    description: "Disposable test entry inserted in alphabetical order."
   - name: kubernetes-axi
     url: https://github.com/thatdudealso/kubernetes-axi
     author: thatdudealso
$ node scripts/generate-docs.mjs --check   (before regenerating - must fail)
error: README.md is out of sync with catalog.yaml/principles.yaml
error: docs/index.html is out of sync with catalog.yaml/principles.yaml
help: run `pnpm run docs:gen` and commit the result
exit=1
$ node scripts/generate-docs.mjs
wrote README.md
wrote docs/index.html
exit=0
$ node scripts/generate-docs.mjs --check
docs:check ok — generated regions match their sources
exit=0
$ README community rows around the insertion:
166:| [`jj-axi`](https://github.com/aivv73/jj-axi)                                        
167:| [`kafka-axi`](https://github.com/example/kafka-axi)                                 
168:| [`kubernetes-axi`](https://github.com/thatdudealso/kubernetes-axi)                  
$ docs/index.html community rows around the insertion:
1112:                      ><code>jj-axi</code></a
1126:                      ><code>kafka-axi</code></a
1136:                      ><code>kubernetes-axi</code></a
$ diff README.md (branch vs sandbox after docs:gen) - only the new row should appear, no other rows move:
166a167
> | [`kafka-axi`](https://github.com/example/kafka-axi)  | example  | Kafka  | Disposable test entry inserted in alphabetical order.  |
$ diff docs/index.html (branch vs sandbox) line counts:
10
0
$ sandbox catalog.yaml community list still A-Z:
true 87
Evidence: Sandbox: docs:check rejects manually reordered generated rows
\### Adversarial: hand-reorder generated rows (swap ado-axi dtabolich/jeffreyhaen tiebreak in README) - docs:check must reject
swapped README lines 122 and 123
$ node scripts/generate-docs.mjs --check
error: README.md is out of sync with catalog.yaml/principles.yaml
help: run `pnpm run docs:gen` and commit the result
exit=1

\### Adversarial: hand-reorder official table in docs/index.html (move gh-axi row above chrome-devtools-axi) - docs:check must reject
moved gh-axi row above chrome-devtools-axi in docs/index.html
$ node scripts/generate-docs.mjs --check
error: docs/index.html is out of sync with catalog.yaml/principles.yaml
help: run `pnpm run docs:gen` and commit the result
exit=1
$ node scripts/generate-docs.mjs   (regeneration restores A-Z order from catalog.yaml)
wrote docs/index.html
exit=0
$ cmp docs/index.html with branch copy:
identical to committed branch output

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

🔧 **Rebase** - 2 issues found → auto-fixed ✅
  • ⚠️ README.md - merge conflict rebasing onto origin/main
  • ⚠️ catalog.yaml - merge conflict rebasing onto origin/main

🔧 Fix applied.
✅ Re-checked - no issues remain.

⚠️ **Review** - 1 info
  • ℹ️ catalog.yaml:3 - Nothing enforces the new alphabetical order. It depends only on contributors reading the prose guidance. scripts/generate-docs.mjs renders catalog.official and catalog.community in file order (mdCatalogTable/htmlCatalogRows at lines 255-261), and docs:check only compares the rendered output to catalog.yaml, not the order of entries. Concrete sequence: any community-catalog PR opened before this change follows the old guidance to 'append an entry below', just like docs(catalog): add bun-axi to the community catalog #214, docs(catalog): add gerrit-axi to the community catalog #215 and feat: add router-axi to AXI catalog #216 did. After rebasing, it adds its entry at the end of community and runs pnpm run docs:gen. docs:check still passes and the README and axi.md tables quietly fall out of A-Z order. The same unenforced rule appears at CONTRIBUTING.md:41. Neither place states the author tiebreak for duplicate names, which already applies to ado-axi and asana-axi. A durable fix would be an order check inside generate-docs.mjs --check (next to checkTitles), with a behavioral test in scripts/generate-docs.test.mjs. That goes beyond the stated goal of contributor guidance only, so the maintainer should decide whether to add it.
✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 7 of 11 scenarios driven live against the product
Scenario Result Live Evidence
Visitor opens the axi.md site and sees the Official table A-Z: chrome-devtools-axi, gh-axi, lavish-axi, quota-axi ✅ pass live site-catalog-official-and-community-top.png; rendered-site-dom-order.txt (officialSorted: true, order equals catalog.yaml)
Visitor opens the axi.md site and sees all 86 Community rows A-Z, matching catalog.yaml row for row (ado-axi first, wrangler-axi last) ✅ pass live site-catalog-full-section.png, site-catalog-community-bottom-superbee-vercel.png; rendered-site-dom-order.txt (communitySorted: true, order equals catalog.yaml)
The duplicate ado-axi entries render with author as tiebreak: dtabolich before jeffreyhaen (site, README, catalog.yaml) ✅ pass live site-catalog-official-and-community-top.png, readme-catalog-rendered-top.png, verify-catalog-output.txt
Reader views README.md's AXI Catalog as GitHub would render it and sees both tables A-Z ✅ pass live readme-catalog-rendered-top.png, readme-catalog-rendered.html; verify-catalog-output.txt (README table rows in catalog.yaml order)
Generated regions in README.md and docs/index.html were produced by pnpm run docs:gen with no hand edits (docs:check passes; docs:gen changes nothing) ✅ pass live docs-check-and-gen.txt
The reorder loses, adds, or changes no catalog entry: same 4 official and 86 community entries as origin/main, every field identical ⏸️ untested no The prior payload did not establish a live result. It checked this only by parsing catalog.yaml against origin/main with verify-catalog.mjs, which is a static comparison, not a run of the product. The…
The admission-review comments stay attached to the superbee and vercel-axi entries ⏸️ untested no The prior payload did not establish a live result. YAML comments are never rendered to any product surface, so the only check was a static parse of catalog.yaml. This property has no live surface to d…
Adversarial: a contributor follows the new guidance and inserts kafka-axi alphabetically; docs:gen places it between jj-axi and kubernetes-axi in README and site, no other row moves, and docs:check pa… ✅ pass live sandbox-alphabetical-insert.txt
Adversarial: manually reordering generated rows (ado-axi swap in README, gh-axi above chrome-devtools-axi on the site) is rejected by docs:check, and regenerating restores A-Z output ✅ pass live sandbox-hand-edit-guard.txt
Contributor guidance in the catalog.yaml header and CONTRIBUTING.md asks for alphabetical insertion ⏸️ untested no The prior payload did not establish a live result. The guidance is prose with no runtime surface and was checked only by reading the diff (git diff e15f82d..HEAD -- CONTRIBUTING.md catalog.yaml). Th…
Feature branch is pushed to the leecalcote/axi fork and a PR is opened in kunchenguid/axi ⏸️ untested no Pushing and opening the PR belong to the outer no-mistakes executor's push and PR phases. This test phase is not allowed to push or open PRs, so it could not be done here.
  • pnpm run docs:check on the branch (exit 0)
  • pnpm run docs:gen on the branch: reported 'already up to date'; git status --porcelain stayed empty
  • node verify-catalog.mjs &lt;worktree&gt; catalog.base-origin-main.yaml catalog.yaml: compares the parsed YAML with origin/main (same entries, A-Z order, author tiebreak for duplicate names, comments attached to the same entries, README tables in the same order)
  • Served docs/ at python3 -m http.server 48717 --bind 127.0.0.1 and loaded it with chrome-devtools-axi open in an isolated headless Chrome session; read row order from the live DOM with chrome-devtools-axi eval and compared it with catalog.yaml
  • chrome-devtools-axi screenshot of the site's Official table plus the top of Community, the bottom of Community (superbee through wrangler-axi), and the whole catalog section at full height
  • Rendered the README catalog section with marked and github-markdown-css (installed only in a throwaway temp sandbox), served it locally, checked the DOM order and took a screenshot
  • Sandbox: inserted a test entry, kafka-axi, between jj-axi and kubernetes-axi in catalog.yaml, then ran node scripts/generate-docs.mjs --check (expected failure), node scripts/generate-docs.mjs, and --check again; diffed the regenerated README.md and docs/index.html against the branch
  • Sandbox: swapped the two ado-axi rows in README.md and moved gh-axi above chrome-devtools-axi in docs/index.html, confirmed --check fails with exit 1 in each case, then confirmed regenerating restores output identical to the branch
  • pnpm run docs:test (generator test file only, 11/11 pass)
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Signed-off-by: Lee Calcote <lee.calcote@layer5.io>
@greptile-apps

greptile-apps Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Low risk] Reorders catalog entries into alphabetical order.

The PR appears safe to merge; no new actionable issue remains.

Reviews (1) · Last reviewed commit: "docs(catalog): list official and communi..."

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate.

I read the PR body, the Greptile summary, and the diff intent (alphabetical reorder of official + community catalogs, regenerated README/docs, CONTRIBUTING guidance).

VISION.md per-rule verdict

  • Evolve conservatively: cannot tell alone (docs reorder is low risk, but see Official catalog).
  • AXI principles: n/a (evidence: no principle text or SDK behavior change).
  • Catalog — community contributions welcome: aligns for the community-list reorder (evidence: compared catalog.yaml on main vs head 464036fee2aa15affacd067b8b1811d60807a2ca; community multiset unchanged at 86 entries and is strictly A–Z by name with author tiebreak for duplicate names).
  • Official catalog is maintained directly by the project owner and is not open to contributed additions or edits: does not align (evidence: the same head reorders the official list — gh-axi / chrome-devtools-axi swap for A–Z — which is a contributed edit to the official catalog).
  • SDKs: n/a.

contract-class: opt-in / docs-only for community sort, but the official-catalog edit blocks acceptance of this PR as filed.

Decision: closing as out of VISION on the official-catalog rule. A follow-up that only alphabetizes the community list (plus CONTRIBUTING/catalog header guidance for community insertions) would be in scope; please leave official alone for the owner.

No security concern in the diff. No captain flag beyond this close.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants