npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@flashyos/dialects

v0.1.0

Published

One charter, many dialects — emits the surfaces other standards define (agents.txt/agents.json, A2A Agent Card) from an organisation's AAO charter, so the same facts cannot drift between them. Refuses to emit a surface the organisation does not serve.

Readme

@flashyos/dialects

One charter, many dialects. An organisation writes its AAO charter once; this renders that same document into the surfaces other standards define, so the facts cannot drift between them.

npm i @flashyos/dialects
import { agentsJson, agentsTxt } from '@flashyos/dialects'

const files = {
  'agents.json': agentsJson(charter, { property: 'example.org', surfaces }),
  'agents.txt':  agentsTxt(charter,  { property: 'example.org', surfaces }),
}

surfaces is a list of { profile, url } — the standard's own identifier and where you serve it. Read it out of your directory.fragment.json rather than keeping it by hand: a list maintained separately goes stale in the direction that hides the failure, because a property that stops serving something keeps announcing it.

Why this exists

The agentic web settled its capability layer quickly and left the accountability layer empty on purpose, in writing, in both of the specifications that matter.

  • agents.txt lists as out of scope: organisational identity verification, domain-ownership proof, accountability mechanisms, inter-organisation relationships, verifiable attestations, and who controls the domain. Its stated principle is "the announcement, never the duplicate."
  • A2A's agent-discovery document "does not address organisational structure, domain control accountability, inter-organisational relationships, or third-party attestations." An Agent Card carries a provider string and nothing behind it.

Both are right to decline it — announcing a capability is a small, clean problem and establishing who answers for an organisation's machines is not. But something has to answer it, and an AAO charter already does: it names the accountable human. agents.json emitted from a charter carries that field into a file a stranger can fetch, and nothing else in that directory does.

This package is a translator, not a standard. It owns no profile identifier, and the vocabulary it speaks belongs to whoever wrote each format. We cite; we do not publish. We did not write A2A.

What it refuses to do

It will not emit a surface you do not serve. A pointer to something that does not answer is worse than silence, because the agent that believed it has already spent a request.

That refusal has stopped its own authors twice, and both were correct:

| | Why nothing was emitted | |---|---| | MCP | @flashyos/mcp is published and has no endpoint at all — StdioServerTransport behind npx. There is no https surface to name. | | A2A Agent Card | A card advertises a JSON-RPC service endpoint. The charter supplies identity; nothing supplies transport. agentCard() throws rather than name a URL that does not speak A2A. |

agentCard() is fully implemented and derives every field it can from the charter — roles become skills, capabilities become tags, and the accountable human goes into provider['x-accountable'] where a reader will find it. It is gated on the truth, not on the work: the day you serve A2A, the card is one argument away.

agentCard(charter, { endpoint: 'https://api.example.org/a2a' })
// → { name, description, url, version, provider, capabilities, skills }

agentCard(charter, { endpoint: '' })
// → throws: "an Agent Card advertises a service endpoint that speaks A2A, and
//    this organisation has none … Serve A2A first, then pass its https url."

Drift

A generated file is regenerated, never hand-edited — and the failure mode is that the next run silently discards the edit. dialectsAgree() compares the facts rather than the bytes, so reformatting is not drift and a changed accountable human is:

const problems = dialectsAgree(charter, { agentsJson: served })
// [] when they agree; otherwise one sentence per disagreement.

Conformance, stated honestly

The agents.txt block vocabulary here was read from the agents-txt/agents-txt repository on 2026-09-22, because the network this was written on refuses agents-txt.com and a2a-protocol.org. That is a weaker read than the published specification.

Nothing this package emits should be called conformant until it has been checked against the live specification by something that can reach it. Your own profiles are announced under the x- prefix, which is the extension mechanism those formats document, rather than under a bare directive that would squat a name in somebody else's namespace.

Licence

Apache-2.0. The specification this composes with, frontdoor/1, is Apache-2.0 too, and its normative caution — publishing a file at a domain proves that someone can write to that host — is carried into every file emitted here because it is as true of an agents.json as it is of a door, and none of these formats says it.