Skip to content

AI Agent Configuration Overhaul#2287

Open
shrugs wants to merge 10 commits into
mainfrom
fix/agents
Open

AI Agent Configuration Overhaul#2287
shrugs wants to merge 10 commits into
mainfrom
fix/agents

Conversation

@shrugs

@shrugs shrugs commented Jun 11, 2026

Copy link
Copy Markdown
Member

Problem & Motivation

  • root AGENTS.md had drifted hard: missing half the packages, no current narrative (ensdb/unigraph/omnigraph), and stale references (cited a validate.ts that doesn't exist)
  • internal agent skills lived only in gitignored .claude/skills on one machine — valuable, unversioned, unshared
  • enssdk/enskit skills were "coming soon" stubs while the packages themselves are live and published
  • context7 config was ownership-claim-only: indexing the whole repo with no scoping or rules
  • perf testing required hand-patching source to disable label healing

What Changed (Concrete)

  1. agent config plumbing: .agents/skills/ is the committed source of truth for internal skills (fix-audit, edit-ponder-sync, ensindexer-perf-testing); scripts/link-local-skills.mjs mirrors them into .claude/skills on pnpm install; skills-npm.config.ts scopes installs to .agents + .claude (dropped .pi entirely)
  2. root AGENTS.md fully rewritten against the current narrative: services + complete monorepo map, local runtime (ports, env, startup order, the ENSINDEXER_SCHEMA_NAME cross-app invariant), workflow incl. breaking-changes-are-minor semver
  3. nested AGENTS.md (+ CLAUDE.md symlinks) for 8 projects — ensindexer, ensapi, ensrainbow, ensadmin, fallback-ensapi, docs/ensnode.io, datasources, integration-test-env — subsystem invariants moved out of root into the subtree where they auto-load
  4. ensskills: authored enssdk + enskit skills; omnigraph gained protocol acceleration + indexing-status/503 sections; ens-protocol gained ENS Namespace + Subgraph-Interpreted concepts; changesets included (minor)
  5. ensindexer: DISABLE_ENSRAINBOW_HEAL=true env short-circuits label healing (benchmarking only); the perf-testing skill uses it instead of patching source; documented in apps/ensindexer/AGENTS.md
  6. edit-ponder-sync skill reframed from the retired tenderly testnet to the ens-test-env devnet-restart case (chain 31337, wholesale purge recipe); general fork-diagnosis machinery kept
  7. context7: context7.json scoped to docs content + description/rules; .mcp.json adds the context7 MCP server (anonymous http, vscode-compatible)
  8. docs: integration-options/ensskills.mdx promotes enssdk/enskit out of the stub list; enssdk/enskit READMEs bumped from the stale 1.13.1 pin to 1.15.2 with durable phrasing
  9. monorepo wiring: enscli + ensskills as root devDependencies with skills-npm in prepare; pnpm warning fixes

Design & Planning

planned interactively in-session, area by area (analysis → proposal → approval); no standalone design doc. key calls: per-service orientation via nested AGENTS.md (deterministic auto-load when an agent touches the subtree) over "orientation skills" (probabilistic invocation + permanent prompt cost); internal/external placement rule — anything useful to external integrators goes in ensskills or docs, never internal AGENTS.md. considered wrapping internal skills in a workspace package so skills-npm could manage them — rejected (forces npm-* name prefixes, demotes .agents to generated symlinks) in favor of the ~40-line link script.

  • Planning artifacts: none beyond session transcript
  • Reviewed / approved by: @shrugs (interactively, per area)

Self-Review

  • Bugs caught: old root AGENTS.md cited apps/ensapi/src/lib/handlers/validate.ts, which doesn't exist — actual validation is @hono/zod-openapi route schemas + the createApp defaultHook; the new ensapi AGENTS.md documents reality
  • Logic simplified: perf testing no longer requires a source patch + biome-ignore; one guarded early-return behind an env var
  • Naming / terminology improved: skill content uses canonical terminology (Node vs "namehash", Interpreted/Beautified); README + skill version guidance generalized so pins don't rot
  • Dead or unnecessary code removed: dangling .claude/skills/agent-dx-cli-scale symlink, .pi/ directory; flagged-but-not-fixed: CLOUDFLARE_SECRET env vs require-cloudfront-secret.middleware.ts filename mismatch in fallback-ensapi

Cross-Codebase Alignment

  • Search terms used: port/env constants (42069, 4334, 3223, ENSINDEXER_SCHEMA_NAME, ENSDB_URL), accelerate, label_set_id, subgraph-interpreted, "coming soon", 1.13, tenderly
  • Reviewed but unchanged: example apps (keep v2-sepolia urls for illustration; skills reference alpha), terraform, github workflows, enssdk's lower-level lib helpers (deliberately out of skill scope)
  • Deferred alignment (with rationale): README version pins aren't synced by release:postversion — they'll drift again on the next release; small follow-up script if it bothers us

Downstream & Consumer Impact

  • Public APIs affected: no app/api behavior changes. ensskills (published) gains two skills + content — minor bump via changesets. enssdk/enskit packages unchanged except READMEs.
  • Docs updated: integration-options/ensskills.mdx, enssdk/enskit READMEs, context7 rules served alongside every snippet
  • Naming decisions worth calling out: DISABLE_ENSRAINBOW_HEAL is intentionally undocumented outside AGENTS.md + the perf skill; nested AGENTS.md/CLAUDE.md symlink pattern is the cross-agent convention (codex reads AGENTS.md natively, claude reads CLAUDE.md)

Testing Evidence

  • Testing performed: pnpm typecheck, pnpm lint, pnpm test from root all green (154 files / 1853 tests). graphnode-helpers suite (14 tests) passes with the new branch in place. enssdk/enskit skill api claims verified against package source + example apps, then spot-checked independently.
  • Known gaps: no test asserts the DISABLE_ENSRAINBOW_HEAL early-return (trivial guarded branch); skill prose accuracy is reviewer-judgment territory
  • What reviewers have to reason about manually (and why): whether each nested AGENTS.md is true and concise for the subsystem they own — only subsystem owners can judge that

Scope Reductions

  • Follow-ups: migrate-to-omnigraph + unigraph-sql skills remain stubs; worktree qol (port offsets, env copying, un-hardcoding ensadmin's dev port); shared .claude/settings.json permission allowlist; README version-pin sync at release time; cloudfront/cloudflare naming cleanup in fallback-ensapi
  • Why they were deferred: stub skills wait on product maturity; the rest is independent low-risk tooling that would dilute this already-broad pr

Risk Analysis

  • Risk areas: someone sets DISABLE_ENSRAINBOW_HEAL in production → labels index as unhealable (fix = unset + re-index; mitigated by code comment + AGENTS.md + skill warnings, and it's not in any env example). inaccurate skill content shipping to npm → agents misled (mitigated by source-verified authoring; fixable in a patch release). AGENTS.md drift recurring (mitigated by per-subtree ownership and smaller files).
  • Mitigations or rollback options: clean revert — docs/config plus one guarded branch; ensskills is version-pinned by consumers so a bad release doesn't auto-propagate
  • Named owner if this causes problems: @shrugs

Pre-Review Checklist (Blocking)

  • I reviewed every line of this diff and understand it end-to-end
  • I'm prepared to defend this PR line-by-line in review
  • I'm comfortable being the on-call owner for this change
  • Relevant changesets are included (or explicitly not required)

Copilot AI review requested due to automatic review settings June 11, 2026 16:33
@changeset-bot

changeset-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2944ef6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 24 packages
Name Type
ensskills Minor
ensindexer Minor
ensadmin Minor
ensrainbow Minor
ensapi Minor
fallback-ensapi Minor
enssdk Minor
enscli Minor
enskit Minor
@ensnode/datasources Minor
@ensnode/ensrainbow-sdk Minor
@ensnode/ensdb-sdk Minor
@ensnode/ensnode-sdk Minor
@ensnode/integration-test-env Minor
@ensnode/ponder-sdk Minor
@ensnode/ponder-subgraph Minor
@ensnode/shared-configs Minor
@docs/ensnode Minor
@docs/ensrainbow Minor
@namehash/ens-referrals Minor
@namehash/namehash-ui Minor
@ensnode/ensindexer-perf-testing Minor
@ensnode/enskit-react-example Patch
@ensnode/enssdk-example Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercel Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
admin.ensnode.io Ready Ready Preview, Comment Jun 11, 2026 9:31pm
enskit-react-example.ensnode.io Ready Ready Preview, Comment Jun 11, 2026 9:31pm
ensnode.io Ready Ready Preview, Comment Jun 11, 2026 9:31pm
ensrainbow.io Ready Ready Preview, Comment Jun 11, 2026 9:31pm

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR overhauls the repository’s AI agent/skills setup by introducing skills-npm configuration, a prepare-time mirroring script for local skills into Claude Code’s discovery path, and a large set of new/expanded AGENTS/skill docs to codify subsystem invariants and ENS concepts.

Changes:

  • Add skills-npm + a root prepare hook to install npm skills and symlink local .agents/skills/* into .claude/skills/*.
  • Expand documentation: new/updated AGENTS.md across apps/packages and skill docs (Omnigraph acceleration, ENS Namespaces, integration-test orchestration, datasource invariants).
  • Add a perf-testing escape hatch in ENSIndexer to disable ENSRainbow healing via DISABLE_ENSRAINBOW_HEAL=true.

Reviewed changes

Copilot reviewed 30 out of 32 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
skills-npm.config.ts Adds repo-wide skills-npm config for “universal” + “claude-code” agents.
scripts/link-local-skills.mjs New script to mirror committed local skills into .claude/skills via symlinks.
pnpm-lock.yaml Locks new dependencies (skills-npm) and updates override resolution metadata.
packages/integration-test-env/AGENTS.md Documents integration-test stack bring-up contract and invariants.
packages/ensskills/skills/omnigraph/SKILL.md Documents Protocol Acceleration behavior and 503/indexing-status contract.
packages/ensskills/skills/ens-protocol/SKILL.md Defines ENS Namespace concept and updates reference table.
packages/ensskills/skills/ens-protocol/references/ensv1-and-ensv2.md Adds ENS Namespaces section framing ENSv1/ENSv2 within a namespace.
packages/datasources/AGENTS.md Documents datasource catalog invariants and cross-package contracts.
package.json Adds prepare hook, skills-npm, and workspace devDependencies for enscli/ensskills.
docs/ensnode.io/AGENTS.md Documents docs-site structure, formatting pipeline, and generation workflows.
context7.json Adds Context7 schema + metadata and rules for docs indexing.
apps/fallback-ensapi/AGENTS.md Documents fallback-ensapi scope, invariants, and secrets model.
apps/ensrainbow/AGENTS.md Documents ENSRainbow CLI-only entrypoint, DB invariants, and operational gotchas.
apps/ensindexer/src/lib/graphnode-helpers.ts Adds DISABLE_ENSRAINBOW_HEAL early return for perf benchmarking.
apps/ensindexer/AGENTS.md Adds detailed ENSIndexer operational invariants and architecture notes.
apps/ensapi/AGENTS.md Adds ENSApi architecture, middleware pipeline, and error-handling conventions.
apps/ensadmin/AGENTS.md Documents ENSAdmin static-export constraints and runtime env injection model.
AGENTS.md Reframes monorepo narrative, adds agent skills conventions, and updates workflow guidance.
.mcp.json Adds MCP server config for Context7.
.gitignore Clarifies Claude directory guidance and ignores **/skills/npm-* outputs.
.changeset/omnigraph-skill-acceleration-and-status.md Changeset for ensskills documentation updates.
.agents/skills/fix-audit/SKILL.md Adds internal skill for pnpm audit fixes + override hygiene.
.agents/skills/ensindexer-perf-testing/SKILL.md Adds internal skill documenting reproducible indexer perf testing flow.
.agents/skills/edit-ponder-sync/SKILL.md Adds internal skill for inspecting/editing Ponder ponder_sync RPC cache.
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs Outdated
Comment thread scripts/link-local-skills.mjs
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title "AI Agent Configuration Overhaul" accurately reflects the main objective: a comprehensive restructuring of agent skills, documentation, and configuration across the monorepo.
Description check ✅ Passed The description comprehensively covers the problem, concrete changes, design rationale, testing, and risk analysis, exceeding the template's core requirements and providing substantial context for reviewers.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/agents

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread apps/ensadmin/CLAUDE.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.agents/skills/edit-ponder-sync/SKILL.md:
- Around line 60-62: Update the fenced code block in SKILL.md that currently
shows the fragment id pattern
`log_<chainId>_<address|null>_<topic0|null>_<topic1>_<topic2>_<topic3>_<n>` to
include a language specifier for proper Prettier formatting (change the opening
``` to ```text); edit the block containing that pattern so the fenced code block
is labeled as text.
- Around line 27-40: The fenced code block containing the schema cheat-sheet
(starting with lines describing ponder_sync.blocks, ponder_sync.logs, etc.) is
missing a language specifier; update the opening triple-backtick to include a
language (e.g., ```text) so Prettier/Markdown linting passes and the block is
formatted correctly while preserving the existing content for entries like
ponder_sync.blocks, ponder_sync.transactions, ponder_sync.intervals,
ponder_sync.factories, and ponder_sync.factory_addresses.
- Around line 176-183: Add a short clarifying comment above the RPC, rpchash,
and cachehash definitions explaining that the token "<chainId>" is used in two
different ways: in the RPC environment variable name (used by RPC=$(grep
RPC_URL_<chainId> ...), e.g., RPC_URL_1) and as the numeric chain identifier
used in the SQL query within cachehash (chain_id=<chainId>, e.g., 1); update the
comment to show example substitutions (e.g., replace <chainId> with 1 or
11155111) so future readers know which occurrence is a symbolic env-var suffix
and which is the numeric chain id.

In @.agents/skills/ensindexer-perf-testing/SKILL.md:
- Line 219: The fenced code block in SKILL.md is missing a language identifier;
update the code fence from ``` to a language-specific fence such as ```markdown
(or ```text) so markdownlint and syntax highlighters can correctly parse
it—locate the lone backtick fence in the file (the block containing "**<label>**
— branch/SHA, plugins, namespace") and prepend the chosen language identifier to
that opening fence.
- Around line 242-246: In SKILL.md update the fenced code block shown (the
```bash ... ``` snippet) to add a blank line immediately before the opening
```bash and a blank line immediately after the closing ``` so the block is
separated from surrounding text (fixes MD031); locate the code block by the
exact triple-backtick fence and the
ENSINDEXER_SCHEMA_NAME=ensindexer_perf_<label> pnpm start line and insert the
empty lines around the fences accordingly.
- Around line 195-196: Replace the two incorrect metric names used in the Step 8
queries—ponder_postgres_query_total and ponder_rpc_request_cache_hits—with the
current Ponder metrics referenced in the pitfalls section: use
ponder_indexing_store_queries_total for Postgres QPS by method and use
ponder_indexing_rpc_requests_total (or ponder_indexing_rpc_prefetch_total if you
intend prefetch-only RPCs) for RPC cache/hit rates; update the queries that
reference those symbols so they return data (e.g., sum by (method)
(rate(ponder_indexing_store_queries_total[5m])) and sum by (chain_id)
(rate(ponder_indexing_rpc_requests_total[5m])) or the prefetch variant).

In `@AGENTS.md`:
- Line 118: Add terminal punctuation to the sentence "the OpenAPI doc is a
committed artifact (`docs/ensnode.io/src/data/ensapi-openapi.json`) and CI fails
if it drifts from the ENSApi routes" so it matches surrounding list formatting;
update that paragraph in AGENTS.md by appending a period (or appropriate
punctuation) to the end of the line.

In `@scripts/link-local-skills.mjs`:
- Line 7: Replace the percent-encoded pathname usage for root with a proper
file-system path: import and use fileURLToPath from the 'url' module and call
fileURLToPath(new URL("..", import.meta.url)) instead of new URL("..",
import.meta.url).pathname so the root variable passed into join()/symlink
operations is decoded correctly on Windows and for spaces/unicode.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9c9c3420-7c8f-49f1-a4c0-8f77c68dd98c

📥 Commits

Reviewing files that changed from the base of the PR and between 6fa2f2f and 8c579f8.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (31)
  • .agents/skills/edit-ponder-sync/SKILL.md
  • .agents/skills/ensindexer-perf-testing/SKILL.md
  • .agents/skills/fix-audit/SKILL.md
  • .changeset/omnigraph-skill-acceleration-and-status.md
  • .gitignore
  • .mcp.json
  • AGENTS.md
  • apps/ensadmin/AGENTS.md
  • apps/ensadmin/CLAUDE.md
  • apps/ensapi/AGENTS.md
  • apps/ensapi/CLAUDE.md
  • apps/ensindexer/AGENTS.md
  • apps/ensindexer/CLAUDE.md
  • apps/ensindexer/src/lib/graphnode-helpers.ts
  • apps/ensrainbow/AGENTS.md
  • apps/ensrainbow/CLAUDE.md
  • apps/fallback-ensapi/AGENTS.md
  • apps/fallback-ensapi/CLAUDE.md
  • context7.json
  • docs/ensnode.io/AGENTS.md
  • docs/ensnode.io/CLAUDE.md
  • package.json
  • packages/datasources/AGENTS.md
  • packages/datasources/CLAUDE.md
  • packages/ensskills/skills/ens-protocol/SKILL.md
  • packages/ensskills/skills/ens-protocol/references/ensv1-and-ensv2.md
  • packages/ensskills/skills/omnigraph/SKILL.md
  • packages/integration-test-env/AGENTS.md
  • packages/integration-test-env/CLAUDE.md
  • scripts/link-local-skills.mjs
  • skills-npm.config.ts

Comment thread .agents/skills/edit-ponder-sync/SKILL.md
Comment thread .agents/skills/edit-ponder-sync/SKILL.md
Comment thread .agents/skills/edit-ponder-sync/SKILL.md
Comment thread .agents/skills/ensindexer-perf-testing/SKILL.md Outdated
Comment thread .agents/skills/ensindexer-perf-testing/SKILL.md
Comment thread .agents/skills/ensindexer-perf-testing/SKILL.md
Comment thread AGENTS.md
Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs
Comment thread .agents/skills/ensindexer-perf-testing/SKILL.md Outdated
@shrugs shrugs marked this pull request as ready for review June 11, 2026 17:06
@shrugs shrugs requested a review from a team as a code owner June 11, 2026 17:06
Copilot AI review requested due to automatic review settings June 11, 2026 17:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 39 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs
Comment thread apps/ensindexer/src/lib/graphnode-helpers.ts

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 36 out of 38 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

Comment thread apps/ensindexer/src/lib/graphnode-helpers.ts
Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs Outdated
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 11, 2026 17:33 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 11, 2026 17:33 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 11, 2026 17:33 Inactive
Comment thread apps/ensindexer/src/lib/graphnode-helpers.ts
@greptile-apps

greptile-apps Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR overhauling AI agent configuration for the ENSNode monorepo: committing internal skills (previously gitignored), rewriting the root AGENTS.md against the current ENSDb/Unigraph/Omnigraph narrative, adding per-service AGENTS.md files for 8 projects, fleshing out the previously-stub enssdk/enskit skills, and wiring everything into a prepare-time link script so .claude/skills stays in sync.

  • Functional change: A single guarded early-return in graphnode-helpers.ts under DISABLE_ENSRAINBOW_HEAL=true eliminates ENSRainbow round-trips during benchmarks — no code patch needed anymore; the perf-testing skill documents the full workflow.
  • Infrastructure: scripts/link-local-skills.mjs mirrors .agents/skills into .claude/skills on pnpm install; skills-npm.config.ts scopes npm-managed skills to universal + claude-code agents and drops .pi entirely.
  • Docs/skills: Root AGENTS.md, 8 nested AGENTS.md + CLAUDE.md symlinks, full enssdk/enskit skills, omnigraph protocol-acceleration + 503 sections, and context7.json scoped to docs content.

Confidence Score: 5/5

Safe to merge — the only runtime change is a single guarded early-return behind an explicitly undocumented env var intended solely for benchmarking, and all other changes are documentation, skill prose, and tooling configuration.

The diff is overwhelmingly documentation and agent configuration. The one functional code change (DISABLE_ENSRAINBOW_HEAL early-return in labelByLabelHash) is minimal, clearly commented, and fully covered by the perf-testing skill's runbook. Previously raised concerns in review threads were all addressed or explicitly acknowledged as intentional. No new issues were found.

No files require special attention. scripts/link-local-skills.mjs carries a known-but-accepted silent catch that could obscure permissions errors, but this is in a dev-only setup script with no impact on production.

Important Files Changed

Filename Overview
scripts/link-local-skills.mjs New script that mirrors .agents/skills into .claude/skills as symlinks; logic is correct but an error in the inner catch (permissions failure on unlinkSync) is silently swallowed — already flagged in previous review threads
apps/ensindexer/src/lib/graphnode-helpers.ts Adds a guarded early-return under DISABLE_ENSRAINBOW_HEAL env var for benchmarking; change is minimal and correctly placed before any healing logic
package.json Adds prepare hook (skills-npm + link script), enscli/ensskills as workspace devDependencies, and removes CVE-patched overrides that are now redundant — confirmed clean by pnpm audit
skills-npm.config.ts Scopes skills-npm to universal + claude-code agents; drops the previously gitignored .pi directory; straightforward config
.agents/skills/ensindexer-perf-testing/SKILL.md New internal perf-testing skill replacing manual source-patching with DISABLE_ENSRAINBOW_HEAL; step-by-step runbook with specific pitfall notes about metric renames and the ponder_sync_is_realtime removal
packages/ensskills/skills/enssdk/SKILL.md Replaces coming soon stub with a full skill covering install, client setup, gql.tada integration, hashing/normalization helpers, and version-compatibility guidance
packages/ensskills/skills/enskit/SKILL.md Replaces coming soon stub with a full React-focused skill covering EnsProvider setup, hooks, server-side patterns, and TanStack Query integration
packages/ensskills/skills/omnigraph/SKILL.md Adds Protocol Acceleration and Indexing status/503 sections documenting accelerated resolve behavior and the semantics of 503 responses
AGENTS.md Root AGENTS.md fully rewritten: adds ENSDb/Unigraph/Omnigraph narrative, complete monorepo map, local runtime ports/env, and workflow notes including semver conventions
context7.json Scopes context7 indexing to docs/ensnode.io/src/content/docs, adds project description, and three agent guidance rules; replaces the ownership-only stub

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["pnpm install (prepare)"] --> B["skills-npm --cwd ."]
    A --> C["node scripts/link-local-skills.mjs"]
    B --> D[".claude/skills/npm-*\n(managed by skills-npm)"]
    C --> E[".claude/skills/<name> symlinks\n(mirrors .agents/skills)"]
    subgraph committed [".agents/skills (committed)"]
        F[fix-audit]
        G[edit-ponder-sync]
        H[ensindexer-perf-testing]
    end
    committed --> E
    subgraph npm ["ensskills (npm)"]
        I[enssdk]
        J[enskit]
        K[omnigraph]
        L[ens-protocol]
    end
    npm --> D
    E --> U["Claude Code agent\ndiscovers skills + context"]
    D --> U
Loading

Reviews (4): Last reviewed commit: "fix: bot review notes (link-local-skills..." | Re-trigger Greptile

Comment thread apps/ensindexer/src/lib/graphnode-helpers.ts
Comment thread scripts/link-local-skills.mjs Outdated
Comment thread package.json
Copilot AI review requested due to automatic review settings June 11, 2026 17:43
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 11, 2026 17:43 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensnode.io June 11, 2026 17:43 Inactive
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 11, 2026 17:43 Inactive

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 41 out of 43 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

Comment thread scripts/link-local-skills.mjs
Comment thread scripts/link-local-skills.mjs Outdated
Comment thread examples/ensskills-example/README.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
.agents/skills/ensindexer-perf-testing/SKILL.md (2)

243-247: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add blank lines around fenced code block.

Per past review and markdownlint rule MD031, fenced code blocks should be surrounded by blank lines.

📝 Proposed fix
   (`tsx src/index.ts`) does **not** load `.env.local` (no `--env-file`, no in-code dotenv), so source
   the env and override the schema inline:
+
   ```bash
   cd apps/ensapi
   set -a; . ./.env.local; set +a
   ENSINDEXER_SCHEMA_NAME=ensindexer_perf_<label> pnpm start > /tmp/perf-test/ensapi.log 2>&1 &
  • Editing files (restoring env) then no longer disturbs the running ENSApi. A brief gap
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/ensindexer-perf-testing/SKILL.md around lines 243 - 247, The
fenced bash code block (the triple-backtick block containing "cd apps/ensapi ...
ENSINDEXER_SCHEMA_NAME=... pnpm start > /tmp/perf-test/ensapi.log 2>&1 &") needs
a blank line both immediately before the opening bash and immediately after the closing ; update the SKILL.md section to insert one empty line above the
opening fence and one empty line below the closing fence so the code block is
properly surrounded per MD031 while keeping the exact commands unchanged.


</details>

<!-- cr-comment:v1:9cb01fce315007eafab6ab73 -->

_Source: Coding guidelines_

---

`220-220`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**Add language identifier to fenced code block.**

Per past review and markdownlint rule MD040, the fenced code block should specify a language for proper syntax highlighting.




<details>
<summary>📝 Proposed fix</summary>

```diff
-```
+```markdown
 **<label>** — branch/SHA, plugins, namespace
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.agents/skills/ensindexer-perf-testing/SKILL.md at line 220, The fenced code
block in SKILL.md is missing a language identifier; update the opening fence to
include "markdown" (i.e., change "" to "markdown") for the block
containing " — branch/SHA, plugins, namespace" so the snippet is
properly highlighted and linting rule MD040 is satisfied; keep the closing "```"
intact.


</details>

<!-- cr-comment:v1:e10c5d7f4dd811b5d08ef18a -->

_Source: Coding guidelines_

</blockquote></details>

</blockquote></details>
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.agents/skills/ensindexer-perf-testing/SKILL.md:
- Around line 243-247: The fenced bash code block (the triple-backtick block
containing "cd apps/ensapi ... ENSINDEXER_SCHEMA_NAME=... pnpm start >
/tmp/perf-test/ensapi.log 2>&1 &") needs a blank line both immediately before
the opening ```bash and immediately after the closing ```; update the SKILL.md
section to insert one empty line above the opening fence and one empty line
below the closing fence so the code block is properly surrounded per MD031 while
keeping the exact commands unchanged.
- Line 220: The fenced code block in SKILL.md is missing a language identifier;
update the opening fence to include "markdown" (i.e., change "```" to
"```markdown") for the block containing "**<label>** — branch/SHA, plugins,
namespace" so the snippet is properly highlighted and linting rule MD040 is
satisfied; keep the closing "```" intact.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: f3297b54-9cb8-4894-b355-3554e96baedb

📥 Commits

Reviewing files that changed from the base of the PR and between 8c579f8 and 1ba6039.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (13)
  • .agents/skills/ensindexer-perf-testing/SKILL.md
  • .changeset/enssdk-enskit-skills.md
  • examples/enskit-react-example/README.md
  • examples/enssdk-example/README.md
  • examples/ensskills-example/README.md
  • examples/ensskills-example/package.json
  • examples/omnigraph-graphql-example/README.md
  • packages/enskit/README.md
  • packages/enssdk/README.md
  • packages/ensskills/skills/ens-protocol/references/names-and-hashing.md
  • packages/ensskills/skills/enskit/SKILL.md
  • packages/ensskills/skills/enssdk/SKILL.md
  • scripts/link-local-skills.mjs

@shrugs

shrugs commented Jun 11, 2026

Copy link
Copy Markdown
Member Author

@greptile review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (2)
scripts/link-local-skills.mjs (2)

7-7: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use fileURLToPath instead of .pathname for cross-platform compatibility.

This issue was flagged in previous reviews but remains unfixed. On Windows, file URLs return incorrect format (e.g., /C:/path instead of C:\path), and percent-encoded characters (spaces as %20, etc.) are not decoded. This will cause filesystem operations to fail.

🔧 Proposed fix
 import { lstatSync, mkdirSync, readdirSync, readlinkSync, symlinkSync, unlinkSync } from "node:fs";
 import { join, relative } from "node:path";
+import { fileURLToPath } from "node:url";

-const root = new URL("..", import.meta.url).pathname;
+const root = fileURLToPath(new URL("..", import.meta.url));
 const source = join(root, ".agents", "skills");
 const target = join(root, ".claude", "skills");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/link-local-skills.mjs` at line 7, Replace use of new
URL(...).pathname when computing root with Node's fileURLToPath to ensure
correct Windows paths and decode percent-encoded chars: import fileURLToPath
from 'url' (or use const { fileURLToPath } = require('url') depending on module
style) and call fileURLToPath(new URL("..", import.meta.url)) instead of using
.pathname; update the declaration of root (the variable assigned from new
URL("..", import.meta.url).pathname) to use fileURLToPath so all filesystem ops
use a proper platform-native path.

21-21: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Normalize path separators for Windows compatibility.

This issue was flagged in a previous review but remains unfixed. On Windows, readlinkSync() returns paths with backslashes (e.g., ..\.agents\skills\foo), but the code checks for forward slashes in .agents/skills. This causes the check to fail, preventing stale symlinks from being detected and cleaned up.

🔧 Proposed fix
+import { normalize, sep } from "node:path";
 import { join, relative } from "node:path";

 // ... 

 for (const name of readdirSync(target)) {
   if (!isLocalSkill(name)) continue;
   const path = join(target, name);
   if (!lstatSync(path).isSymbolicLink()) continue;
-  const linksIntoSource = readlinkSync(path).includes(".agents/skills");
+  const linksIntoSource = readlinkSync(path).split(sep).includes(".agents") && 
+                          readlinkSync(path).split(sep).includes("skills");
   if (linksIntoSource && !localSkills.includes(name)) unlinkSync(path);
 }

Alternative approach using normalize:

-  const linksIntoSource = readlinkSync(path).includes(".agents/skills");
+  const linksIntoSource = normalize(readlinkSync(path)).includes(join(".agents", "skills"));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/link-local-skills.mjs` at line 21, The check using readlinkSync(path)
in the linksIntoSource assignment fails on Windows because backslashes aren't
matched; change the logic that computes linksIntoSource (the readlinkSync call
used to set linksIntoSource) to normalize separators before the includes check
(e.g., convert backslashes to forward slashes or use path.normalize + replace
backslashes) so the string comparison against ".agents/skills" works
cross-platform; update the readlinkSync(...) handling where linksIntoSource is
defined.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@scripts/link-local-skills.mjs`:
- Line 7: Replace use of new URL(...).pathname when computing root with Node's
fileURLToPath to ensure correct Windows paths and decode percent-encoded chars:
import fileURLToPath from 'url' (or use const { fileURLToPath } = require('url')
depending on module style) and call fileURLToPath(new URL("..",
import.meta.url)) instead of using .pathname; update the declaration of root
(the variable assigned from new URL("..", import.meta.url).pathname) to use
fileURLToPath so all filesystem ops use a proper platform-native path.
- Line 21: The check using readlinkSync(path) in the linksIntoSource assignment
fails on Windows because backslashes aren't matched; change the logic that
computes linksIntoSource (the readlinkSync call used to set linksIntoSource) to
normalize separators before the includes check (e.g., convert backslashes to
forward slashes or use path.normalize + replace backslashes) so the string
comparison against ".agents/skills" works cross-platform; update the
readlinkSync(...) handling where linksIntoSource is defined.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6061f45b-91e9-4a2e-a931-d0ec4a487aa0

📥 Commits

Reviewing files that changed from the base of the PR and between 1ba6039 and 2944ef6.

📒 Files selected for processing (2)
  • examples/ensskills-example/README.md
  • scripts/link-local-skills.mjs

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