Skill: koba42corp/dexie (version 1.0.0)

# Dexie Skill Track Chia DEX trading via the Dexie.space API. ## What It Does - List active/completed offers - View token prices and liquidity - Search tokens (CATs) - Monitor trading pairs - Get platform statistics ## Commands All commands can be triggered via: - `/dex <command>` in Telegram - `/dexie <command>` in Telegram - `dex <command>` in CLI - `dexie <command>` in CLI ### Offers ```bash /dex offers List active offers /dex offers completed List completed offers /dex offers cancelled List cancelled offers /dex offer <id> Get offer details ``` ### Tokens ```bash /dex assets List top tokens by volume /dex asset <id|code> Get token details (e.g., SBX, DBX) /dex search <query> Search tokens /dex price <code> Get token price ``` ### Pairs ```bash /dex pairs List trading pairs /dex pair <id> Get pair details ``` ### Stats ```bash /dex stats Get platform statistics ``` ### Shortcuts ```bash /dex SBX Quick price lookup /dex DBX Quick price lookup ``` ## Agent Usage When users ask about Chia DEX, trading, or token prices: ```javascript const { handleCommand } = require('./skills/dexie'); // Natural language → formatted response const output = await handleCommand('show me top tokens'); ``` ## API Client For custom integrations: ```javascript const DexieAPI = require('./skills/dexie/lib/api'); const api = new DexieAPI(); // Get active offers const offers = await api.getOffers({ page_size: 20, status: 0 }); // Get token details const token = await api.getAsset([REDACTED_SECRET]); // List all assets const assets = await api.getAssets({ page_size: 50, sort: 'volume' }); // Get trading pairs const pairs = await api.getPairs(); ``` ## Installation ```bash cd skills/dexie npm install chmod +x cli.js npm link # Makes 'dex' and 'dexie' global ``` ## Configuration No API key required — Dexie API is public. ## Output Format All commands return plain text suitable for: - Terminal output (CLI) - Telegram messages - Discord messages - WhatsApp messages ## Examples **Check token price:** ```bash /dex price SBX ``` **List active offers:** ```bash /dex offers ``` **Search for a token:** ```bash /dex search bucks ``` **Get platform stats:** ```bash /dex stats ``` ## Tips - Asset IDs are long hex strings - Token codes are short (e.g., SBX, DBX, XCH) - Use search to find tokens by name - Prices are in USD - Volumes and liquidity in XCH ## Support - Dexie.space: https://dexie.space - API Docs: https://api.dexie.space/v1 - Bug reports: File in skill repository

path: CHANGELOG.md
content: # Changelog

All notable changes to the Dexie skill will be documented in this file.

## [1.0.0] - 2026-01-29

### Added
- Initial release
- Complete Dexie.space API wrapper
- CLI commands via `dex` and `dexie`
- Telegram integration with `/dex` command
- Natural language command parsing
- Offer browsing (active, completed, cancelled)
- Token/asset listing and details
- Price lookups
- Token search
- Trading pair listing
- Platform statistics
- Formatted output for CLI and messaging platforms
- API client for programmatic access
- ClawdHub package structure
- Comprehensive documentation (SKILL.md, README.md)
- Installation script
- MIT License

### Features
- 💱 Offers: Browse and filter marketplace offers
- 🪙 Tokens: Prices, volume, liquidity for CATs
- 📊 Pairs: View trading pairs
- 🔍 Search: Find tokens by name or code
- 📈 Stats: Platform-wide statistics
- ⚡ Shortcuts: Quick price lookups

### Technical
- Node.js 18+ compatibility
- Axios for HTTP requests
- 30-second timeout for API calls
- Graceful error handling
- No API key required
- Production-ready code

---

[1.0.0]: https://github.com/Koba42Corp/dexie-skill/releases/tag/v1.0.0


path: README.md
content: <p align="center">
  <h1 align="center">💱 Dexie.space API Client</h1>
  <p align="center">
    <strong>Track Chia DEX trading - offers, prices, liquidity</strong>
  </p>
</p>

