From 0d720c65b6fc96218e3c16827065f1564fff0768 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Mon, 22 Jun 2026 09:25:48 +0100 Subject: [PATCH 1/2] docs: add TOC page actions split dropdown with LLM + markdown actions --- .../components/atoms/icons/ChatGptIcon.tsx | 16 + .../src/components/atoms/icons/ClaudeIcon.tsx | 17 + .../components/atoms/icons/MarkdownIcon.tsx | 14 + .../components/molecules/PageActions.astro | 457 ++++++++++++++++++ .../overrides/TableOfContents.astro | 3 + .../content/docs/docs/integrate/ai-llm.mdx | 18 +- 6 files changed, 524 insertions(+), 1 deletion(-) create mode 100644 docs/ensnode.io/src/components/atoms/icons/ChatGptIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/ClaudeIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/MarkdownIcon.tsx create mode 100644 docs/ensnode.io/src/components/molecules/PageActions.astro diff --git a/docs/ensnode.io/src/components/atoms/icons/ChatGptIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/ChatGptIcon.tsx new file mode 100644 index 0000000000..0efceb1b60 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/ChatGptIcon.tsx @@ -0,0 +1,16 @@ +import type { SVGProps } from "react"; + +export const ChatGptIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/ClaudeIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/ClaudeIcon.tsx new file mode 100644 index 0000000000..f21f7813b5 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/ClaudeIcon.tsx @@ -0,0 +1,17 @@ +import type { SVGProps } from "react"; + +export const ClaudeIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/MarkdownIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/MarkdownIcon.tsx new file mode 100644 index 0000000000..b559912953 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/MarkdownIcon.tsx @@ -0,0 +1,14 @@ +import type { SVGProps } from "react"; + +export const MarkdownIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/molecules/PageActions.astro b/docs/ensnode.io/src/components/molecules/PageActions.astro new file mode 100644 index 0000000000..f6fac35302 --- /dev/null +++ b/docs/ensnode.io/src/components/molecules/PageActions.astro @@ -0,0 +1,457 @@ +--- +import { ChatGptIcon } from "../atoms/icons/ChatGptIcon"; +import { ClaudeIcon } from "../atoms/icons/ClaudeIcon"; +import { MarkdownIcon } from "../atoms/icons/MarkdownIcon"; + +const RAW_CONTENT_BASE_URL = "https://raw.githubusercontent.com/namehash/ensnode/main/"; + +const entry = Astro.locals.starlightRoute.entry; +const entryFilePath = ( + (entry?.data as { file?: string } | undefined)?.file ?? + entry?.filePath ?? + "" +) + .toString() + .replace(/^\.?\//, ""); + +const sourceMarkdownUrl = + entryFilePath.length === 0 + ? null + : new URL( + entryFilePath.startsWith("docs/ensnode.io/") + ? entryFilePath + : `docs/ensnode.io/${entryFilePath}`, + RAW_CONTENT_BASE_URL, + ).toString(); +--- + + + + + + diff --git a/docs/ensnode.io/src/components/overrides/TableOfContents.astro b/docs/ensnode.io/src/components/overrides/TableOfContents.astro index 32d4c67668..7bb5b0f27c 100644 --- a/docs/ensnode.io/src/components/overrides/TableOfContents.astro +++ b/docs/ensnode.io/src/components/overrides/TableOfContents.astro @@ -1,6 +1,7 @@ --- import Default from "@astrojs/starlight/components/TableOfContents.astro"; +import PageActions from "../molecules/PageActions.astro"; import ScalarTableOfContents from "../molecules/ScalarTableOfContents.astro"; import TelegramInvite from "../molecules/TelegramInvite.astro"; @@ -8,6 +9,8 @@ const { starlightRoute } = Astro.locals; const isApiReference = starlightRoute.slug === "ensapi/reference/api-reference"; --- + +
{isApiReference ? : }
diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/ai-llm.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/ai-llm.mdx index 913adcf966..111163c031 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/ai-llm.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/ai-llm.mdx @@ -9,7 +9,7 @@ import HostedInstanceVersionWarning from "@components/molecules/HostedInstanceVe We're building the infrastructure to make ENS a first-class citizen for AI agents. -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. +The foundation for how developers and their AI agents reach for ENS is [`ensskills`](/docs/integrate/integration-options/ensskills), which 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. @@ -36,6 +36,8 @@ Add `ensskills` and [`skills-npm`](https://github.com/antfu/skills-npm) to your npm install # symlinks the skills for your detected agents ``` +Use this path when you're already in a Node project and want skills to stay synced automatically via `prepare`. + ## Quickstart (`npx skills`) Not in a Node project? [`skills`](https://github.com/vercel-labs/skills) installs every ENS skill straight from the repo, pinned to the matching `v…` release tag: @@ -45,10 +47,22 @@ Not in a Node project? [`skills`](https://github.com/vercel-labs/skills) install code={`npx skills add https://github.com/namehash/ensnode/tree/v${snapshot.sdkVersion}/packages/ensskills/skills --skill '*'`} /> +Use this path when you're not in a Node project or want to install skills directly without wiring package scripts. + +Pinning to the matching `v${snapshot.sdkVersion}` tag keeps your installed skills aligned with this docs/API version. + ## Next Steps That's it — your AI agent now has all of [`ensskills`](/docs/integrate/integration-options/ensskills) at its disposal. +## Verify Installation + +Before you continue, ask your assistant to confirm it can see the installed ENS skills: + +```md title="prompt.md" +What ENS skills are available to you? +``` + ```md title=prompt.md Which address currently owns vitalik.eth and how many other domains do they own? @@ -73,6 +87,8 @@ If you aren't using `ensskills`, the entire documentation site is also published - [`/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. +Use `/llms.txt` when context is limited, and `/llms-full.txt` when you want maximum coverage. + Paste this at the top of a prompt to point your agent at the full documentation before asking your question: ```md title="prompt.md" From e141152645825c093898afad8530ffa473182340 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Tue, 23 Jun 2026 20:26:21 +0100 Subject: [PATCH 2/2] refine page actions UX --- .../atoms/icons/ChevronDownIcon.tsx | 16 ++ .../src/components/atoms/icons/CopyIcon.tsx | 17 ++ .../components/atoms/icons/FileTextIcon.tsx | 19 ++ .../src/components/atoms/icons/LinkIcon.tsx | 17 ++ .../components/atoms/icons/SparklesIcon.tsx | 23 +++ ...ageActions.astro => PageActionsMenu.astro} | 190 ++++++++++++------ .../overrides/TableOfContents.astro | 4 +- 7 files changed, 227 insertions(+), 59 deletions(-) create mode 100644 docs/ensnode.io/src/components/atoms/icons/ChevronDownIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/CopyIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/FileTextIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/LinkIcon.tsx create mode 100644 docs/ensnode.io/src/components/atoms/icons/SparklesIcon.tsx rename docs/ensnode.io/src/components/molecules/{PageActions.astro => PageActionsMenu.astro} (70%) diff --git a/docs/ensnode.io/src/components/atoms/icons/ChevronDownIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/ChevronDownIcon.tsx new file mode 100644 index 0000000000..2615343e71 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/ChevronDownIcon.tsx @@ -0,0 +1,16 @@ +import type { SVGProps } from "react"; + +export const ChevronDownIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/CopyIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/CopyIcon.tsx new file mode 100644 index 0000000000..bc87e47b04 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/CopyIcon.tsx @@ -0,0 +1,17 @@ +import type { SVGProps } from "react"; + +export const CopyIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/FileTextIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/FileTextIcon.tsx new file mode 100644 index 0000000000..3c9d41cdfc --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/FileTextIcon.tsx @@ -0,0 +1,19 @@ +import type { SVGProps } from "react"; + +export const FileTextIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/LinkIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/LinkIcon.tsx new file mode 100644 index 0000000000..cdcc68901a --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/LinkIcon.tsx @@ -0,0 +1,17 @@ +import type { SVGProps } from "react"; + +export const LinkIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/atoms/icons/SparklesIcon.tsx b/docs/ensnode.io/src/components/atoms/icons/SparklesIcon.tsx new file mode 100644 index 0000000000..1444bcc391 --- /dev/null +++ b/docs/ensnode.io/src/components/atoms/icons/SparklesIcon.tsx @@ -0,0 +1,23 @@ +import type { SVGProps } from "react"; + +export const SparklesIcon = (props: SVGProps) => ( + +); diff --git a/docs/ensnode.io/src/components/molecules/PageActions.astro b/docs/ensnode.io/src/components/molecules/PageActionsMenu.astro similarity index 70% rename from docs/ensnode.io/src/components/molecules/PageActions.astro rename to docs/ensnode.io/src/components/molecules/PageActionsMenu.astro index f6fac35302..30d8b4fb31 100644 --- a/docs/ensnode.io/src/components/molecules/PageActions.astro +++ b/docs/ensnode.io/src/components/molecules/PageActionsMenu.astro @@ -1,18 +1,20 @@ --- -import { ChatGptIcon } from "../atoms/icons/ChatGptIcon"; +import { ChevronDownIcon } from "../atoms/icons/ChevronDownIcon"; import { ClaudeIcon } from "../atoms/icons/ClaudeIcon"; +import { CopyIcon } from "../atoms/icons/CopyIcon"; +import { FileTextIcon } from "../atoms/icons/FileTextIcon"; +import { LinkIcon } from "../atoms/icons/LinkIcon"; import { MarkdownIcon } from "../atoms/icons/MarkdownIcon"; +import { SparklesIcon } from "../atoms/icons/SparklesIcon"; const RAW_CONTENT_BASE_URL = "https://raw.githubusercontent.com/namehash/ensnode/main/"; const entry = Astro.locals.starlightRoute.entry; -const entryFilePath = ( - (entry?.data as { file?: string } | undefined)?.file ?? - entry?.filePath ?? - "" -) - .toString() - .replace(/^\.?\//, ""); +const entryData = entry?.data; +const entryDataFile = + entryData && typeof entryData === "object" && "file" in entryData ? entryData.file : undefined; + +const entryFilePath = `${entryDataFile ?? entry?.filePath ?? ""}`.replace(/^\.?\//, ""); const sourceMarkdownUrl = entryFilePath.length === 0 @@ -25,20 +27,21 @@ const sourceMarkdownUrl = ).toString(); --- -