From e4386c456f947ce5ea3e774cb0da4a59734b6e6c Mon Sep 17 00:00:00 2001 From: Marco Walz Date: Mon, 16 Mar 2026 16:41:50 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20overhaul=20site=20messaging=20?= =?UTF-8?q?=E2=80=94=20prioritize=20npx=20install,=20remove=20llms-full.tx?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove llms-full.txt (violates progressive disclosure, incomplete for multi-file skills) - Rewrite llms.txt as concise skill index with install commands and discovery links - Restructure "access" page → "get started" with tiered install/discovery/info sections - Add npx skills install command to skill detail pages and browse cards - Rewrite how-it-works 3-step flow with concrete before/after prompt story - Update OG image to PNG (social platform compat) with current branding - Fix README: canonical .well-known URLs, correct hosting, clean up table - Update CLAUDE.md project structure to match --- .claude/CLAUDE.md | 9 +- .gitignore | 1 - README.md | 23 ++- public/og-image.png | Bin 0 -> 25062 bytes public/og-image.svg | 27 +--- scripts/generate-sitemap.js | 6 - src/components/AccessTab.tsx | 149 ----------------- src/components/BrowseTab.tsx | 8 +- src/components/GetStartedTab.tsx | 248 +++++++++++++++++++++++++++++ src/components/SkillHeader.tsx | 56 +++++-- src/data/skills.ts | 2 +- src/layouts/BaseLayout.astro | 3 +- src/layouts/SiteLayout.astro | 4 +- src/pages/access/index.astro | 15 -- src/pages/get-started/index.astro | 15 ++ src/pages/how-it-works/index.astro | 36 ++--- src/pages/llms-full.txt.ts | 22 --- src/pages/llms.txt.ts | 39 ++--- 18 files changed, 364 insertions(+), 299 deletions(-) create mode 100644 public/og-image.png delete mode 100644 src/components/AccessTab.tsx create mode 100644 src/components/GetStartedTab.tsx delete mode 100644 src/pages/access/index.astro create mode 100644 src/pages/get-started/index.astro delete mode 100644 src/pages/llms-full.txt.ts diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index aa93ac1..b0ee12b 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -4,7 +4,7 @@ This repository contains agent-readable skill files for the Internet Computer. E ## Key Rules -- **`llms.txt`, `llms-full.txt`, `.well-known/skills/`, and `sitemap.xml`** are all generated by Astro at build time into `dist/`. They are NOT committed to git. +- **`llms.txt`, `.well-known/skills/`, and `sitemap.xml`** are all generated by Astro at build time into `dist/`. They are NOT committed to git. - **Never edit Astro source files to add or update a skill** — the website auto-discovers skills from SKILL.md frontmatter at build time. Only edit `src/` files for site-level UI changes. - **One skill = one file** at `skills//SKILL.md`. No nested directories, no images, no external dependencies within a skill. - Skill names are **lowercase, hyphenated** (e.g., `ckbtc`, `https-outcalls`, `stable-memory`) and must match the directory name. This aligns with the [Agent Skills spec](https://agentskills.io/specification). @@ -85,14 +85,13 @@ src/ # Astro site source layouts/BaseLayout.astro # HTML shell, meta tags, JSON-LD layouts/SiteLayout.astro # Shared header/nav/footer for main pages components/BrowseTab.tsx # Preact island: search + skill grid - components/AccessTab.tsx # Preact island: access/endpoints reference + components/GetStartedTab.tsx # Preact island: get started / install + endpoints components/SkillHeader.tsx # Preact island: skill detail header pages/index.astro # Browse page pages/how-it-works/ # How it works page (fully static) - pages/access/ # Access reference page (real endpoints) + pages/get-started/ # Get started page (install + endpoints) pages/skills/[slug]/ # Dynamic skill pages (pre-rendered) - pages/llms.txt.ts # Skills index for agents - pages/llms-full.txt.ts # All skills concatenated + pages/llms.txt.ts # Skill index with descriptions and discovery links pages/.well-known/skills/ # Skills Discovery RFC endpoints (index.json + per-skill SKILL.md) public/ # Static assets (favicon, etc.) astro.config.mjs # Astro configuration diff --git a/.gitignore b/.gitignore index da39ea7..fe007d5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ dist *.local public/.well-known/skills/ public/llms.txt -public/llms-full.txt .astro .icp/cache/ lighthouse-* diff --git a/README.md b/README.md index 93f9681..e1d3870 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ All skills live in [`skills/*/SKILL.md`](skills/). Each skill is a self-containe ### Install via CLI -Works with 40+ agents (Claude Code, Cursor, Windsurf, Copilot, and more): +Works with any agent that supports skills (Claude Code, Cursor, Windsurf, Copilot, and more): ```bash npx skills add dfinity/icskills @@ -54,10 +54,10 @@ Browse available skills, pick your agent, and install. See [skills.sh](https://s ### Manual -Fetch the raw skill file and place it wherever your agent reads instructions from: +Fetch a single skill and place it wherever your agent reads instructions from: ```bash -curl -sL https://raw.githubusercontent.com/dfinity/icskills/main/skills/ckbtc/SKILL.md +curl -sL https://skills.internetcomputer.org/.well-known/skills/ckbtc/SKILL.md ``` The files are plain markdown — paste into any system prompt, rules file, or context window. @@ -66,14 +66,11 @@ The files are plain markdown — paste into any system prompt, rules file, or co | Resource | URL | Description | |----------|-----|-------------| -| Skill index | [`llms.txt`](https://skills.internetcomputer.org/llms.txt) | Short index with links to each skill | -| All skills | [`llms-full.txt`](https://skills.internetcomputer.org/llms-full.txt) | All skills concatenated for direct context injection | -| Single skill | [`skills/{name}/SKILL.md`](https://raw.githubusercontent.com/dfinity/icskills/main/skills/ckbtc/SKILL.md) | Raw markdown from GitHub | -| Skills discovery | [`.well-known/skills/index.json`](https://skills.internetcomputer.org/.well-known/skills/index.json) | Machine-readable skill index ([Cloudflare Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc)) | -| Single skill (API) | `/.well-known/skills/{name}/SKILL.md` | Raw markdown via discovery endpoint | -| Skill reference file | `/.well-known/skills/{name}/references/{file}.md` | Additional reference files listed in the discovery index | -| Skill page (HTML) | [`/skills/{name}/`](https://skills.internetcomputer.org/skills/ckbtc/) | Pre-rendered skill page with full SEO | -| CLI | `npx skills add dfinity/icskills` | Browse and install skills via [skills.sh](https://skills.sh) | +| Skills discovery | [`.well-known/skills/index.json`](https://skills.internetcomputer.org/.well-known/skills/index.json) | Machine-readable skill index ([Agent Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc)) | +| Single skill | `/.well-known/skills/{name}/SKILL.md` | Raw markdown for one skill | +| Reference files | `/.well-known/skills/{name}/references/{file}.md` | Additional files listed in the discovery index | +| Skill index | [`llms.txt`](https://skills.internetcomputer.org/llms.txt) | All skills with descriptions and discovery links | +| Skill page | [`/skills/{name}/`](https://skills.internetcomputer.org/skills/ckbtc/) | Pre-rendered skill page for humans | ## Contributing @@ -84,13 +81,13 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for how to add or update skills. ## Tech Stack - **Site**: [Astro](https://astro.build/) — static site generator, zero JS by default. Interactive islands with [Preact](https://preactjs.com/) (~18kb gzipped total) -- **Hosting**: GitHub Pages via Actions +- **Hosting**: IC asset canister at [`skills.internetcomputer.org`](https://skills.internetcomputer.org) - **Skills**: Plain markdown files in `skills/*/SKILL.md` - **Validation**: Structural linter for frontmatter and code blocks (`npm run validate`) - **Evaluation**: Per-skill eval cases with LLM-as-judge scoring (`node scripts/evaluate-skills.js `) - **Schema**: JSON Schema for frontmatter at `skills/skill.schema.json` - **SEO**: Per-skill meta tags, JSON-LD (TechArticle), sitemap, canonical URLs -- **Skills Discovery**: `llms.txt`, `llms-full.txt`, `.well-known/skills/` ([Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc)) +- **Skills Discovery**: `llms.txt`, `.well-known/skills/` ([Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc)) ## License diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3ee0d79e22b1433edda6f723fc315789303a46 GIT binary patch literal 25062 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 literal 0 HcmV?d00001 diff --git a/public/og-image.svg b/public/og-image.svg index 230fc8c..4cbf774 100644 --- a/public/og-image.svg +++ b/public/og-image.svg @@ -1,21 +1,10 @@ - - - - - - - - - - - - - - - - IC Skills - Agent-readable skill files for - Internet Computer - skills.internetcomputer.org + + + + + + ICP Skills + for agents that write code + skills.internetcomputer.org diff --git a/scripts/generate-sitemap.js b/scripts/generate-sitemap.js index 0cbc358..d3861be 100644 --- a/scripts/generate-sitemap.js +++ b/scripts/generate-sitemap.js @@ -46,12 +46,6 @@ xml += ` weekly 0.8 - - ${SITE}/llms-full.txt - ${latestDate} - weekly - 0.8 - `; diff --git a/src/components/AccessTab.tsx b/src/components/AccessTab.tsx deleted file mode 100644 index c482800..0000000 --- a/src/components/AccessTab.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import { useState, useEffect } from "preact/hooks"; -import { SANS_FONT } from "../data/constants"; -import CopyButton from "./CopyButton"; - -const RAW_BASE = "https://raw.githubusercontent.com/dfinity/icskills/main/skills"; - -function getEndpoints(origin: string) { - return [ - { - label: "Skills discovery", - url: `${origin}/.well-known/skills/index.json`, - desc: "Discovery index listing all skills. Follows the Agent Skills Discovery RFC.", - contentType: "application/json", - }, - { - label: "Single skill", - url: `${origin}/.well-known/skills/ckbtc/SKILL.md`, - desc: "Raw SKILL.md for one skill. Drop it straight into agent context.", - contentType: "text/markdown", - }, - { - label: "Skill reference file", - url: `${origin}/.well-known/skills/icp-cli/references/dfx-migration.md`, - desc: "Skills can include reference files. The discovery index lists all files per skill.", - contentType: "text/markdown", - }, - { - label: "Single skill (GitHub raw)", - url: `${RAW_BASE}/ckbtc/SKILL.md`, - desc: "Same content via GitHub raw URLs. Works without the site.", - contentType: "text/plain", - }, - { - label: "Skill index", - url: `${origin}/llms.txt`, - desc: "Short index with links to every skill. Follows the llms.txt convention.", - contentType: "text/plain", - }, - { - label: "All skills (full)", - url: `${origin}/llms-full.txt`, - desc: "Every skill concatenated into one file. For full context injection.", - contentType: "text/plain", - }, - ]; -} - -export default function AccessTab() { - const [origin, setOrigin] = useState(""); - useEffect(() => { setOrigin(window.location.origin); }, []); - const endpoints = getEndpoints(origin); - return ( -
-
-