<p align="center">
  <a href="https://opensource.org/licenses/MIT">
    <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT">
  </a>
  <a href="https://nodejs.org/">
    <img src="https://img.shields.io/badge/Node.js-v18+-green.svg" alt="Node.js: v18+">
  </a>
  <a href="https://dexie.space">
    <img src="https://img.shields.io/badge/DEX-Dexie.space-blue.svg" alt="Dexie.space">
  </a>
  <a href="https://clawd.bot">
    <img src="https://img.shields.io/badge/Framework-Clawdbot-orange.svg" alt="Built with Clawdbot">
  </a>
</p>

<p align="center">
  <img src="https://img.shields.io/badge/Status-Production%20Ready-brightgreen.svg" alt="Status">
  <img src="https://img.shields.io/badge/Version-1.0.0-blue.svg" alt="Version">
</p>

---

## 🎯 Overview

Access the Dexie.space API to track decentralized exchange activity on Chia. Monitor offers, check token prices, view liquidity pools, and analyze trading pairs.

**No API key required** — Dexie's API is free and public.

## ✨ Features

- 💱 **Offers** — Browse active, completed, and cancelled trades
- 🪙 **Tokens** — View prices, volume, liquidity for CATs
- 📊 **Pairs** — List trading pairs and markets
- 🔍 **Search** — Find tokens by name or code
- 📈 **Stats** — Platform-wide statistics

## 🚀 Quick Start

### Installation

```bash
# Via ClawdHub (recommended)
clawdhub install dexie

# Or manually
cd ~/.clawd/skills
git clone https://github.com/Koba42Corp/dexie-skill.git dexie
cd dexie
npm install
chmod +x cli.js
npm link
```

### Usage

#### CLI

```bash
# Offers
dex offers
dex offers completed
dex offer <id>

# Tokens
dex assets
dex asset SBX
dex price DBX
dex search bucks

# Pairs & Stats
dex pairs
dex stats
```

#### Telegram

```
/dex offers
/dex price SBX
/dex assets
/dex stats
```

#### Clawdbot Agent

```javascript
const { handleCommand } = require('./skills/dexie');

const output = await handleCommand('show me top tokens');
console.log(output);
```

#### API Client

```javascript
const DexieAPI = require('./skills/dexie/lib/api');
const api = new DexieAPI();

// Get active offers
const offers = await api.getOffers({ status: 0, page_size: 20 });

// Get token info
const token = await api.getAsset('a628c1c2c6fcb74d53746157e438e108eab5c0bb3e5c80ff9b1910b3e4832913');

// List all tokens
const assets = await api.getAssets({ sort: 'volume' });

// Get pairs
const pairs = await api.getPairs();
```

## 📖 Command Reference

### Offers

| Command | Description | Example |
|---------|-------------|---------|
| `dex offers` | List active offers | `dex offers` |
| `dex offers completed` | List completed trades | `dex offers completed` |
| `dex offers cancelled` | List cancelled offers | `dex offers cancelled` |
| `dex offer <id>` | Offer details | `dex offer Bk6Lr12H6P4DuhPd...` |

### Tokens

| Command | Description | Example |
|---------|-------------|---------|
| `dex assets` | Top tokens by volume | `dex assets` |
| `dex asset <code>` | Token details | `dex asset SBX` |
| `dex price <code>` | Quick price check | `dex price DBX` |
| `dex search <query>` | Search tokens | `dex search bucks` |

### Shortcuts

| Input | Action |
|-------|--------|
| `dex SBX` | Get SBX price |
| `dex DBX` | Get DBX price |

## 🛠️ API Methods

Complete method reference:

### Offers
- `getOffers(options)` — List offers
- `getOffer(id)` — Get offer details

### Assets
- `getAssets(options)` — List tokens
- `getAsset(id)` — Get token details
- `searchCATs(query, options)` — Search tokens

### Pairs
- `getPairs()` — List trading pairs
- `getPair(id)` — Get pair details

### Stats
- `getStats()` — Platform statistics

## 📊 Output Examples

