eigen-skills 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +75 -665
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,424 +1,113 @@
1
1
  # eigen-skills
2
2
 
3
- **EigenLayer Agent SkillsPlug-and-play AI agent capabilities for the entire EigenLayer stack**
4
-
5
- [Installation](#installation) | [Skills](#skills-overview) | [Architecture](#architecture) | [Usage](#usage) | [API Reference](#api-reference)
3
+ **EigenCompute Agent SkillDeploy and manage apps in Trusted Execution Environments (TEE) with one command**
6
4
 
7
5
  ---
8
6
 
9
7
  ## What is this?
10
8
 
11
- **eigen-skills** is a modular skills package that gives any AI agent instant access to the full EigenLayer ecosystem. Inspired by the [Agent Skills specification](https://github.com/anthropics/skills), it follows the `SKILL.md` standard so agents like Claude Code, OpenClaw, or any compatible framework can discover and use these capabilities automatically.
9
+ **eigen-skills** gives AI agents (Claude Code, OpenClaw, etc.) the ability to deploy and manage apps on [EigenCompute](https://eigencloud.xyz) hardware-isolated TEEs powered by Intel TDX with encrypted secrets and cryptographic attestation.
12
10
 
13
11
  ```bash
14
- npx skills add zeeshan8281/eigen-skills
15
- ```
16
-
17
- > Think of it like `npm install` but for AI agents — instead of code libraries, you're installing **knowledge and capabilities**.
18
-
19
- ---
20
-
21
- ## Skills Overview
22
-
23
- | Skill | Emoji | Domain | Data Source |
24
- |-------|-------|--------|-------------|
25
- | [`eigen-restaking`](#eigen-restaking) | 🔄 | Operators, TVL, stakers, deposits, withdrawals | EigenExplorer API |
26
- | [`eigen-avs`](#eigen-avs) | 🛡️ | Actively Validated Services, registrations, operator-sets | EigenExplorer API |
27
- | [`eigen-rewards`](#eigen-rewards) | 💰 | Rewards, APY rankings, yield strategies | EigenExplorer API |
28
- | [`eigen-delegation`](#eigen-delegation) | 🤝 | Delegation events, staker positions, top operators | EigenExplorer API |
29
- | [`eigen-compute`](#eigen-compute) | 🔒 | TEE deployment, attestation, lifecycle management | EigenCompute (ecloud CLI) |
30
- | [`eigen-da`](#eigen-da) | 📦 | Blob storage & retrieval, data availability | EigenDA Proxy |
31
-
32
- ---
33
-
34
- ## Architecture
35
-
36
- ### How Agent Skills Work
37
-
38
- ```
39
- ┌─────────────────────────────────────────────────────────────┐
40
- │ AI Agent │
41
- │ (Claude Code / OpenClaw / Any Agent Skills-compatible) │
42
- │ │
43
- │ 1. User asks: "What are the top EigenLayer operators?" │
44
- │ 2. Agent scans installed skills/ │
45
- │ 3. Matches intent → eigen-restaking/SKILL.md │
46
- │ 4. Reads SKILL.md for instructions │
47
- │ 5. Executes the appropriate curl/CLI command │
48
- │ 6. Formats and returns results │
49
- └──────────────┬──────────────────────────────────────────────┘
50
-
51
-
52
- ┌──────────────────────────────────────────────────────────────┐
53
- │ eigen-skills/ │
54
- │ │
55
- │ skills/ │
56
- │ ├── eigen-restaking/ │
57
- │ │ ├── SKILL.md ← Agent reads this │
58
- │ │ └── scripts/ │
59
- │ │ └── eigen-api.js ← JS client (optional) │
60
- │ ├── eigen-avs/ │
61
- │ ├── eigen-rewards/ │
62
- │ ├── eigen-delegation/ │
63
- │ ├── eigen-compute/ │
64
- │ └── eigen-da/ │
65
- └──────────────┬──────────────────────────────────────────────┘
66
-
67
-
68
- ┌──────────────────────────────────────────────────────────────┐
69
- │ EigenLayer Ecosystem │
70
- │ │
71
- │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
72
- │ │ EigenExplorer │ │ EigenCompute │ │ EigenDA │ │
73
- │ │ REST API │ │ (ecloud CLI)│ │ (Proxy) │ │
74
- │ │ │ │ │ │ │ │
75
- │ │ Operators │ │ TEE Deploy │ │ Blob Store │ │
76
- │ │ AVS │ │ Attestation │ │ Blob Get │ │
77
- │ │ Stakers │ │ KMS Signing │ │ KZG Verify │ │
78
- │ │ Rewards │ │ Lifecycle │ │ Commitment │ │
79
- │ │ Events │ │ Monitoring │ │ Explorer │ │
80
- │ └──────────────┘ └──────────────┘ └──────────────┘ │
81
- │ │ │ │ │
82
- │ ▼ ▼ ▼ │
83
- │ ┌─────────────────────────────────────────────────┐ │
84
- │ │ EigenLayer Protocol (L1) │ │
85
- │ │ DelegationManager · StrategyManager · AVSDir │ │
86
- │ │ AllocationManager · RewardsCoordinator │ │
87
- │ └─────────────────────────────────────────────────┘ │
88
- └──────────────────────────────────────────────────────────────┘
12
+ npm install -g eigen-skills@latest
89
13
  ```
90
14
 
91
- ### Data Flow
92
-
93
- ```
94
- ┌─────────────────┐
95
- │ User Query │
96
- │ "top operators" │
97
- └────────┬────────┘
98
-
99
- ┌────────▼────────┐
100
- │ AI Agent │
101
- │ reads SKILL.md│
102
- └────────┬────────┘
103
-
104
- ┌──────────────┼──────────────┐
105
- │ │ │
106
- ┌────────▼─────┐ ┌─────▼──────┐ ┌─────▼──────┐
107
- │ REST API │ │ ecloud CLI │ │ DA Proxy │
108
- │ (curl) │ │ (shell) │ │ (curl) │
109
- └────────┬─────┘ └─────┬──────┘ └─────┬──────┘
110
- │ │ │
111
- ┌────────▼─────┐ ┌─────▼──────┐ ┌─────▼──────┐
112
- │ EigenExplorer│ │ EigenCloud │ │ EigenDA │
113
- │ Mainnet │ │ TEE │ │ Network │
114
- └──────────────┘ └────────────┘ └────────────┘
115
- ```
15
+ > Install once, then any compatible AI agent can deploy to EigenCompute automatically via the `SKILL.md` standard.
116
16
 
117
17
  ---
118
18
 
119
- ## Installation
120
-
121
- ### For Claude Code (one command)
122
-
123
- ```bash
124
- npm install eigen-skills
125
- ```
126
-
127
- That's it. The postinstall script automatically copies the `SKILL.md` into `.claude/skills/eigen/` — Claude Code discovers it instantly. Just set your API key:
128
-
129
- ```bash
130
- export EIGEN_API_KEY="your-key-here"
131
- ```
132
-
133
- Then open Claude Code and ask anything about EigenLayer.
134
-
135
- ### Alternative: curl (no npm)
19
+ ## Setup
136
20
 
137
21
  ```bash
138
- mkdir -p .claude/skills/eigen
139
- curl -o .claude/skills/eigen/SKILL.md https://raw.githubusercontent.com/zeeshan8281/eigen-agent-skills/main/SKILL.md
140
- ```
141
-
142
- ### As an MCP Server (Claude Desktop, Cursor, Windsurf, Claude Code)
143
-
144
- Install the separate [`eigen-mcp`](https://www.npmjs.com/package/eigen-mcp) package for MCP support — all 21 tools, no SKILL.md files or curl needed:
145
-
146
- ```bash
147
- npm install -g eigen-mcp
22
+ npm install -g @layr-labs/ecloud-cli@latest # minimum v0.4.3
23
+ ecloud auth login
24
+ ecloud auth whoami
148
25
  ```
149
26
 
150
- See the [eigen-mcp README](https://www.npmjs.com/package/eigen-mcp) for config examples for Claude Desktop, Cursor, Windsurf, and Claude Code.
151
-
152
- ### For Programmatic Use (JavaScript)
153
-
154
- ```javascript
155
- const { EigenAPI, AVSAPI, RewardsAPI, DelegationAPI, EigenCompute, EigenDA } = require('eigen-skills');
156
- ```
27
+ **CRITICAL:** CLI v0.4.3+ is required. Older versions have broken ITA attestation metadata causing deploy failures on all instance types.
157
28
 
158
29
  ---
159
30
 
160
- ## Prerequisites
161
-
162
- ### Data Skills (restaking, AVS, rewards, delegation)
163
-
164
- | Requirement | How to Get |
165
- |-------------|-----------|
166
- | EigenExplorer API Key | Free at [developer.eigenexplorer.com](https://developer.eigenexplorer.com) |
167
- | Set env var | `export EIGEN_API_KEY=your_key` |
168
-
169
- ### EigenCompute Skill
170
-
171
- | Requirement | How to Get |
172
- |-------------|-----------|
173
- | ecloud CLI | `npm install -g @layr-labs/ecloud-cli` |
174
- | Auth | `ecloud auth login` or `ecloud auth generate --store` |
31
+ ## Instance Types
175
32
 
176
- ### EigenDA Skill
177
-
178
- | Requirement | How to Get |
179
- |-------------|-----------|
180
- | EigenDA Proxy | See [EigenDA Proxy Setup](#eigenda-proxy-setup) below |
181
- | Ethereum RPC | Any Sepolia RPC endpoint |
33
+ | Type | vCPUs | Memory | TEE | Notes |
34
+ |------|-------|--------|-----|-------|
35
+ | g1-micro-1v | 2 shared | 1 GB | Shielded VM | Cheapest, attestation can be flaky |
36
+ | g1-medium-1v | 2 shared | 4 GB | Shielded VM | |
37
+ | g1-custom-2-4096s | 2 | 4 GB | SEV-SNP | |
38
+ | g1-standard-2s | 2 | 8 GB | SEV-SNP | |
39
+ | g1-standard-4t | 4 | 16 GB | TDX | **Recommended — most reliable** |
40
+ | g1-standard-8t | 8 | 32 GB | TDX | |
182
41
 
183
42
  ---
184
43
 
185
- ## Usage
44
+ ## Deploy (Non-Interactive, Agent-Friendly)
186
45
 
187
- ### Agent Usage (SKILL.md driven)
46
+ `ecloud compute app deploy` has 6+ interactive prompts. Use the full flag set for CI/agent contexts:
188
47
 
189
- When an agent has eigen-skills installed, it reads the `SKILL.md` files to know what to do:
48
+ ### Step 1: Build & push Docker image (must be linux/amd64)
190
49
 
191
- **User:** "What are the top EigenLayer operators by TVL?"
192
- **Agent reads:** `skills/eigen-restaking/SKILL.md`
193
- **Agent runs:**
194
50
  ```bash
195
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTvl=desc&take=10" \
196
- -H "x-api-token: $EIGEN_API_KEY"
51
+ docker build --platform linux/amd64 -t <registry/image:tag> .
52
+ docker push <registry/image:tag>
197
53
  ```
198
- **Agent formats:** Bold names, TVL in human-readable form, staker counts.
199
54
 
200
- ---
55
+ ### Step 2: Deploy
201
56
 
202
- **User:** "Deploy my Dockerfile to EigenCompute"
203
- **Agent reads:** `skills/eigen-compute/SKILL.md`
204
- **Agent runs:**
205
57
  ```bash
206
- ecloud compute app deploy
207
- # Selects "Build and deploy from Dockerfile"
208
- # Selects Linux/AMD64
209
- ```
210
-
211
- ---
58
+ # Remove Dockerfile to avoid "Choose deployment method" prompt
59
+ rm -f Dockerfile
60
+ touch .env # create empty .env if no secrets
212
61
 
213
- **User:** "Store this verification proof on EigenDA"
214
- **Agent reads:** `skills/eigen-da/SKILL.md`
215
- **Agent runs:**
216
- ```bash
217
- curl -s -X POST "http://127.0.0.1:3100/put?commitment_mode=standard" \
218
- -H "Content-Type: application/json" \
219
- -d '{"verified": true, "model": "gpt-oss-120b", "timestamp": "2025-01-01"}'
62
+ echo "n" | ecloud compute app deploy \
63
+ --name <app-name> \
64
+ --image-ref <registry/image:tag> \
65
+ --skip-profile \
66
+ --env-file .env \
67
+ --instance-type g1-standard-4t \
68
+ --log-visibility public \
69
+ --resource-usage-monitoring enable \
70
+ --verbose
220
71
  ```
221
72
 
222
- ### Programmatic Usage (JavaScript)
223
-
224
- ```javascript
225
- const { EigenAPI, AVSAPI, RewardsAPI, DelegationAPI, EigenCompute, EigenDA } = require('eigen-skills');
226
-
227
- // ─── Restaking Data ─────────────────────────────────
228
- const eigen = new EigenAPI(process.env.EIGEN_API_KEY);
229
-
230
- // Ecosystem overview
231
- const metrics = await eigen.getMetrics();
232
- console.log(`Total TVL: ${metrics.tvl}`);
233
- console.log(`Operators: ${metrics.totalOperators}`);
234
- console.log(`Stakers: ${metrics.totalStakers}`);
235
-
236
- // Top operators
237
- const ops = await eigen.getOperators({ sortByTvl: 'desc', take: 5 });
238
- ops.data.forEach(op => {
239
- console.log(`${op.metadataName} — TVL: ${op.tvl?.tvl} — Stakers: ${op.totalStakers}`);
240
- });
241
-
242
- // ─── AVS Data ───────────────────────────────────────
243
- const avs = new AVSAPI(process.env.EIGEN_API_KEY);
244
-
245
- // All services
246
- const services = await avs.getAllAVS({ sortByTvl: 'desc', take: 10 });
247
-
248
- // Operators securing a specific AVS
249
- const avsOps = await avs.getAVSOperators('0xAVS_ADDRESS');
250
-
251
- // ─── Rewards & Yield ────────────────────────────────
252
- const rewards = new RewardsAPI(process.env.EIGEN_API_KEY);
253
-
254
- // Best yield operators
255
- const topYield = await rewards.getTopOperatorsByAPY(10);
256
-
257
- // Rewards for a specific operator
258
- const opRewards = await rewards.getOperatorRewards('0xOPERATOR');
73
+ ### Dockerfile Requirements
259
74
 
260
- // ─── Delegation ─────────────────────────────────────
261
- const delegation = new DelegationAPI(process.env.EIGEN_API_KEY);
262
-
263
- // Most delegated operators
264
- const topDelegated = await delegation.getTopDelegatedOperators(10);
265
-
266
- // Staker's delegation position
267
- const stakerInfo = await delegation.getStakerDelegation('0xSTAKER');
268
-
269
- // ─── TEE Compute ────────────────────────────────────
270
- const compute = new EigenCompute();
271
-
272
- // Check if running inside TEE
273
- const health = compute.healthCheck();
274
- console.log(`Inside TEE: ${health.insideTEE}`);
275
-
276
- // Collect attestation (inside TEE container)
277
- const attestation = compute.collectAttestation();
278
- console.log(`App ID: ${attestation.appId}`);
279
- console.log(`KMS Key: ${attestation.kmsKeyFingerprint}`);
280
-
281
- // ─── Data Availability ──────────────────────────────
282
- const da = new EigenDA();
283
-
284
- // Store data
285
- const commitment = await da.store({
286
- proof: { verified: true, model: 'gpt-oss-120b' },
287
- timestamp: new Date().toISOString(),
288
- });
289
- console.log(`Stored! Commitment: ${commitment}`);
290
- console.log(`Explorer: ${da.getExplorerUrl(commitment)}`);
291
-
292
- // Retrieve data
293
- const data = await da.retrieve(commitment);
294
- console.log(`Retrieved:`, data);
295
- ```
75
+ - Use `EXPOSE <port>` to declare your port
76
+ - App must listen on `0.0.0.0`, not `localhost`
77
+ - EigenCompute wraps your CMD with `compute-source-env.sh` entrypoint — do NOT set your own ENTRYPOINT to source it manually
296
78
 
297
79
  ---
298
80
 
299
- ## Detailed Skill Reference
300
-
301
- ### eigen-restaking
302
-
303
- 🔄 **Query EigenLayer restaking data**
81
+ ## Manage Apps
304
82
 
305
- ```
306
- Operators ←→ Stakers ←→ Strategies ←→ TVL
307
-
308
- └── Deposits / Withdrawals / Events
309
- ```
310
-
311
- **Key endpoints:**
312
-
313
- | Method | What |
314
- |--------|------|
315
- | `getMetrics()` | Ecosystem-wide TVL, operator count, staker count |
316
- | `getOperators(opts)` | List operators with sorting/filtering |
317
- | `getOperator(address)` | Single operator detail |
318
- | `getStaker(address)` | Staker info and positions |
319
- | `getDeposits()` | Recent deposit events |
320
- | `getWithdrawals()` | Recent withdrawal events |
321
- | `getHistoricalMetrics()` | TVL over time |
322
-
323
- **Example queries:**
324
83
  ```bash
325
- # Top 10 operators by TVL
326
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTvl=desc&take=10" \
327
- -H "x-api-token: $EIGEN_API_KEY"
328
-
329
- # Search operator by name
330
- curl -s "https://api.eigenexplorer.com/operators?searchByText=p2p&withTvl=true" \
331
- -H "x-api-token: $EIGEN_API_KEY"
332
-
333
- # Staker position
334
- curl -s "https://api.eigenexplorer.com/stakers/0xADDRESS" \
335
- -H "x-api-token: $EIGEN_API_KEY"
84
+ ecloud compute app list
85
+ ecloud compute app info <APP_ID>
86
+ ecloud compute app logs <APP_ID>
87
+ ecloud compute app start <APP_ID>
88
+ ecloud compute app stop <APP_ID>
89
+ ecloud compute app upgrade <APP_ID>
336
90
  ```
337
91
 
338
- ---
339
-
340
- ### eigen-avs
92
+ ### Terminate (interactive confirm — pipe "y")
341
93
 
342
- 🛡️ **Query Actively Validated Services**
343
-
344
- ```
345
- AVS (Service)
346
- ├── Operators (securing it)
347
- ├── Stakers (delegated via operators)
348
- ├── Registration Events
349
- └── Operator-Sets (slashing-era grouping)
94
+ ```bash
95
+ echo "y" | ecloud compute app terminate <APP_ID>
350
96
  ```
351
97
 
352
- **Key endpoints:**
353
-
354
- | Method | What |
355
- |--------|------|
356
- | `getAllAVS(opts)` | List all AVS with sorting/filtering |
357
- | `getAVS(address)` | Single AVS detail |
358
- | `getAVSOperators(address)` | Operators registered to an AVS |
359
- | `getAVSStakers(address)` | Stakers delegated to an AVS |
360
- | `getAVSRegistrationEvents(address)` | Registration/deregistration events |
361
- | `getAVSOperatorSets(address)` | Operator-sets for an AVS |
362
-
363
98
  ---
364
99
 
365
- ### eigen-rewards
366
-
367
- 💰 **Query rewards and yield data**
368
-
369
- ```
370
- AVS distributes rewards
371
-
372
-
373
- ┌─────────┐
374
- │ Operator │ ← takes fee (0-100%)
375
- └────┬────┘
376
-
377
-
378
- ┌─────────┐
379
- │ Staker │ ← receives remaining rewards
380
- └─────────┘
381
- ```
382
-
383
- **Key endpoints:**
100
+ ## Sealed Secrets
384
101
 
385
- | Method | What |
386
- |--------|------|
387
- | `getTopOperatorsByAPY(limit)` | Best yield operators |
388
- | `getTopAVSByAPY(limit)` | Best yield AVS |
389
- | `getOperatorRewards(address)` | Reward strategies for an operator |
390
- | `getStakerRewards(address)` | Rewards earned by a staker |
391
- | `getAVSRewards(address)` | Rewards distributed by an AVS |
392
-
393
- ---
394
-
395
- ### eigen-delegation
396
-
397
- 🤝 **Query delegation relationships**
398
-
399
- ```
400
- Staker ──delegates──▶ Operator ──registers──▶ AVS
401
- │ │
402
- └── withdrawals └── operator-sets
102
+ ```bash
103
+ ecloud compute app env set MY_SECRET="value" API_KEY="key"
403
104
  ```
404
105
 
405
- **Key endpoints:**
406
-
407
- | Method | What |
408
- |--------|------|
409
- | `getTopDelegatedOperators(limit)` | Most delegated by staker count |
410
- | `getTopOperatorsByTVL(limit)` | Most capital delegated |
411
- | `getOperatorDelegation(address)` | Operator's full delegation profile |
412
- | `getOperatorStakers(address)` | Stakers delegating to an operator |
413
- | `getStakerDelegation(address)` | Which operator a staker is delegated to |
414
- | `getDelegationEvents()` | Recent delegation/undelegation events |
415
- | `getOperatorSets()` | Operator-sets (slashing-era model) |
106
+ Secrets are encrypted and only decryptable inside the TEE via KMS attestation. At boot, `compute-source-env.sh` fetches them and writes to `/tmp/.env`.
416
107
 
417
108
  ---
418
109
 
419
- ### eigen-compute
420
-
421
- 🔒 **Deploy and manage TEE applications**
110
+ ## TEE Internals
422
111
 
423
112
  ```
424
113
  ┌─────────────────────────────────────────┐
@@ -431,7 +120,6 @@ Staker ──delegates──▶ Operator ──registers──▶ AVS
431
120
  │ │ • Encrypted memory │ │
432
121
  │ │ • Sealed secrets │ │
433
122
  │ │ • KMS signing key │ │
434
- │ │ • Unique wallet identity │ │
435
123
  │ │ • Cryptographic attestation │ │
436
124
  │ └─────────────────────────────────┘ │
437
125
  │ │
@@ -442,314 +130,36 @@ Staker ──delegates──▶ Operator ──registers──▶ AVS
442
130
  └─────────────────────────────────────────┘
443
131
  ```
444
132
 
445
- **Lifecycle:**
446
-
447
- ```
448
- ecloud auth login
449
-
450
-
451
- ecloud compute app deploy ← builds Dockerfile in TEE
452
-
453
-
454
- ecloud compute app list ← check status + IP
455
-
456
-
457
- ecloud compute app logs <id> ← view logs
458
-
459
-
460
- ecloud compute app stop <id> ← pause
461
-
462
-
463
- ecloud compute app terminate <id> ← permanent destroy
464
- ```
465
-
466
- **Key methods:**
467
-
468
- | Method | What |
469
- |--------|------|
470
- | `whoami()` | Check authenticated address |
471
- | `listApps()` | List all deployed apps |
472
- | `getAppInfo(id)` | App status and details |
473
- | `getAppLogs(id)` | View app logs |
474
- | `startApp(id)` / `stopApp(id)` | Lifecycle control |
475
- | `collectAttestation()` | Gather TEE attestation data |
476
- | `computeConfigHash(files)` | Hash config files for integrity proof |
477
-
478
- **Known issues:** See [Troubleshooting](#troubleshooting).
479
-
480
- ---
481
-
482
- ### eigen-da
483
-
484
- 📦 **Store and retrieve data blobs**
485
-
486
- ```
487
- Your App ──POST /put──▶ EigenDA Proxy ──disperse──▶ EigenDA Network
488
- │ │
489
- commitment KZG commitment
490
- │ stored on-chain
491
-
492
- ┌──────────┐
493
- │ Explorer │
494
- │ blobs- │
495
- │ sepolia. │
496
- │eigenda. │
497
- │ xyz │
498
- └──────────┘
499
-
500
- Your App ──GET /get/X──▶ EigenDA Proxy ──retrieve──▶ EigenDA Network
501
-
502
- original data
503
- ```
504
-
505
- **Proxy endpoints:**
506
-
507
- | Endpoint | Method | What |
508
- |----------|--------|------|
509
- | `/put?commitment_mode=standard` | POST | Store a blob, returns commitment |
510
- | `/get/<commitment>?commitment_mode=standard` | GET | Retrieve a blob by commitment |
511
- | `/health` | GET | Proxy health check |
512
-
513
- **Key methods:**
514
-
515
- | Method | What |
516
- |--------|------|
517
- | `store(data)` | Store JSON on EigenDA, returns commitment |
518
- | `retrieve(commitment)` | Retrieve JSON by commitment |
519
- | `getExplorerUrl(commitment)` | Get blob explorer URL |
520
- | `healthCheck()` | Check proxy availability |
521
-
522
- **Networks:**
523
-
524
- | Network | Disperser RPC | Service Manager |
525
- |---------|---------------|-----------------|
526
- | Sepolia | `disperser-sepolia.eigenda.xyz:443` | `0xD4A7E1Bd8015057293f0D0A557088c286942e84b` |
527
- | Mainnet | `disperser.eigenda.xyz:443` | See EigenLayer docs |
528
-
529
- ### EigenDA Proxy Setup
530
-
531
- ```bash
532
- docker run -d \
533
- --name eigenda-proxy \
534
- -p 3100:3100 \
535
- ghcr.io/layr-labs/eigenda-proxy:latest \
536
- --eigenda.disperser-rpc=disperser-sepolia.eigenda.xyz:443 \
537
- --eigenda.service-manager-addr=0xD4A7E1Bd8015057293f0D0A557088c286942e84b \
538
- --eigenda.eth-rpc=YOUR_SEPOLIA_RPC_URL \
539
- --eigenda.status-query-timeout=45s \
540
- --eigenda.signer-private-key-hex=YOUR_PRIVATE_KEY \
541
- --memstore.enabled=false \
542
- --eigenda.disable-tls=false
543
- ```
544
-
545
- ---
546
-
547
- ## API Reference
548
-
549
- ### Constructor Options
550
-
551
- #### EigenAPI / AVSAPI / RewardsAPI / DelegationAPI
552
-
553
- ```javascript
554
- new EigenAPI(apiKey, { network: 'mainnet' | 'holesky' })
555
- ```
556
-
557
- | Param | Type | Default | Description |
558
- |-------|------|---------|-------------|
559
- | `apiKey` | string | **required** | EigenExplorer API key |
560
- | `network` | string | `'mainnet'` | `'mainnet'` or `'holesky'` |
561
-
562
- #### EigenDA
563
-
564
- ```javascript
565
- new EigenDA({ proxyUrl, commitmentMode, timeout })
566
- ```
567
-
568
- | Param | Type | Default | Description |
569
- |-------|------|---------|-------------|
570
- | `proxyUrl` | string | `'http://127.0.0.1:3100'` | EigenDA proxy URL |
571
- | `commitmentMode` | string | `'standard'` | `'standard'` or `'optimistic'` |
572
- | `timeout` | number | `60000` | Request timeout in ms |
133
+ | Path | What |
134
+ |------|------|
135
+ | `/usr/local/bin/compute-source-env.sh` | Entrypoint — fetches secrets, then runs your CMD |
136
+ | `/usr/local/bin/kms-signing-public-key.pem` | KMS signing public key |
137
+ | `/usr/local/bin/kms-client` | KMS client binary |
573
138
 
574
- #### EigenCompute
575
-
576
- ```javascript
577
- new EigenCompute() // No args — wraps ecloud CLI
578
- ```
579
-
580
- ### Pagination
581
-
582
- All list endpoints support pagination:
583
-
584
- ```javascript
585
- const results = await eigen.getOperators({
586
- skip: 0, // offset
587
- take: 12, // page size (default: 12)
588
- sortByTvl: 'desc',
589
- });
590
-
591
- console.log(results.meta.total); // total records
592
- console.log(results.meta.skip); // current offset
593
- console.log(results.meta.take); // page size
594
- ```
595
-
596
- ### Sorting Options
597
-
598
- | Parameter | Valid Values | Available On |
599
- |-----------|-------------|-------------|
600
- | `sortByTvl` | `'asc'` / `'desc'` | Operators, AVS |
601
- | `sortByApy` | `'asc'` / `'desc'` | Operators, AVS |
602
- | `sortByTotalStakers` | `'asc'` / `'desc'` | Operators, AVS |
603
- | `sortByTotalAvs` | `'asc'` / `'desc'` | Operators |
604
- | `searchByText` | any string | Operators, AVS |
605
- | `withTvl` | `true` / `false` | Operators, AVS |
606
-
607
- ---
608
-
609
- ## Environment Variables
610
-
611
- | Variable | Required For | Description |
612
- |----------|-------------|-------------|
613
- | `EIGEN_API_KEY` | Data skills | EigenExplorer API key |
614
- | `EIGENDA_PROXY_URL` | eigen-da | Proxy URL (default: `http://127.0.0.1:3100`) |
615
- | `EIGENDA_COMMITMENT_MODE` | eigen-da | `standard` or `optimistic` |
616
- | `EIGENDA_TIMEOUT` | eigen-da | Timeout in ms (default: `60000`) |
617
- | `ECLOUD_APP_ID` | eigen-compute | Auto-set inside TEE |
618
-
619
- ---
620
-
621
- ## Demo
622
-
623
- Run the interactive demo to verify all data skills work:
624
-
625
- ```bash
626
- EIGEN_API_KEY=your_key npm run demo
627
- ```
628
-
629
- Sample output:
630
- ```
631
- 🔄 Eigen Agent Skills — Demo
632
-
633
- 📡 Health check...
634
- Status: ✅ Healthy
635
- EigenLayer TVL: 4,754,266
636
-
637
- 👥 Top 5 Operators by TVL:
638
- 1. EigenYields — Stakers: 25,700 — AVS: 32
639
- 2. AltLayer — Stakers: 21,826 — AVS: 14
640
- 3. InfStones — Stakers: 21,617 — AVS: 11
641
-
642
- 🛡️ Top 5 AVS:
643
- 1. Brevis coChain AVS
644
- 2. DIN
645
- 3. Renzo wBTC DVN
646
-
647
- 💰 Top 5 by APY:
648
- 1. EigenYields — APY: 484.3%
649
- 2. Nodes.Guru — APY: 484.3%
650
-
651
- ✅ All skills working!
652
- ```
139
+ Verify your app: `https://verify-sepolia.eigencloud.xyz/app/<APP_ID>`
653
140
 
654
141
  ---
655
142
 
656
143
  ## Troubleshooting
657
144
 
658
- ### Data Skills (EigenExplorer)
659
-
660
- | Issue | Fix |
661
- |-------|-----|
662
- | `401 Unauthorized` | Check your `EIGEN_API_KEY` is set correctly |
663
- | Timeout on `withTvl=true` | TVL calculations are expensive set `withTvl=false` for faster queries, or increase timeout |
664
- | Rate limited | EigenExplorer has rate limits on the free tier add delays between requests |
665
-
666
- ### EigenCompute
667
-
668
- | Issue | Fix |
669
- |-------|-----|
670
- | `ecloud: command not found` | Run `npm install -g @layr-labs/ecloud-cli` |
671
- | App stuck in `Status: Unknown` | Use "Build from Dockerfile" method instead of "Deploy from registry" |
672
- | `app logs` returns 403 | Known issue — add HTTP logging endpoint in your app as workaround |
673
- | 429 rate limiting after deploy | Wait 30-60 seconds before running `app list` or `app info` |
674
- | IP changes on every deploy | No static IP available — use DNS/webhook updates in your entrypoint |
675
-
676
- ### EigenDA
677
-
678
- | Issue | Fix |
679
- |-------|-----|
680
- | `ECONNREFUSED 127.0.0.1:3100` | Start the EigenDA proxy Docker container |
681
- | Store timeout | Increase `EIGENDA_TIMEOUT` — dispersal can take 30-60s |
682
- | Invalid commitment | Ensure `commitment_mode` matches between store and retrieve |
145
+ | Symptom | Cause | Fix |
146
+ |---------|-------|-----|
147
+ | `no ITA verifier client present` | CLI too old (< v0.4.3) | `sudo npm install -g @layr-labs/ecloud-cli@latest` |
148
+ | `failed to quote: error code 0x15` | CLI too old or flaky Shielded VM | Update CLI, use `g1-standard-4t` |
149
+ | `No space left on device` during layering | Docker disk full | `docker system prune -f && docker builder prune -f` |
150
+ | "Choose deployment method" prompt hangs | Dockerfile present in deploy dir | `rm -f Dockerfile` before deploying |
151
+ | App "Running" but port refuses connections | Attestation failed, app never started | Check `ecloud compute app logs <APP_ID>` |
152
+ | IP changes on every deploy | Expected behavior | Don't hardcode IPs |
153
+ | App ID changes on terminate + redeploy | Expected behavior | No persistent identity across deploys |
683
154
 
684
155
  ---
685
156
 
686
- ## Project Structure
157
+ ## Scaffold a New App (Optional)
687
158
 
159
+ ```bash
160
+ ecloud compute app create --name my-app --language typescript --template-repo minimal
161
+ # Languages: typescript, python, golang, rust
688
162
  ```
689
- eigen-skills/
690
- ├── package.json # npm package with "agents" field
691
- ├── index.js # programmatic entry point (all 6 modules)
692
- ├── README.md # this file
693
- ├── .gitignore
694
- ├── .npmignore
695
- ├── scripts/
696
- │ └── demo.js # interactive demo
697
- └── skills/
698
- ├── eigen-restaking/ # 🔄 Operators, TVL, stakers
699
- │ ├── SKILL.md # agent instructions
700
- │ └── scripts/
701
- │ └── eigen-api.js # JS API client
702
-
703
- ├── eigen-avs/ # 🛡️ Actively Validated Services
704
- │ ├── SKILL.md
705
- │ └── scripts/
706
- │ └── avs-api.js
707
-
708
- ├── eigen-rewards/ # 💰 Rewards & APY
709
- │ ├── SKILL.md
710
- │ └── scripts/
711
- │ └── rewards-api.js
712
-
713
- ├── eigen-delegation/ # 🤝 Delegation & operator-sets
714
- │ ├── SKILL.md
715
- │ └── scripts/
716
- │ └── delegation-api.js
717
-
718
- ├── eigen-compute/ # 🔒 TEE deployment & attestation
719
- │ ├── SKILL.md
720
- │ └── scripts/
721
- │ └── compute-api.js
722
-
723
- └── eigen-da/ # 📦 Blob storage & data availability
724
- ├── SKILL.md
725
- └── scripts/
726
- └── da-api.js
727
- ```
728
-
729
- ---
730
-
731
- ## How It Compares
732
-
733
- | Feature | eigen-skills | Manual curl | Custom SDK |
734
- |---------|-------------|-------------|------------|
735
- | Agent-compatible | ✅ SKILL.md standard | ❌ | ❌ |
736
- | Zero config | ✅ just add API key | ✅ | ❌ needs setup |
737
- | Covers restaking data | ✅ | ✅ manual | ✅ |
738
- | Covers TEE compute | ✅ | ❌ need CLI | ❌ |
739
- | Covers data availability | ✅ | ✅ manual | ❌ |
740
- | Programmatic JS API | ✅ | ❌ | ✅ |
741
- | Works with Claude/OpenClaw | ✅ auto-discovered | ❌ | ❌ |
742
-
743
- ---
744
-
745
- ## Contributing
746
-
747
- 1. Fork the repo
748
- 2. Create a new skill directory under `skills/`
749
- 3. Add a `SKILL.md` following the [Agent Skills spec](https://github.com/anthropics/skills)
750
- 4. Add scripts in `scripts/` for programmatic use
751
- 5. Update `index.js` to export the new module
752
- 6. PR it
753
163
 
754
164
  ---
755
165
 
@@ -760,5 +170,5 @@ MIT
760
170
  ---
761
171
 
762
172
  <p align="center">
763
- Built with data from <a href="https://eigenexplorer.com">EigenExplorer</a>, <a href="https://eigencloud.xyz">EigenCloud</a>, and <a href="https://docs.eigenlayer.xyz">EigenDA</a>
173
+ Built for <a href="https://eigencloud.xyz">EigenCompute</a> TEE
764
174
  </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eigen-skills",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Deploy and manage apps on EigenCompute TEE — trusted execution environments with hardware-level isolation, encrypted secrets, and attestation",
5
5
  "main": "index.js",
6
6
  "agents": {