{"_id":"@el_saintt/crispy-goggles","_rev":"2-c5d4e3e5c0e481e17932907ab20c2abb","name":"@el_saintt/crispy-goggles","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@el_saintt/crispy-goggles","version":"1.0.0","keywords":["portfolio","api","aggregator","cli","developer-tools","github","youtube","medium","twitter","linkedin","instagram","figma","stackoverflow","devto","substack"],"author":"","license":"MIT","_id":"@el_saintt/crispy-goggles@1.0.0","maintainers":[{"name":"el_saintt","email":"elmitchay@gmail.com"}],"homepage":"https://github.com/stElmitchay/crispy-goggles#readme","bugs":{"url":"https://github.com/stElmitchay/crispy-goggles/issues"},"bin":{"portfolio":"dist/cli.js","crispy-goggles":"dist/cli.js"},"dist":{"shasum":"d306c50e5f94f25c42f572c7fb638e5e6c6cb913","tarball":"https://registry.npmjs.org/@el_saintt/crispy-goggles/-/crispy-goggles-1.0.0.tgz","fileCount":27,"integrity":"sha512-+FXv3Syy0xmjPKgGQO/HFtJW15JWdOgAi58oNXAtQ493X2y2WFT7cFL6kFWr7GKhS3syxGbgDtZQH5qNgmoBKQ==","signatures":[{"sig":"MEUCICxQwovEUzVCGeaKsjsQ2dqnDv9tCia2Jxb6TI0dWD9jAiEAkRtEKh/0qnVpvii0BqJSAEgqUiiZyg0s5gz2UGCjAkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1119240},"main":"./dist/index.js","_from":"file:el_saintt-crispy-goggles-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./core":{"types":"./dist/core.d.ts","import":"./dist/core.mjs","require":"./dist/core.js"},"./plugins/*":{"types":"./dist/plugins/*.d.ts","import":"./dist/plugins/*.mjs","require":"./dist/plugins/*.js"},"./adapters/nextjs":{"types":"./dist/adapter-nextjs.d.ts","import":"./dist/adapter-nextjs.mjs","require":"./dist/adapter-nextjs.js"},"./adapters/express":{"types":"./dist/adapter-express.d.ts","import":"./dist/adapter-express.mjs","require":"./dist/adapter-express.js"}},"gitHead":"223363c33555a40217d8b6530d225c417c63f32e","scripts":{"dev":"tsup src/index.ts src/cli.ts --format cjs,esm --dts --watch","test":"vitest run","build":"tsup src/index.ts src/cli.ts --format cjs,esm --dts","test:watch":"vitest"},"_npmUser":{"name":"el_saintt","email":"elmitchay@gmail.com"},"_resolved":"/private/var/folders/60/fd86h0px5fg_3k_5k1s7h1dc0000gp/T/ac88c4ae6cd91f92f7c6fb42da735d5f/el_saintt-crispy-goggles-1.0.0.tgz","_integrity":"sha512-+FXv3Syy0xmjPKgGQO/HFtJW15JWdOgAi58oNXAtQ493X2y2WFT7cFL6kFWr7GKhS3syxGbgDtZQH5qNgmoBKQ==","repository":{"url":"git+https://github.com/stElmitchay/crispy-goggles.git","type":"git"},"_npmVersion":"10.5.0","description":"All-in-one portfolio data aggregator API - Includes core, all plugins, adapters, and CLI tools","directories":{},"_nodeVersion":"21.7.3","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2","inquirer":"^8.2.6","commander":"^11.1.0","cli-table3":"^0.6.3","@el_saintt/core":"1.0.0","@el_saintt/plugin-devto":"1.0.0","@el_saintt/plugin-figma":"1.0.0","@el_saintt/plugin-github":"1.0.0","@el_saintt/plugin-medium":"1.0.0","@el_saintt/adapter-nextjs":"1.0.0","@el_saintt/plugin-twitter":"1.0.0","@el_saintt/plugin-youtube":"1.0.0","@el_saintt/adapter-express":"1.0.0","@el_saintt/plugin-linkedin":"1.0.0","@el_saintt/plugin-substack":"1.0.0","@el_saintt/plugin-instagram":"1.0.0","@el_saintt/plugin-stackoverflow":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.2.0","typescript":"^5.3.3","@types/node":"^20.11.0","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/crispy-goggles_1.0.0_1760112593775_0.8081584565731166","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@el_saintt/crispy-goggles","version":"1.1.0","description":"All-in-one portfolio data aggregator API - Includes core, all plugins, adapters, and CLI tools","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","bin":{"crispy-goggles":"dist/cli.js","portfolio":"dist/cli.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"},"./core":{"require":"./dist/core.js","import":"./dist/core.mjs","types":"./dist/core.d.ts"},"./adapters/express":{"require":"./dist/adapter-express.js","import":"./dist/adapter-express.mjs","types":"./dist/adapter-express.d.ts"},"./adapters/nextjs":{"require":"./dist/adapter-nextjs.js","import":"./dist/adapter-nextjs.mjs","types":"./dist/adapter-nextjs.d.ts"},"./plugins/*":{"require":"./dist/plugins/*.js","import":"./dist/plugins/*.mjs","types":"./dist/plugins/*.d.ts"}},"keywords":["portfolio","api","aggregator","cli","developer-tools","github","youtube","medium","twitter","linkedin","instagram","figma","stackoverflow","devto","substack"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/stElmitchay/crispy-goggles.git"},"bugs":{"url":"https://github.com/stElmitchay/crispy-goggles/issues"},"homepage":"https://github.com/stElmitchay/crispy-goggles#readme","dependencies":{"commander":"^11.1.0","inquirer":"^8.2.6","chalk":"^4.1.2","ora":"^5.4.1","cli-table3":"^0.6.3","@el_saintt/core":"1.0.0","@el_saintt/plugin-github":"1.0.0","@el_saintt/adapter-nextjs":"1.0.0","@el_saintt/plugin-stackoverflow":"1.0.0","@el_saintt/adapter-express":"1.0.0","@el_saintt/plugin-medium":"1.0.0","@el_saintt/plugin-devto":"1.0.0","@el_saintt/plugin-twitter":"1.0.0","@el_saintt/plugin-linkedin":"1.0.0","@el_saintt/plugin-youtube":"1.0.0","@el_saintt/plugin-substack":"1.0.0","@el_saintt/plugin-figma":"1.0.0","@el_saintt/plugin-instagram":"1.0.0"},"devDependencies":{"@types/node":"^20.11.0","@types/inquirer":"^9.0.7","tsup":"^8.0.1","typescript":"^5.3.3","vitest":"^1.2.0"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup src/index.ts src/cli.ts --format cjs,esm --dts","dev":"tsup src/index.ts src/cli.ts --format cjs,esm --dts --watch","test":"vitest run","test:watch":"vitest"},"gitHead":"223363c33555a40217d8b6530d225c417c63f32e","_id":"@el_saintt/crispy-goggles@1.1.0","_integrity":"sha512-cY59vxFCethvYRp2kDWBlxmnWNCLGZproDRS3AbFMjNA0F2q0MePDIlSLKJBEm1SdOkhXR1hq9p+WoY2gTE4Ag==","_resolved":"/private/var/folders/60/fd86h0px5fg_3k_5k1s7h1dc0000gp/T/08ca11ba5c7b14510831f3fa9038d4b5/el_saintt-crispy-goggles-1.1.0.tgz","_from":"file:el_saintt-crispy-goggles-1.1.0.tgz","_nodeVersion":"21.7.3","_npmVersion":"10.5.0","dist":{"integrity":"sha512-cY59vxFCethvYRp2kDWBlxmnWNCLGZproDRS3AbFMjNA0F2q0MePDIlSLKJBEm1SdOkhXR1hq9p+WoY2gTE4Ag==","shasum":"c05d3156d14b318a8e2305a87d0d43764ffa90f2","tarball":"https://registry.npmjs.org/@el_saintt/crispy-goggles/-/crispy-goggles-1.1.0.tgz","fileCount":27,"unpackedSize":1129326,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDfoqfWgsauF93XHmicI+4CoIfHy0+hgiQn+UjZlzX+FQIhAMN/QklmluC0Ils2xwNZqmBqJZ62H04LZA/6UPaoAVVC"}]},"_npmUser":{"name":"el_saintt","email":"elmitchay@gmail.com"},"directories":{},"maintainers":[{"name":"el_saintt","email":"elmitchay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/crispy-goggles_1.1.0_1760113713945_0.1907971234045973"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-10T16:09:53.652Z","modified":"2025-10-10T16:28:34.349Z","1.0.0":"2025-10-10T16:09:54.017Z","1.1.0":"2025-10-10T16:28:34.168Z"},"bugs":{"url":"https://github.com/stElmitchay/crispy-goggles/issues"},"license":"MIT","homepage":"https://github.com/stElmitchay/crispy-goggles#readme","keywords":["portfolio","api","aggregator","cli","developer-tools","github","youtube","medium","twitter","linkedin","instagram","figma","stackoverflow","devto","substack"],"repository":{"type":"git","url":"git+https://github.com/stElmitchay/crispy-goggles.git"},"description":"All-in-one portfolio data aggregator API - Includes core, all plugins, adapters, and CLI tools","maintainers":[{"name":"el_saintt","email":"elmitchay@gmail.com"}],"readme":"# @el_saintt/crispy-goggles\n\n> **A unified portfolio data aggregator that consolidates content from multiple platforms into a single, easy-to-use API**\n\nCrispy Goggles is an all-in-one TypeScript/JavaScript library that helps developers aggregate and display their portfolio content from various platforms (GitHub, YouTube, Medium, Twitter, LinkedIn, and more) through a single, consistent interface. Perfect for building developer portfolios, personal websites, and content dashboards.\n\n[![npm version](https://img.shields.io/npm/v/@el_saintt/crispy-goggles.svg)](https://www.npmjs.com/package/@el_saintt/crispy-goggles)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n---\n\n## Table of Contents\n\n- [What is Crispy Goggles?](#what-is-crispy-goggles)\n- [Why Use Crispy Goggles?](#why-use-crispy-goggles)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Features](#features)\n- [Supported Platforms](#supported-platforms)\n- [Usage](#usage)\n  - [As a Library](#as-a-library)\n  - [CLI Tools](#cli-tools)\n  - [Framework Adapters](#framework-adapters)\n- [Configuration](#configuration)\n- [API Reference](#api-reference)\n- [CLI Commands](#cli-commands)\n- [Examples](#examples)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## What is Crispy Goggles?\n\nCrispy Goggles is a **portfolio data aggregation platform** that solves a common problem for developers and content creators: **managing and displaying content from multiple platforms**.\n\nInstead of manually integrating with GitHub API, YouTube API, Medium RSS feeds, Twitter API, and others separately, Crispy Goggles provides:\n\n- ✅ **Unified interface** - One consistent API for all platforms\n- ✅ **Built-in caching** - Reduce API calls and improve performance\n- ✅ **Type safety** - Full TypeScript support with generated types\n- ✅ **Error handling** - Graceful degradation when services are unavailable\n- ✅ **Rate limiting** - Automatic rate limit handling\n- ✅ **Easy setup** - Interactive CLI for configuration\n- ✅ **Framework agnostic** - Works with Express, Next.js, or any Node.js environment\n\n### The Problem It Solves\n\nBuilding a developer portfolio that showcases your work across multiple platforms typically requires:\n\n1. Learning and integrating with 5-10 different APIs\n2. Managing authentication tokens and credentials for each service\n3. Implementing caching to avoid rate limits\n4. Handling errors and edge cases for each platform\n5. Normalizing data formats from different sources\n6. Maintaining all these integrations over time\n\n**Crispy Goggles does all of this for you** in a single package.\n\n---\n\n## Why Use Crispy Goggles?\n\n### Before Crispy Goggles\n\n```bash\n# Install separate packages for each platform\nnpm install @octokit/rest        # GitHub\nnpm install googleapis           # YouTube\nnpm install twitter-api-v2       # Twitter\nnpm install axios                # For various REST APIs\n# ... and many more\n\n# Write custom integration code for each platform\n# Manage 10+ different authentication methods\n# Handle rate limiting, caching, errors separately\n```\n\n### With Crispy Goggles\n\n```bash\n# One package, everything included\nnpm install @el_saintt/crispy-goggles\n```\n\n```typescript\n// Simple, unified API\nconst client = new PortfolioClient();\nclient.use(GitHubPlugin.githubPlugin);\nclient.use(YouTubePlugin.youtubePlugin);\n\nconst data = await client.fetchAll();\n// Get normalized data from all platforms\n```\n\n---\n\n## Installation\n\n### As a Library\n\n```bash\nnpm install @el_saintt/crispy-goggles\n```\n\nOr with other package managers:\n\n```bash\n# Yarn\nyarn add @el_saintt/crispy-goggles\n\n# pnpm\npnpm add @el_saintt/crispy-goggles\n\n# bun\nbun add @el_saintt/crispy-goggles\n```\n\n### CLI Tool (Global Install)\n\n```bash\nnpm install -g @el_saintt/crispy-goggles\n```\n\nAfter global installation, you can use the `crispy-goggles` command anywhere.\n\n---\n\n## Quick Start\n\n### 1. Initialize Configuration\n\n```bash\nnpx crispy-goggles init\n```\n\nThis interactive wizard will:\n- Help you select which platforms to integrate\n- Prompt for API credentials\n- Generate configuration files\n- Create environment variable templates\n\n### 2. Use in Your Application\n\n```typescript\nimport { PortfolioClient, GitHubPlugin, YouTubePlugin } from '@el_saintt/crispy-goggles';\n\n// Create client\nconst client = new PortfolioClient({\n  cache: { ttl: 3600 }, // Cache for 1 hour\n  rateLimit: { maxRequests: 10, perSeconds: 60 }\n});\n\n// Register plugins\nclient.use(GitHubPlugin.githubPlugin);\nclient.use(YouTubePlugin.youtubePlugin);\n\n// Fetch data from all platforms\nconst allData = await client.fetchAll();\n\n// Or fetch from specific platform\nconst githubData = await client.fetch('github');\n\nconsole.log(allData);\n```\n\n### 3. Test Your Configuration\n\n```bash\nnpx crispy-goggles test\n```\n\nThis will validate your credentials and test connectivity to all configured platforms.\n\n---\n\n## Features\n\n### Core Features\n\n- **🔌 10+ Platform Plugins** - GitHub, YouTube, Medium, Dev.to, Twitter, LinkedIn, Instagram, Figma, Stack Overflow, Substack\n- **⚡ Performance Optimized** - Built-in caching with Redis or in-memory options\n- **🛡️ Type Safe** - Full TypeScript support with auto-generated types\n- **🔄 Rate Limiting** - Automatic rate limit handling and retry logic\n- **📊 Unified Data Model** - Consistent data structure across all platforms\n- **🎨 Framework Adapters** - Pre-built integrations for Express and Next.js\n- **🛠️ Developer Tools** - CLI for setup, testing, and validation\n- **📝 Extensible** - Easy to create custom plugins for additional platforms\n\n### Built-in Capabilities\n\n- **Caching System** - Reduce API calls and improve response times\n- **Error Recovery** - Graceful degradation when platforms are unavailable\n- **Credential Management** - Secure handling of API tokens and secrets\n- **Data Transformation** - Normalize data from different platforms\n- **Batch Operations** - Fetch from multiple platforms in parallel\n- **Logging & Debugging** - Comprehensive logging for troubleshooting\n\n---\n\n## Supported Platforms\n\nCrispy Goggles includes built-in support for these platforms:\n\n| Platform | Data Types | Authentication |\n|----------|-----------|----------------|\n| **GitHub** | Repositories, stars, commits, issues, PRs | Personal access token |\n| **YouTube** | Videos, playlists, channel stats | API key |\n| **Medium** | Articles, publications | Username (RSS) |\n| **Dev.to** | Posts, reactions, comments | API key |\n| **Twitter** | Tweets, mentions, followers | Bearer token |\n| **LinkedIn** | Posts, connections, profile | OAuth 2.0 |\n| **Instagram** | Posts, stories, profile | Access token |\n| **Figma** | Files, projects, designs | Access token |\n| **Stack Overflow** | Questions, answers, reputation | API key (optional) |\n| **Substack** | Newsletter posts | Username (RSS) |\n\n> **Note:** Some platforms require API approval or developer accounts. Check each platform's documentation for specific requirements.\n\n---\n\n## Usage\n\n### As a Library\n\n#### Basic Usage\n\n```typescript\nimport { PortfolioClient, GitHubPlugin } from '@el_saintt/crispy-goggles';\n\nconst client = new PortfolioClient({\n  services: {\n    github: {\n      credentials: {\n        username: 'your-username',\n        token: process.env.GITHUB_TOKEN\n      }\n    }\n  }\n});\n\nclient.use(GitHubPlugin.githubPlugin);\nconst repos = await client.fetch('github');\n```\n\n#### With Multiple Platforms\n\n```typescript\nimport {\n  PortfolioClient,\n  GitHubPlugin,\n  YouTubePlugin,\n  MediumPlugin,\n  DevToPlugin\n} from '@el_saintt/crispy-goggles';\n\nconst client = new PortfolioClient({\n  cache: { ttl: 3600 },\n  services: {\n    github: { credentials: { username: 'user', token: process.env.GITHUB_TOKEN } },\n    youtube: { credentials: { apiKey: process.env.YOUTUBE_API_KEY, channelId: 'channel-id' } },\n    medium: { credentials: { username: '@username' } },\n    devto: { credentials: { apiKey: process.env.DEVTO_API_KEY } }\n  }\n});\n\n// Register all plugins\nclient.use(GitHubPlugin.githubPlugin);\nclient.use(YouTubePlugin.youtubePlugin);\nclient.use(MediumPlugin.mediumPlugin);\nclient.use(DevToPlugin.devtoPlugin);\n\n// Fetch from all platforms\nconst allData = await client.fetchAll();\n\n// Or fetch individually\nconst githubData = await client.fetch('github');\nconst youtubeData = await client.fetch('youtube');\n```\n\n#### With Caching\n\n```typescript\nimport { PortfolioClient, RedisCache } from '@el_saintt/crispy-goggles';\n\nconst client = new PortfolioClient({\n  cache: new RedisCache({\n    host: 'localhost',\n    port: 6379,\n    ttl: 3600 // 1 hour\n  })\n});\n```\n\n---\n\n### CLI Tools\n\nCrispy Goggles includes a powerful CLI for managing your portfolio configuration.\n\n#### Initialize Project\n\n```bash\nnpx crispy-goggles init\n```\n\n**Interactive mode** (default):\n- Select platforms to configure\n- Enter credentials interactively\n- Generate configuration files\n\n**Non-interactive mode:**\n```bash\nnpx crispy-goggles init --no-interactive --services github,youtube,medium\n```\n\n#### Test Connections\n\n```bash\n# Test all services\nnpx crispy-goggles test\n\n# Test specific service\nnpx crispy-goggles test github\n\n# Test with verbose output\nnpx crispy-goggles test --verbose\n\n# Test and fetch sample data\nnpx crispy-goggles test --fetch\n```\n\n#### Validate Configuration\n\n```bash\nnpx crispy-goggles validate\n```\n\nValidates:\n- Configuration file syntax\n- Environment variables\n- Credential formats\n- API connectivity\n\n#### Generate TypeScript Types\n\n```bash\nnpx crispy-goggles types\n```\n\nGenerates type-safe helpers based on your configuration.\n\n#### View Service Information\n\n```bash\n# List all available plugins\nnpx crispy-goggles plugins\n\n# Get details about a specific service\nnpx crispy-goggles info github\n```\n\n---\n\n### Framework Adapters\n\n#### Express.js\n\n```typescript\nimport express from 'express';\nimport { PortfolioClient, GitHubPlugin, ExpressAdapter } from '@el_saintt/crispy-goggles';\n\nconst app = express();\nconst client = new PortfolioClient({ /* config */ });\nclient.use(GitHubPlugin.githubPlugin);\n\n// Use built-in middleware\napp.use('/api/portfolio', ExpressAdapter.createRouter(client));\n\n// Or create custom routes\napp.get('/api/github', async (req, res) => {\n  const data = await client.fetch('github');\n  res.json(data);\n});\n```\n\n#### Next.js\n\n```typescript\n// app/api/portfolio/route.ts\nimport { PortfolioClient, GitHubPlugin, NextJSAdapter } from '@el_saintt/crispy-goggles';\n\nconst client = new PortfolioClient({ /* config */ });\nclient.use(GitHubPlugin.githubPlugin);\n\nexport const GET = NextJSAdapter.createHandler(client);\n\n// Or custom API route\nexport async function GET(request: Request) {\n  const data = await client.fetchAll();\n  return Response.json(data);\n}\n```\n\n---\n\n## Configuration\n\n### Configuration File\n\nCreate `portfolio.config.ts`:\n\n```typescript\nimport type { PortfolioConfig } from '@el_saintt/crispy-goggles';\n\nexport const config: PortfolioConfig = {\n  cache: {\n    ttl: 3600, // 1 hour\n    type: 'memory' // or 'redis'\n  },\n  rateLimit: {\n    maxRequests: 10,\n    perSeconds: 60\n  },\n  services: {\n    github: {\n      credentials: {\n        username: process.env.GITHUB_USERNAME!,\n        token: process.env.GITHUB_TOKEN!\n      }\n    },\n    youtube: {\n      credentials: {\n        apiKey: process.env.YOUTUBE_API_KEY!,\n        channelId: process.env.YOUTUBE_CHANNEL_ID!\n      }\n    }\n  }\n};\n```\n\n### Environment Variables\n\nCreate `.env.local`:\n\n```bash\n# GitHub\nGITHUB_USERNAME=your-username\nGITHUB_TOKEN=ghp_xxxxxxxxxxxxx\n\n# YouTube\nYOUTUBE_API_KEY=AIzaxxxxxxxxx\nYOUTUBE_CHANNEL_ID=UCxxxxxxxxx\n\n# Dev.to\nDEVTO_API_KEY=xxxxxxxxxxxxx\n\n# Twitter\nTWITTER_BEARER_TOKEN=xxxxxxxxxxxxx\n```\n\n---\n\n## API Reference\n\n### PortfolioClient\n\nMain client for interacting with platform APIs.\n\n```typescript\nconst client = new PortfolioClient(config);\n```\n\n**Methods:**\n- `use(plugin)` - Register a plugin\n- `fetch(serviceId)` - Fetch data from specific service\n- `fetchAll()` - Fetch data from all registered services\n- `validateConfiguration()` - Validate current configuration\n\n### Plugins\n\nAll plugins follow the same interface:\n\n```typescript\nimport { GitHubPlugin } from '@el_saintt/crispy-goggles';\n\nclient.use(GitHubPlugin.githubPlugin);\n```\n\nAvailable plugins:\n- `GitHubPlugin.githubPlugin`\n- `YouTubePlugin.youtubePlugin`\n- `MediumPlugin.mediumPlugin`\n- `DevToPlugin.devtoPlugin`\n- `TwitterPlugin.twitterPlugin`\n- `LinkedInPlugin.linkedinPlugin`\n- `InstagramPlugin.instagramPlugin`\n- `FigmaPlugin.figmaPlugin`\n- `StackOverflowPlugin.stackoverflowPlugin`\n- `SubstackPlugin.substackPlugin`\n\n---\n\n## CLI Commands\n\n| Command | Description | Options |\n|---------|-------------|---------|\n| `init` | Initialize configuration | `--no-interactive`, `--services` |\n| `test [service]` | Test API connections | `--verbose`, `--fetch`, `--json` |\n| `validate` | Validate configuration | `--json`, `--config` |\n| `types` | Generate TypeScript types | `--output` |\n| `info <service>` | Show service details | - |\n| `plugins` | List available plugins | `--json` |\n\n**Global Options:**\n- `-v, --verbose` - Enable verbose output\n- `--json` - Output as JSON\n- `-c, --config <path>` - Config file path\n- `-e, --env <path>` - Environment file path\n\n---\n\n## Examples\n\n### Building a Portfolio Dashboard\n\n```typescript\nimport { PortfolioClient, GitHubPlugin, YouTubePlugin, MediumPlugin } from '@el_saintt/crispy-goggles';\n\nconst client = new PortfolioClient({\n  cache: { ttl: 3600 }\n});\n\nclient.use(GitHubPlugin.githubPlugin);\nclient.use(YouTubePlugin.youtubePlugin);\nclient.use(MediumPlugin.mediumPlugin);\n\nasync function getDashboardData() {\n  const data = await client.fetchAll();\n\n  return {\n    github: {\n      repos: data.github.repositories,\n      stars: data.github.totalStars\n    },\n    youtube: {\n      videos: data.youtube.recentVideos,\n      subscribers: data.youtube.subscriberCount\n    },\n    medium: {\n      posts: data.medium.articles\n    }\n  };\n}\n```\n\n### REST API Endpoint\n\n```typescript\nimport express from 'express';\nimport { PortfolioClient, GitHubPlugin } from '@el_saintt/crispy-goggles';\n\nconst app = express();\nconst client = new PortfolioClient();\nclient.use(GitHubPlugin.githubPlugin);\n\napp.get('/api/stats', async (req, res) => {\n  try {\n    const data = await client.fetchAll();\n    res.json({ success: true, data });\n  } catch (error) {\n    res.status(500).json({ success: false, error: error.message });\n  }\n});\n\napp.listen(3000);\n```\n\n---\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n### Development Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/stElmitchay/crispy-goggles.git\n\n# Install dependencies\npnpm install\n\n# Build packages\npnpm build\n\n# Run tests\npnpm test\n\n# Watch mode\npnpm dev\n```\n\n---\n\n## License\n\nMIT © [Portfolio API Contributors](LICENSE)\n\n---\n\n## Support\n\n- 📖 [Documentation](https://github.com/stElmitchay/crispy-goggles/wiki)\n- 🐛 [Report Issues](https://github.com/stElmitchay/crispy-goggles/issues)\n- 💬 [Discussions](https://github.com/stElmitchay/crispy-goggles/discussions)\n\n---\n\n## Why \"Crispy Goggles\"?\n\nBecause managing multiple platform integrations should be **crystal clear** (like looking through crispy, clean goggles) and not a blurry mess! 🥽✨\n","readmeFilename":"README.md"}