- Get skills into
your agent. -

-

- No auth. No keys. Every skill is a static file you can fetch directly. -

-
- - {/* Real endpoints */} -
- {endpoints.map((ep) => ( -
-
- GET -
-
- {ep.label} -
-
- {ep.desc} -
-
- {ep.contentType} -
-
- {ep.url} - -
-
- ))} -
- - {/* Info cards */} -
- {[ - { title: "No auth needed", desc: "Open access. No keys, no signup. Every URL returns content directly." }, - { title: "Plain markdown", desc: "Skills are markdown files. Paste into any agent context, rules file, or system prompt." }, - { title: "Always current", desc: "Skills update when canister IDs or APIs change. Git-tracked with last-updated dates." }, - ].map((note) => ( -
-
- {note.title} -
-
{note.desc}
-
- ))} -
-
- ); -} diff --git a/src/components/BrowseTab.tsx b/src/components/BrowseTab.tsx index 83a5b27..1ad783c 100644 --- a/src/components/BrowseTab.tsx +++ b/src/components/BrowseTab.tsx @@ -111,7 +111,7 @@ export default function BrowseTab({ skills }: Props) { gap: "16px", }}> {filtered.map((skill) => { - const rawUrl = `${origin}/.well-known/skills/${skill.name}/SKILL.md`; + const installCmd = `npx skills add dfinity/icskills --skill ${skill.name}`; return (
- paste in agent: + install:
- {rawUrl} + {installCmd} - + ); diff --git a/src/components/GetStartedTab.tsx b/src/components/GetStartedTab.tsx new file mode 100644 index 0000000..2f8907d --- /dev/null +++ b/src/components/GetStartedTab.tsx @@ -0,0 +1,248 @@ +import { useState, useEffect } from "preact/hooks"; +import { SANS_FONT } from "../data/constants"; +import CopyButton from "./CopyButton"; + +function getEndpoints(origin: string) { + return [ + { + label: "Skills discovery", + url: `${origin}/.well-known/skills/index.json`, + desc: "Machine-readable index of all skills. Follows the Agent Skills Discovery RFC.", + contentType: "application/json", + }, + { + label: "Single skill", + url: `${origin}/.well-known/skills/ckbtc/SKILL.md`, + desc: "Raw SKILL.md for one skill. Drop it straight into agent context.", + contentType: "text/markdown", + }, + { + label: "Skill reference file", + url: `${origin}/.well-known/skills/icp-cli/references/dfx-migration.md`, + desc: "Skills can include reference files. The discovery index lists all files per skill.", + contentType: "text/markdown", + }, + ]; +} + +export default function GetStartedTab() { + const [origin, setOrigin] = useState(""); + useEffect(() => { setOrigin(window.location.origin); }, []); + const endpoints = getEndpoints(origin); + return ( +
+
+

+ Get skills into
your agent. +

+

+ Install directly into your agent, or fetch individual skills via HTTP. No auth, no keys. +

+
+ + {/* Install section */} +
+
Install into your agent
+ +
+
+
+
+ All skills (interactive) +
+
+ Pick which skills to install. Auto-detects your agent (Claude Code, Cursor, Copilot, and more). +
+
+
+
+ npx skills add dfinity/icskills + +
+
+ +
+
+
+
+ Single skill +
+
+ Install one skill by name. Includes any reference files. +
+
+
+
+ npx skills add dfinity/icskills --skill ckbtc + +
+
+ +
+
+
+
+ All skills (no prompts) +
+
+ Install everything into all detected agents. No interactive prompts. +
+
+
+
+ npx skills add dfinity/icskills --all + +
+
+
+ + {/* Discovery endpoints section */} +
+
Agent discovery endpoints
+ +
+ {endpoints.map((ep) => ( +
+
+ GET +
+
+ {ep.label} +
+
+ {ep.desc} +
+
+ {ep.contentType} +
+
+ {ep.url} + +
+
+ ))} +
+
+ + {/* Info cards */} +
+ {[ + { title: "No auth needed", desc: "Open access. No keys, no signup. Every URL returns content directly." }, + { title: "Plain markdown", desc: "Skills are markdown files. Paste into any agent context, rules file, or system prompt." }, + { title: "Always current", desc: "Skills update when canister IDs or APIs change. Git-tracked with last-updated dates." }, + ].map((note) => ( +
+
+ {note.title} +
+
{note.desc}
+
+ ))} +
+
+ ); +} diff --git a/src/components/SkillHeader.tsx b/src/components/SkillHeader.tsx index 058abd1..14349df 100644 --- a/src/components/SkillHeader.tsx +++ b/src/components/SkillHeader.tsx @@ -87,25 +87,49 @@ export default function SkillHeader({ skillName, skillTitle, category, lastUpdat - {/* Agent context bar */} + {/* Install bar */}
- - paste in agent: - - + + install: + + + {`npx skills add dfinity/icskills --skill ${skillName}`} + + +
+
- {rawUrl} - - + + raw url: + + + {rawUrl} + + +
diff --git a/src/data/skills.ts b/src/data/skills.ts index 0458de4..871b443 100644 --- a/src/data/skills.ts +++ b/src/data/skills.ts @@ -75,7 +75,7 @@ export interface SkillRaw { /** * Load all skills with their raw SKILL.md content (including frontmatter). - * Used by llms-full.txt to concatenate all skill files. + * Used by the discovery RFC endpoint to serve individual SKILL.md files. */ export function loadAllSkillsRaw(): SkillRaw[] { const dirs = readdirSync(SKILLS_DIR) diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index f6c06f4..94e0762 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -20,7 +20,7 @@ const { } = Astro.props; const site = SITE_URL; -const ogImage = `${site}/og-image.svg`; +const ogImage = `${site}/og-image.png`; const defaultJsonLd = JSON.stringify({ "@context": "https://schema.org", @@ -73,7 +73,6 @@ const defaultJsonLd = JSON.stringify({ - diff --git a/src/layouts/SiteLayout.astro b/src/layouts/SiteLayout.astro index 19a842a..fa8bed6 100644 --- a/src/layouts/SiteLayout.astro +++ b/src/layouts/SiteLayout.astro @@ -9,7 +9,7 @@ interface Props { canonicalUrl?: string; ogTitle?: string; ogDescription?: string; - activeTab: "browse" | "how-it-works" | "access"; + activeTab: "browse" | "how-it-works" | "get-started"; maxWidth?: string; } @@ -26,7 +26,7 @@ const { const tabs = [ { id: "browse", label: "browse", href: "/" }, { id: "how-it-works", label: "how it works", href: "/how-it-works/" }, - { id: "access", label: "access", href: "/access/" }, + { id: "get-started", label: "get started", href: "/get-started/" }, ] as const; --- diff --git a/src/pages/access/index.astro b/src/pages/access/index.astro deleted file mode 100644 index 704c27c..0000000 --- a/src/pages/access/index.astro +++ /dev/null @@ -1,15 +0,0 @@ ---- -import SiteLayout from "../../layouts/SiteLayout.astro"; -import AccessTab from "../../components/AccessTab"; -import { SITE_URL } from "../../data/site"; ---- - - - - diff --git a/src/pages/get-started/index.astro b/src/pages/get-started/index.astro new file mode 100644 index 0000000..aa45e50 --- /dev/null +++ b/src/pages/get-started/index.astro @@ -0,0 +1,15 @@ +--- +import SiteLayout from "../../layouts/SiteLayout.astro"; +import GetStartedTab from "../../components/GetStartedTab"; +import { SITE_URL } from "../../data/site"; +--- + + + + diff --git a/src/pages/how-it-works/index.astro b/src/pages/how-it-works/index.astro index 478b1ba..8c04242 100644 --- a/src/pages/how-it-works/index.astro +++ b/src/pages/how-it-works/index.astro @@ -28,15 +28,15 @@ const frameworksWithVars = FRAMEWORKS.map((fw, i) => ({ })); const steps = [ - { num: "01", title: "The problem", - code: "mxzaz-hqaaa... ← hallucinated", - desc: "AI agents guess canister IDs, use deprecated APIs, and miss ICP-specific details like subaccounts and cycle fees." }, - { num: "02", title: "The right skill", - code: "curl .../skills/ckbtc/SKILL.md", - desc: "The agent matches the task to a skill via description, fetches it, and gets correct canister IDs, tested code, pitfalls, and verification steps." }, - { num: "03", title: "The result", - code: "icp canister call icrc1_balance_of", - desc: "The agent builds with accurate context and verifies its own work. Working code on the first deploy." }, + { num: "01", title: "Without skills", + code: '"Add ckBTC payments to my app"', + desc: "The agent hallucinates parameters, misses the transfer fee, and skips deposit subaccounts. The canister traps on first call." }, + { num: "02", title: "One command", + code: "npx skills add dfinity/icskills", + desc: "Installs IC skills directly into your agent. Correct code, exact fees, and the pitfalls that break first deploys." }, + { num: "03", title: "With skills", + code: "Same prompt. Working code.", + desc: "The agent builds with accurate context, handles edge cases, and runs its own verification checks. First deploy, no surprises." }, ]; const anatomy = [ @@ -114,25 +114,17 @@ const anatomy = [ terminal
-# 1. Discover all skills (Agent Skills Discovery RFC)
-curl -sL {SITE_URL}/.well-known/skills/index.json
+# Install IC skills into your agent
+npx skills add dfinity/icskills
 
-# 2. Fetch a single skill file
+# Or fetch a single skill for manual context injection
 curl -sL {SITE_URL}/.well-known/skills/ckbtc/SKILL.md
-# or via GitHub raw:
-curl -sL https://raw.githubusercontent.com/dfinity/icskills/main/skills/ckbtc/SKILL.md
-
-# 3. Or fetch all skills at once for full context injection
-curl -sL {SITE_URL}/llms-full.txt
 
 # Agent now knows:
 # - Correct canister ID: mxzaz-hqaaa-aaaar-qaada-cai
 # - Fee is 10 satoshis (not 0)
 # - Must use subaccounts for deposits
-
-# → Deploys correctly on first try
-# → Runs verification checks
-# → Ships autonomously
+# → Deploys correctly on first try @@ -154,7 +146,7 @@ const anatomy = [
Give your agent the context it needs.
-

Every IC integration, one fetch away. Works with any agent or framework.

+

Every IC integration, one command away. Works with any agent or framework.

npx skills add dfinity/icskills diff --git a/src/pages/llms-full.txt.ts b/src/pages/llms-full.txt.ts deleted file mode 100644 index c4a2e08..0000000 --- a/src/pages/llms-full.txt.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Generates /llms-full.txt at build time — all SKILL.md files concatenated -import type { APIRoute } from "astro"; -import { loadAllSkillsRaw } from "../data/skills"; -import { SITE_URL } from "../data/site"; - -export const GET: APIRoute = () => { - const skills = loadAllSkillsRaw(); - - const header = `# Internet Computer (ICP) Skills — Full Reference - -All ICP Skills in a single file for direct context injection. -Source: https://github.com/dfinity/icskills -Website: ${SITE_URL} -Skills: ${skills.length} -`; - - const sections = skills.map((s) => `\n\n---\n\n${s.rawContent}`); - - return new Response(header + sections.join(""), { - headers: { "Content-Type": "text/plain; charset=utf-8" }, - }); -}; diff --git a/src/pages/llms.txt.ts b/src/pages/llms.txt.ts index a9bbc96..b839fe2 100644 --- a/src/pages/llms.txt.ts +++ b/src/pages/llms.txt.ts @@ -1,4 +1,4 @@ -// Generates /llms.txt at build time — short index of all skills with links +// Generates /llms.txt at build time — lightweight pointer to discovery endpoints import type { APIRoute } from "astro"; import { loadAllSkills } from "../data/skills"; import { SITE_URL } from "../data/site"; @@ -6,42 +6,37 @@ import { SITE_URL } from "../data/site"; export const GET: APIRoute = () => { const skills = loadAllSkills(); - const header = `# Internet Computer (ICP) Skills - -> Agent-readable skill files for the Internet Computer. Structured documentation designed for AI coding assistants — not humans. + const lines = skills.map( + (s) => + `- [${s.name}](${SITE_URL}/.well-known/skills/${s.name}/SKILL.md): ${s.description}` + ); -IC Skills provides copy-paste-ready skill files that teach AI agents how to build on the Internet Computer (ICP) blockchain correctly. Each skill covers one capability (ckBTC, Internet Identity, HTTPS Outcalls, etc.) with exact code, canister IDs, and pitfalls that prevent hallucinations. + const body = `# Internet Computer (ICP) Skills -## How to use +> Agent-readable skill files for building on the Internet Computer. ${skills.length} skills available. -Fetch any skill file and paste it into your AI agent's context: +## Install \`\`\` -curl -sL ${SITE_URL}/.well-known/skills//SKILL.md +npx skills add dfinity/icskills +npx skills add dfinity/icskills --skill ckbtc \`\`\` -## Skills +## Discovery -`; +- [Skills index (JSON)](${SITE_URL}/.well-known/skills/index.json): Machine-readable index following the [Agent Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc) +- Individual skill: \`${SITE_URL}/.well-known/skills/{name}/SKILL.md\` - const lines = skills.map( - (s) => - `- [${s.title}](${SITE_URL}/.well-known/skills/${s.name}/SKILL.md): ${s.description || `Agent-readable skill file for ${s.title} on the Internet Computer.`}` - ); - - const footer = ` -## Skills Discovery +## Skills -- [Skills index (JSON)](${SITE_URL}/.well-known/skills/index.json): Machine-readable skill index ([Agent Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc)) -- [All skills (full text)](${SITE_URL}/llms-full.txt): All skills concatenated for direct context injection +${lines.join("\n")} ## Source -- [GitHub Repository](https://github.com/dfinity/icskills): All skill files, contribution guide, and website source -- [Contributing Guide](https://github.com/dfinity/icskills/blob/main/CONTRIBUTING.md): How to add or update skills +- [GitHub Repository](https://github.com/dfinity/icskills) `; - return new Response(header + lines.join("\n") + "\n" + footer, { + return new Response(body, { headers: { "Content-Type": "text/plain; charset=utf-8" }, }); };