Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a59d589
checkpoint: initial claude pass
shrugs Jun 1, 2026
6a4f499
checkpoint: initial draft of ens protocol skill
shrugs Jun 1, 2026
4d465c0
checkpoint: reflow word wrapping
shrugs Jun 1, 2026
61ee51a
checkpoint: initial self-review
shrugs Jun 2, 2026
14919b0
docs: move AI/LLM Tooling sidebar item above ENS Subgraph; add robot …
shrugs Jun 2, 2026
6180aa8
Merge remote-tracking branch 'origin/main' into feat/enscli-ensskills
shrugs Jun 2, 2026
1c78757
checkpoint: em-dashes, lots of docs updates
shrugs Jun 2, 2026
19c563a
fixup ensskills example app
shrugs Jun 2, 2026
afa4283
feat: datasources identifty, skills updates
shrugs Jun 2, 2026
9e69b64
Merge remote-tracking branch 'origin/main' into feat/enscli-ensskills
shrugs Jun 2, 2026
ed5a552
fix: schema gen
shrugs Jun 2, 2026
a6aa69e
fix: address PR review feedback (greploop)
shrugs Jun 2, 2026
fcf9f24
fix: PR review round 2 + license/docs cleanup
shrugs Jun 2, 2026
1988149
fix: avoid self-referential 'subdomains (a.k.a. subdomains)' in ens-p…
shrugs Jun 2, 2026
2397fd1
test(enscli): surface build logs on failure in integration test
shrugs Jun 3, 2026
d89601a
Merge remote-tracking branch 'origin/main' into feat/enscli-ensskills
shrugs Jun 3, 2026
45cea9e
fix: address review feedback — NameHash Inc. in LICENSEs, qualify 'EN…
shrugs Jun 3, 2026
b5a0265
docs: temporary prerelease install pins for enscli/ensskills
shrugs Jun 3, 2026
4a45160
docs: address review — bump LICENSE year to 2026, restore spaced em-d…
shrugs Jun 3, 2026
a6fc021
fix(docs): use JS line comment in MDX import block
shrugs Jun 3, 2026
2839445
fix: address bot review (Copilot/VADE)
shrugs Jun 3, 2026
8c04576
chore(changeset): downgrade enscli/ensskills/datasources bumps minor …
shrugs Jun 3, 2026
e1a00ed
chore(changeset): split combined changesets into per-package files
shrugs Jun 3, 2026
1f432c6
docs: fix em-dash indentation regressions + drop agentskills.io links
shrugs Jun 3, 2026
0863c47
Merge remote-tracking branch 'origin/main' into feat/enscli-ensskills
shrugs Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/datasources-identify-contracts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@ensnode/datasources": patch
---

Add contract identification by address. `@ensnode/datasources` exports `identifyDatasourceContracts(namespaceId, query)`, which finds every well-known contract in a namespace's datasources whose address matches a given address, optionally scoped to a chain.
5 changes: 5 additions & 0 deletions .changeset/enscli-datasources-identify.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"enscli": patch
---

`enscli` gains `datasources identify <address>`: an offline command that reports which well-known ENS contract an address corresponds to. It accepts a bare address, a chain-scoped `chainId:address`, or full CAIP-10 `eip155:chainId:address`, and `--namespace` (default `mainnet`) selects which namespace to search. A miss returns `{ matches: [] }` with exit code `0`.
5 changes: 5 additions & 0 deletions .changeset/enscli-initial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"enscli": patch
---

Introduce `enscli`, a new agent- and human-friendly CLI for ENS that wraps `enssdk` and the ENS Omnigraph. It supports raw Omnigraph queries (`enscli ensnode omnigraph "<query>" --variables …`), offline schema exploration (`enscli ensnode omnigraph schema [Type[.field]]`), indexing status, ENSRainbow healing, and `namehash`/`labelhash`. It defaults to NameHash-hosted instances per `--namespace` (mainnet, sepolia, sepolia-v2), resolves config from flags/env/`.env`, outputs JSON when piped and a pretty form in a TTY, and hardens inputs against agent hallucinations.
5 changes: 5 additions & 0 deletions .changeset/ensnode-sdk-sepolia-v2-default.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@ensnode/ensnode-sdk": patch
---