### Token List
```
🪙 Top Tokens by Volume (24h):

1. SBX - Spacebucks
   Price: $0.000067
   Volume: 1.37 XCH
   Liquidity: 669.63 XCH

2. wUSDC.b - Base warp.green USDC
   Price: $0.252859
   Volume: 322.02 XCH
   Liquidity: 2.46K XCH
```

### Offers
```
💱 Active Offers:

1. 163.48 wUSDC.b → 43.91 XCH
   Price: 0.268585
   ID: 6bWyrsjd2FSSmzTbYgmNWcZfGi2d3jcQihjQNFb1ALx1

2. 1000.00 SBX → 0.07 XCH
   Price: 0.000070
   ID: Bk6Lr12H6P4DuhPdzzAcXXApErMxo8712aEfKeNyDPL7
```

## 🔧 Configuration

No configuration required! The API is public and doesn't need authentication.

### Options

Methods accept an `options` object:

```javascript
{
  page: 1,          // Page number
  page_size: 20,    // Results per page
  status: 0,        // Offer status (0=active, 1=completed, 2=cancelled)
  sort: 'volume'    // Sort field
}
```

## 🧪 Examples

### Track a specific token

```javascript
const api = new DexieAPI();

const sbx = await api.getAsset('a628c1c2c6fcb74d53746157e438e108eab5c0bb3e5c80ff9b1910b3e4832913');
console.log(`SBX Price: $${sbx.current_avg_price}`);
console.log(`Volume: ${sbx.volume[0]} XCH`);
```

### Monitor active offers

```javascript
const api = new DexieAPI();

setInterval(async () => {
  const offers = await api.getOffers({ status: 0, page_size: 5 });
  console.log(`Active offers: ${offers.count}`);
  
  offers.offers.forEach(offer => {
    const from = offer.offered[0];
    const to = offer.requested[0];
    console.log(`${from.amount} ${from.code} → ${to.amount} ${to.code}`);
  });
}, 60000); // Every minute
```

## 🤝 Contributing

Contributions welcome! Please:

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request

## 📄 License

MIT License - see [LICENSE](LICENSE) for details

## 🔗 Links

- **Dexie**: https://dexie.space
- **API**: https://api.dexie.space/v1
- **Clawdbot**: https://clawd.bot
- **ClawdHub**: https://clawdhub.com
- **Chia Network**: https://chia.net

## 💬 Support

- Issues: [GitHub Issues](https://github.com/Koba42Corp/dexie-skill/issues)
- Discord: [Clawdbot Community](https://discord.gg/clawd)
- Telegram: [@clawdbot](https://t.me/clawdbot)

---

<p align="center">Made with 🖖 by the Clawdbot community</p>


path: cli.js
content: #!/usr/bin/env node

const { handleCommand } = require('./index');

// CLI interface
(async () => {
  const [,, ...args] = process.argv;
  const input = args.join(' ').trim();

  if (!input || input === 'help' || input === '--help' || input === '-h') {
    console.log(showHelp());
    process.exit(0);
  }

  try {
    const output = await handleCommand(input);
    console.log(output);
  } catch (error) {
    console.error(`❌ Error: ${error.message}`);
    process.exit(1);
  }
})();

function showHelp() {
  return `💱 Dexie.space API Client

OFFERS
  dex offers               List active offers
  dex offers completed     List completed offers
  dex offer <id>           Get offer details

TOKENS/ASSETS
  dex assets               List top tokens by volume
  dex asset <id|code>      Get token details
  dex search <query>       Search tokens
  dex price <code>         Get token price

PAIRS
  dex pairs                List trading pairs

STATS
  dex stats                Get platform statistics

SHORTCUTS
  dex <token>              Get token price (e.g., dex SBX)

Use 'dex help' anytime for this message.`;
}


path: index.js
content: const DexieAPI = require('./lib/api');

const api = new DexieAPI();

/**
 * Handle Dexie commands from CLI or Clawdbot
 * @param {string} input - Raw command string
 * @returns {Promise<string>} Formatted output
 */
async function handleCommand(input) {
  input = input.trim().toLowerCase();

  // Strip common prefixes
  input = input.replace(/^(\/dex|\/dexie|dex|dexie)\s+/, '');

  const parts = input.split(/\s+/);
  const command = parts[0];
  const subcommand = parts[1];
  const args = parts.slice(2);

  switch (command) {
    // OFFERS
    case 'offers':
      if (subcommand && !['active', 'completed', 'cancelled'].includes(subcommand)) {
        return await getOfferDetails(subcommand);
      }
      return await listOffers(subcommand);

    case 'offer':
      return await getOfferDetails(subcommand);

    // ASSETS
    case 'assets':
    case 'tokens':
      if (subcommand === 'search') {
        return await searchAssets(args.join(' '));
      }
      return await listAssets();

    case 'asset':
    case 'token':
      return await getAssetDetails(subcommand);

    // PAIRS
    case 'pairs':
      return await listPairs();

    case 'pair':
      return await getPairDetails(subcommand);

    // STATS
    case 'stats':
      return await getStats();

    // SEARCH
    case 'search':
      return await searchAssets(parts.slice(1).join(' '));

    // PRICE
    case 'price':
      return await getAssetPrice(parts.slice(1).join(' '));

    default:
      // Try as asset lookup
      if (command && command.length > 0) {
        return await getAssetPrice(input);
      }
      return `❌ Unknown command: ${command}\n\nTry 'dex help' for usage.`;
  }
}

// === COMMAND IMPLEMENTATIONS ===

async function listOffers(status) {
  const statusCode = status === 'completed' ? 1 : status === 'cancelled' ? 2 : 0;
  const results = await api.getOffers({ page_size: 20, status: statusCode });
  
  let output = `💱 ${status || 'Active'} Offers:\n\n`;
  
  if (results.offers?.length > 0) {
    results.offers.forEach((offer, i) => {
      const offered = offer.offered[0];
      const requested = offer.requested[0];
      
      output += `${i + 1}. ${formatAmount(offered.amount)} ${offered.code} → ${formatAmount(requested.amount)} ${requested.code}\n`;
      output += `   Price: ${offer.price.toFixed(6)}\n`;
      output += `   ID: ${offer.id}\n\n`;
    });
    
    output += `Total: ${results.count?.toLocaleString() || '?'} offers\n`;
    return output;
  }
  
  return '❌ No offers found';
}

async function getOfferDetails(offerId) {
  if (!offerId) return '❌ Please provide an offer ID';
  
  const offer = await api.getOffer(offerId);
  
  let output = `💱 Offer Details\n\n`;
  
  const offered = offer.offered[0];
  const requested = offer.requested[0];
  
  output += `Offering: ${formatAmount(offered.amount)} ${offered.code}\n`;
  output += `Requesting: ${formatAmount(requested.amount)} ${requested.code}\n`;
  output += `Price: ${offer.price.toFixed(6)} ${requested.code}/${offered.code}\n\n`;
  
  const statusMap = { 0: 'Active', 1: 'Completed', 2: 'Cancelled' };
  output += `Status: ${statusMap[offer.status] || 'Unknown'}\n`;
  output += `Fees: ${offer.fees} XCH\n\n`;
  
  output += `Created: ${new Date(offer.date_found).toLocaleString()}\n`;
  if (offer.date_completed) {
    output += `Completed: ${new Date(offer.date_completed).toLocaleString()}\n`;
  }
  
  output += `\nID: ${offer.id}\n`;
  
  return output;
}

async function listAssets() {
  const results = await api.getAssets({ page_size: 30, sort: 'volume' });
  
  let output = `🪙 Top Tokens by Volume (24h):\n\n`;
  
  if (results.assets?.length > 0) {
    results.assets.forEach((asset, i) => {
      output += `${i + 1}. ${asset.code} - ${asset.name}\n`;
      output += `   Price: $${asset.current_avg_price?.toFixed(6) || 'N/A'}\n`;
      if (asset.volume && asset.volume[0]) {
        output += `   Volume: ${formatAmount(asset.volume[0])} XCH\n`;
      }
      if (asset.liquidity && asset.liquidity[0]) {
        output += `   Liquidity: ${formatAmount(asset.liquidity[0])} XCH\n`;
      }
      output += '\n';
    });
    return output;
  }
  
  return '❌ No assets found';
}

async function getAssetDetails(assetId) {
  if (!assetId) return '❌ Please provide an asset ID or code';
  
  try {
    const asset = await api.getAsset(assetId);
    
    let output = `🪙 ${asset.code} - ${asset.name}\n\n`;
    
    if (asset.description) {
      output += `${asset.description}\n\n`;
    }
    
    output += `Current Price: $${asset.current_avg_price?.toFixed(6) || 'N/A'}\n`;
    
    if (asset.volume && asset.volume[0]) {
      output += `Volume (24h): ${formatAmount(asset.volume[0])} XCH ($${formatAmount(asset.volume[1])})\n`;
    }
    
    if (asset.liquidity && asset.liquidity[0]) {
      output += `Liquidity: ${formatAmount(asset.liquidity[0])} XCH ($${formatAmount(asset.liquidity[1])})\n`;
    }
    
    if (asset.website) {
      output += `\nWebsite: ${asset.website}\n`;
    }
    
    output += `\nAsset ID: ${asset.id}\n`;
    
    return output;
  } catch (e) {
    // Try searching by code
    return await searchAssets(assetId);
  }
}

async function searchAssets(query) {
  if (!query) return '❌ Please provide a search query';
  
  // Search through assets list
  const results = await api.getAssets({ page_size: 100 });
  
  const matches = results.assets?.filter(a => 
    a.code.toLowerCase().includes(query.toLowerCase()) ||
    a.name.toLowerCase().includes(query.toLowerCase())
  ) || [];
  
  if (matches.length === 0) {
    return '❌ No matching tokens found';
  }
  
  let output = `🔍 Search results for "${query}":\n\n`;
  
  matches.slice(0, 10).forEach((asset, i) => {
    output += `${i + 1}. ${asset.code} - ${asset.name}\n`;
    output += `   Price: $${asset.current_avg_price?.toFixed(6) || 'N/A'}\n`;
    output += `   ID: ${asset.id}\n\n`;
  });
  
  return output;
}

async function getAssetPrice(query) {
  if (!query) return '❌ Please provide a token code or name';
  
  const results = await api.getAssets({ page_size: 100 });
  
  const match = results.assets?.find(a => 
    a.code.toLowerCase() === query.toLowerCase() ||
    a.name.toLowerCase() === query.toLowerCase()
  );
  
  if (!match) {
    return `❌ Token "${query}" not found. Try: dex search ${query}`;
  }
  
  let output = `💰 ${match.code} Price\n\n`;
  output += `$${match.current_avg_price?.toFixed(6) || 'N/A'}\n`;
  
  if (match.volume && match.volume[0]) {
    output += `Volume (24h): ${formatAmount(match.volume[0])} XCH\n`;
  }
  
  return output;
}

async function listPairs() {
  const results = await api.getPairs();
  
  let output = `📊 Trading Pairs:\n\n`;
  
  if (results.pairs?.length > 0) {
    results.pairs.slice(0, 20).forEach((pair, i) => {
      output += `${i + 1}. ${pair.base.code}/${pair.quote.code}\n`;
    });
    
    output += `\nTotal: ${results.pairs.length} pairs\n`;
    return output;
  }
  
  return '❌ No pairs found';
}

async function getPairDetails(pairId) {
  if (!pairId) return '❌ Please provide a pair ID';
  
  const pair = await api.getPair(pairId);
  
  let output = `📊 ${pair.base.code}/${pair.quote.code}\n\n`;
  output += `Base: ${pair.base.name}\n`;
  output += `Quote: ${pair.quote.name}\n`;
  
  return output;
}

async function getStats() {
  const stats = await api.getStats();
  
  let output = `📈 Dexie Stats\n\n`;
  
  if (stats.total_volume_24h) {
    output += `Volume (24h): ${formatAmount(stats.total_volume_24h)} XCH\n`;
  }
  
  if (stats.total_trades_24h) {
    output += `Trades (24h): ${stats.total_trades_24h.toLocaleString()}\n`;
  }
  
  if (stats.active_offers) {
    output += `Active Offers: ${stats.active_offers.toLocaleString()}\n`;
  }
  
  return output;
}

// === FORMATTING HELPERS ===

function formatAmount(amount) {
  if (!amount && amount !== 0) return 'N/A';
  
  if (amount >= 1000000) {
    return `${(amount / 1000000).toFixed(2)}M`;
  }
  if (amount >= 1000) {
    return `${(amount / 1000).toFixed(2)}K`;
  }
  return amount.toFixed(2);
}

module.exports = { handleCommand };


path: install.sh
content: #!/bin/bash

cd "$(dirname "$0")"

echo "📦 Installing Dexie skill dependencies..."
npm install --production

if [ $? -eq 0 ]; then
  echo "✅ Dexie skill installed successfully!"
  echo ""
  echo "Usage:"
  echo "  CLI: dex <command>"
  echo "  Telegram: /dex <command>"
  echo ""
  echo "Run 'dex help' for command reference."
else
  echo "❌ Installation failed. Please check npm logs."
  exit 1
fi


path: lib/api.js
content: const axios = require('axios');

const BASE_URL = 'https://api.dexie.space/v1';

class DexieAPI {
  constructor(baseURL = BASE_URL) {
    this.client = axios.create({
      baseURL,
      timeout: 30000,
      headers: {
        'Accept': 'application/json',
        'User-Agent': 'Clawdbot-Dexie-Skill/1.0'
      }
    });
  }

  // === OFFERS ===
  
  async getOffers(options = {}) {
    const {
      page = 1,
      page_size = 20,
      status = null,
      offered = null,
      requested = null,
      compact = false,
      sort = null
    } = options;
    
    const params = { page, page_size, compact };
    if (status !== null) params.status = status;
    if (offered) params.offered = offered;
    if (requested) params.requested = requested;
    if (sort) params.sort = sort;
    
    return this._get('/offers', params);
  }

  async getOffer(offerId) {
    return this._get(`/offers/${offerId}`);
  }

  // === ASSETS (TOKENS) ===
  
  async getAssets(options = {}) {
    const { page = 1, page_size = 50, sort = 'volume' } = options;
    return this._get('/assets', { page, page_size, sort });
  }

  async getAsset(assetId) {
    return this._get(`/assets/${assetId}`);
  }

  // === PAIRS ===
  
  async getPairs() {
    return this._get('/pairs');
  }

  async getPair(pairId) {
    return this._get(`/pairs/${pairId}`);
  }

  // === STATS ===
  
  async getStats() {
    return this._get('/stats');
  }

  // === CATs (Chia Asset Tokens) ===
  
  async searchCATs(query, options = {}) {
    const { page = 1, page_size = 20 } = options;
    return this._get('/cats/search', { q: query, page, page_size });
  }

  // === INTERNAL ===
  
  async _get(path, params = {}) {
    try {
      const response = await this.client.get(path, { params });
      return response.data;
    } catch (error) {
      if (error.response) {
        const msg = error.response.data?.error_message || error.response.statusText;
        throw new Error(`Dexie API error: ${error.response.status} - ${msg}`);
      } else if (error.request) {
        throw new Error('Dexie API request failed: No response received');
      } else {
        throw new Error(`Dexie API error: ${error.message}`);
      }
    }
  }

  // Pagination helper
  async *paginate(method, ...args) {
    let page = 1;
    const page_size = 50;
    
    while (true) {
      const options = args[args.length - 1] || {};
      options.page = page;
      options.page_size = page_size;
      
      const result = await method.call(this, ...args.slice(0, -1), options);
      
      if (!result || !result.success || !result.offers && !result.assets) {
        break;
      }
      
      const items = result.offers || result.assets || [];
      if (items.length === 0) {
        break;
      }
      
      yield items;
      
      if (items.length < page_size) {
        break;
      }
      
      page++;
    }
  }
}

module.exports = DexieAPI;


path: package-lock.json
content: {
  "name": "@clawdbot/skill-dexie",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "@clawdbot/skill-dexie",
      "version": "1.0.0",
      "license": "MIT",
      "dependencies": {
        "axios": "^1.6.0"
      },
      "bin": {
        "dex": "cli.js",
        "dexie": "cli.js"
      },
      "engines": {
        "node": ">=18.0.0"
      }
    },
    "node_modules/asynckit": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    },
    "node_modules/axios": {
      "version": "1.13.4",
      "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "follow-redirects": "^1.15.6",
        "form-data": "^4.0.4",
        "proxy-from-env": "^1.1.0"
      }
    },
    "node_modules/call-bind-apply-helpers": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/combined-stream": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "delayed-stream": "~1.0.0"
      },
      "engines": {
        "node": ">= 0.8"
      }
    },
    "node_modules/delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/dunder-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "call-bind-apply-helpers": "^1.0.1",
        "es-errors": "^1.3.0",
        "gopd": "^1.2.0"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/es-define-property": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/es-errors": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/es-object-atoms": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "es-errors": "^1.3.0"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/es-set-tostringtag": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "es-errors": "^1.3.0",
        "get-intrinsic": "^1.2.6",
        "has-tostringtag": "^1.0.2",
        "hasown": "^2.0.2"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/follow-redirects": {
      "version": "1.15.11",
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
      "integrity": [REDACTED_SECRET],
      "funding": [
        {
          "type": "individual",
          "url": "https://github.com/sponsors/RubenVerborgh"
        }
      ],
      "license": "MIT",
      "engines": {
        "node": ">=4.0"
      },
      "peerDependenciesMeta": {
        "debug": {
          "optional": true
        }
      }
    },
    "node_modules/form-data": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.8",
        "es-set-tostringtag": "^2.1.0",
        "hasown": "^2.0.2",
        "mime-types": "^2.1.12"
      },
      "engines": {
        "node": ">= 6"
      }
    },
    "node_modules/function-bind": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/get-intrinsic": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "call-bind-apply-helpers": "^1.0.2",
        "es-define-property": "^1.0.1",
        "es-errors": "^1.3.0",
        "es-object-atoms": "^1.1.1",
        "function-bind": "^1.1.2",
        "get-proto": "^1.0.1",
        "gopd": "^1.2.0",
        "has-symbols": "^1.1.0",
        "hasown": "^2.0.2",
        "math-intrinsics": "^1.1.0"
      },
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/get-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "dunder-proto": "^1.0.1",
        "es-object-atoms": "^1.0.0"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/gopd": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/has-symbols": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/has-tostringtag": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "has-symbols": "^1.0.3"
      },
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/hasown": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "function-bind": "^1.1.2"
      },
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/math-intrinsics": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.4"
      }
    },
    "node_modules/mime-db": {
      "version": "1.52.0",
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "engines": {
        "node": ">= 0.6"
      }
    },
    "node_modules/mime-types": {
      "version": "2.1.35",
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT",
      "dependencies": {
        "mime-db": "1.52.0"
      },
      "engines": {
        "node": ">= 0.6"
      }
    },
    "node_modules/proxy-from-env": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "license": "MIT"
    }
  }
}


path: package.json
content: {
  "name": "@clawdbot/skill-dexie",
  "version": "1.0.0",
  "description": "Chia DEX trading via Dexie.space API - track offers, prices, and liquidity",
  "main": "index.js",
  "bin": {
    "dexie": "./cli.js",
    "dex": "./cli.js"
  },
  "scripts": {
    "test": "echo \"No tests yet\" && exit 0"
  },
  "keywords": [
    "chia",
    "dex",
    "dexie",
    "trading",
    "defi",
    "blockchain",
    "clawdbot-skill"
  ],
  "author": "Jeff Coleman",
  "license": "MIT",
  "dependencies": {
    "axios": "^1.6.0"
  },
  "engines": {
    "node": ">=18.0.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/Koba42Corp/dexie-skill.git"
  },
  "homepage": "https://github.com/Koba42Corp/dexie-skill#readme",
  "bugs": {
    "url": "https://github.com/Koba42Corp/dexie-skill/issues"
  }
}


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)