`getDefaultEnsNodeUrl` now returns the hosted default for the `sepolia-v2` namespace (`https://api.v2-sepolia.ensnode.io`).
5 changes: 5 additions & 0 deletions .changeset/ensskills-datasources-identify.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ensskills": patch
---

The `enscli` agent skill documents the new `datasources identify` command.
5 changes: 5 additions & 0 deletions .changeset/ensskills-initial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ensskills": patch
---

Introduce `ensskills`, a versioned, `skills-npm`-installable package of ENS agent skills. It ships the `ens-protocol` skill (a concise, stable, vendor-neutral conceptual model of the ENS protocol — nametree, normalization, hashing, registry/resolver/registrar, resolution, records, multichain — with pull-as-needed reference pages), the `omnigraph` skill (autogenerated schema reference + vetted example queries, plus prose on the unified ENSv1+ENSv2 datamodel and resolution), and the `enscli` skill (running Omnigraph queries and the other CLI commands, with the output contract, namespace/URL resolution, and input hardening), with stub skills reserved for `enssdk`, `enskit`, `migrate-to-omnigraph`, and `unigraph-sql`.
5 changes: 5 additions & 0 deletions .changeset/ensskills-llms-txt-link.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ensskills": patch
---

Point the base skill at the published `llms.txt` / `llms-full.txt` docs endpoints so agents can load the full ENSNode documentation when a question reaches beyond the skills.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion apps/ensadmin/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion apps/ensapi/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
4 changes: 2 additions & 2 deletions apps/ensapi/src/omnigraph-api/schema/domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ DomainInterfaceRef.implement({
owner: t.field({
type: AccountRef,
description:
"If this is an ENSv1Domain, this is the effective owner of the Domain. If this is an ENSv2Domain, this is the on-chain owner address (the HCA account address if used).",
"If this is an ENSv1Domain, this is the effective owner of the Domain (derived from the Registry, the Registrar, or the NameWrapper, in that order). If this is an ENSv2Domain, this is the on-chain owner address (the HCA account address if used).",
nullable: true,
resolve: (parent) => parent.ownerId,
}),
Expand Down Expand Up @@ -279,7 +279,7 @@ DomainInterfaceRef.implement({
// Domain.subdomains
/////////////////////
subdomains: t.connection({
description: "All Domains that are direct descendents of this Domain in the namegraph.",
description: "All Domains that are direct descendants of this Domain in the namegraph.",
type: DomainInterfaceRef,
args: {
where: t.arg({ type: SubdomainsWhereInput }),
Expand Down
2 changes: 1 addition & 1 deletion apps/ensindexer/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion apps/ensrainbow/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion apps/fallback-ensapi/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion docs/ensnode.io/LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2025 NameHash
Copyright (c) 2026 NameHash Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ export const integrateSidebarTopic = {
},
],
},
{
label: "AI/LLM Tooling 🤖",
link: "/docs/integrate/ai-llm",
},
{
label: "ENS Subgraph",
collapsed: false,
Expand Down Expand Up @@ -236,9 +240,5 @@ export const integrateSidebarTopic = {
},
],
},
{
label: "AI / LLM Tooling",
link: "/docs/integrate/ai-llm",
},
],
};

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
import { Aside } from "@astrojs/starlight/components";

import snapshot from "@data/omnigraph-examples/snapshot.json";
// TEMP prerelease: enscli/ensskills aren't published at `snapshot.sdkVersion` yet — remove at the
// first official release (see @data/enscli-ensskills-prerelease).
import { ENSCLI_ENSSKILLS_NPM_SPEC } from "@data/enscli-ensskills-prerelease";

// The ENSNode suite is version-locked to the production-deployed Omnigraph (see the vendored
// `@data/omnigraph-examples/snapshot.json`). The SDK bundles the Omnigraph schema (consumed by the
// `gql.tada` TypeScript plugin) and `ensskills` bundles the schema plus example queries, so pinning
// the matching version keeps generated types / agent knowledge aligned with the deployed API.
interface Props {
// "sdk" warns about pinning enssdk/enskit for gql.tada types; "skills" warns about pinning
// ensskills/enscli for agent knowledge.
variant: "sdk" | "skills";
}

const { variant } = Astro.props;
const VERSION = snapshot.sdkVersion;
---

<Aside type="caution" title="Version compatibility with hosted instances">
<a href="/docs/hosted-instances">Our hosted ENSNode instances</a> currently run ENSNode <code
>{VERSION}</code
>.{" "}
{
variant === "sdk" ? (
<Fragment>
The Omnigraph GraphQL schema is bundled inside the SDK and consumed by the{" "}
<code>gql.tada</code> TypeScript plugin to type your queries, so pin an{" "}
<strong>exact</strong> version (no <code>^</code> or <code>~</code>) of{" "}
<code>enssdk@{VERSION}</code> (and <code>enskit@{VERSION}</code> when using React) to keep
your generated types matched to the deployed schema. Use these exact install commands:
<pre>{`npm install enssdk@${VERSION}
# or, for React apps:
npm install enskit@${VERSION} enssdk@${VERSION}`}</pre>
</Fragment>
) : (
<Fragment>
<code>ensskills</code> is version-locked to the ENSNode suite—the Omnigraph schema and
example queries the skills teach are bundled at a specific version—so you pin{" "}
<code>ensskills</code> and the matching <code>enscli</code> to keep your agent's ENS
knowledge and queries matched to the deployed API.{" "}
{/* TEMP prerelease: revert to pinning both at <code>{VERSION}</code> at the first official release */}
These two packages are newer than the deployed <code>{VERSION}</code> release, so until
their first official release install them from the prerelease tag—
<code>ensskills@{ENSCLI_ENSSKILLS_NPM_SPEC}</code> and{" "}
<code>enscli@{ENSCLI_ENSSKILLS_NPM_SPEC}</code>.
</Fragment>
)
}
</Aside>
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
import { Aside, LinkCard } from "@astrojs/starlight/components";
import HostedInstanceSdkVersionWarning from "./HostedInstanceSdkVersionWarning.astro";
import HostedInstanceVersionWarning from "./HostedInstanceVersionWarning.astro";
---

<Aside type="tip" title="No backend required">
You don't need to run your own ENSNode to follow this guide — the steps below default to a
NameHash-hosted instance. Browse the available deployments below.
</Aside>
<HostedInstanceSdkVersionWarning />
<HostedInstanceVersionWarning variant="sdk" />
<LinkCard title="Hosted ENSNode Instances" href="/docs/hosted-instances" />
4 changes: 2 additions & 2 deletions docs/ensnode.io/src/content/docs/docs/hosted-instances.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ sidebar:

import { LinkCard } from "@astrojs/starlight/components";
import HostedEnsNodeInstance from "@components/molecules/HostedEnsNodeInstance.astro";
import HostedInstanceSdkVersionWarning from "@components/molecules/HostedInstanceSdkVersionWarning.astro";
import HostedInstanceVersionWarning from "@components/molecules/HostedInstanceVersionWarning.astro";
import EnsSubgraphCorrectnessPostEnsV2Launch from "@components/molecules/EnsSubgraphCorrectnessPostEnsV2Launch.astro";

export const subgraphCompatibilityApiLevel = `<em>API-level Subgraph Compatibility.</em> This ENSNode instance has a fully backwards compatible ENS Subgraph GraphQL API. However, additional plugins have been activated which index a superset of data into the subgraph data model in ENSDb. This superset of indexed data means that the data returned for some ENS Subgraph API queries may be different.`;
Expand All @@ -24,7 +24,7 @@ NameHash Labs provides hosted instances of ENSNode for developers building on EN

These instances are currently provided free of charge with no API key required, have no rate limiting, and are maintained and monitored by the NameHash Labs team.

<HostedInstanceSdkVersionWarning />
<HostedInstanceVersionWarning variant="sdk" />

### ENS Namespaces

Expand Down
65 changes: 61 additions & 4 deletions docs/ensnode.io/src/content/docs/docs/integrate/ai-llm.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,57 @@ title: AI / LLM Tooling
description: AI and LLM tooling for building on ENSv2.
---

import { LinkCard } from "@astrojs/starlight/components";
import { Code, LinkCard } from "@astrojs/starlight/components";
// TEMP prerelease: enscli/ensskills install pins — remove at first official release (see enscli-ensskills-prerelease.ts)
import { ENSCLI_ENSSKILLS_NPM_SPEC, ENSCLI_ENSSKILLS_GIT_REF } from "@data/enscli-ensskills-prerelease";
import HostedInstanceVersionWarning from "@components/molecules/HostedInstanceVersionWarning.astro";

AI and LLM tooling is a key priority for ENSNode, and we're building the infrastructure to make ENS a first-class citizen in the world of AI coding assistants and chat-based interfaces.
We're building the infrastructure to make ENS a first-class citizen for AI agents.

Next on the roadmap for this space are [`enscli`](/docs/integrate/integration-options/enscli) and [`ensskills`](/docs/integrate/integration-options/ensskills) — the foundation for how developers and their AI agents will reach for ENS.
The foundation for how developers and their AI agents reach for ENS is [`ensskills`](/docs/integrate/integration-options/ensskills), that teach your AI assistant about ENS, ENSNode, the ENS Omnigraph, and how to drive [`enscli`](/docs/integrate/integration-options/enscli) — an agent- and human-friendly CLI — on your behalf.

<HostedInstanceVersionWarning variant="skills" />

## Quickstart (`npm`/`pnpm`/`yarn`/`bun`)

Add `ensskills` and [`skills-npm`](https://github.com/antfu/skills-npm) to your project and wire a `prepare` script so the pinned skills re-sync into your agent directories (`.claude/skills`, `.cursor/skills`, …) on every install:

<Code
lang="jsonc"
code={`// package.json
{
"devDependencies": {
"ensskills": "${ENSCLI_ENSSKILLS_NPM_SPEC}",
"skills-npm": "^1"
},
"scripts": {
"prepare": "skills-npm"
}
}
`}
/>

```bash
npm install # symlinks the skills for your detected agents
```

## Quickstart (`npx skills`)

Not in a Node project? [`skills`](https://github.com/vercel-labs/skills) installs every ENS skill straight from the repo. It normally pins to the matching `v…` release tag; during the current prerelease window it tracks `main` until `enscli`/`ensskills` ship in their first official release:

<Code
lang="bash"
code={`npx skills add https://github.com/namehash/ensnode/tree/${ENSCLI_ENSSKILLS_GIT_REF}/packages/ensskills/skills --skill '*'`}
/>

## Next Steps

That's it — your AI agent now has all of [`ensskills`](/docs/integrate/integration-options/ensskills) at its disposal.

```md title=prompt.md
Which address currently owns vitalik.eth
and how many other domains do they own?
```

<LinkCard
title="enscli"
Expand All @@ -21,4 +67,15 @@ Next on the roadmap for this space are [`enscli`](/docs/integrate/integration-op
href="/docs/integrate/integration-options/ensskills"
/>

Check back soon for more detail on our AI / LLM tooling roadmap.
## Documentation as `llms.txt`

If you aren't using `ensskills`, the entire documentation site is also published in the [`llms.txt`](https://llmstxt.org/) format so any agent or LLM can load it directly as context:

- [`/llms.txt`](https://ensnode.io/llms.txt) — a structured index of the documentation with links to every page.
- [`/llms-full.txt`](https://ensnode.io/llms-full.txt) — the entire documentation concatenated into a single file, ready to drop into a model's context window.

Paste this at the top of a prompt to point your agent at the full documentation before asking your question:

```md title="prompt.md"
Load the ENSNode documentation from https://ensnode.io/llms-full.txt to answer the following question:
```
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ The Subgraph schema spreads ownership across multiple fields — `owner`, `regis
:::

:::tip[One effective owner field]
In the [Omnigraph API](/docs/integrate/omnigraph) `Domain.owner` is _always_ the effective owner's addressno weird edge-cases! For ENSv2 Domains, `Domain.owner` is Smart-Account-aware and represents the true owner of the Domain at a given time.
In the [Omnigraph API](/docs/integrate/omnigraph) `Domain.owner` is _always_ the effective owner's addressno weird edge-cases! For ENSv2 Domains, `Domain.owner` is Smart-Account-aware and represents the true owner of the Domain at a given time.
:::

## Missing all offchain ENS names
Expand Down
Loading
Loading