chore: import upstream snapshot with attribution
Component Security Validation / Security Audit (push) Has been cancelled
Deploy to Cloudflare Pages / deploy (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 12:38:58 +08:00
commit bb5c75ce05
8824 changed files with 1946442 additions and 0 deletions
+148
View File
@@ -0,0 +1,148 @@
# Claude Jobs Scraper
Script para encontrar trabajos relacionados con Claude Code y Anthropic Claude utilizando múltiples fuentes y APIs profesionales.
## 🎯 Características
- **APIs Profesionales**: RapidAPI Jobs, Google Jobs (SerpAPI)
- **Scraping Tradicional**: GitHub, YCombinator, WeWorkRemotely (fallback)
- **Filtrado Estricto**: Solo trabajos que mencionen "Claude" explícitamente
- **Datos Estructurados**: JSON compatible con la web existente
- **Rate Limiting**: Manejo responsable de APIs
## 📋 Requisitos
### Opción 1: APIs Profesionales (Recomendado)
1. **RapidAPI Jobs API** - Acceso a 200M+ trabajos de LinkedIn, Indeed, Glassdoor
- Regístrate en: https://rapidapi.com/letscrape-6bRBa3QguO5/api/jobs-search-realtime-data-api/
- Plan gratuito: 100 requests/mes
- Plan pagado: Desde $10/mes
2. **SerpAPI (Google Jobs)** - Búsqueda semántica avanzada
- Regístrate en: https://serpapi.com/
- Plan gratuito: 100 búsquedas/mes
- Plan pagado: Desde $50/mes
### Opción 2: Solo Scraping Gratuito
- No requiere APIs pagadas
- Resultados limitados debido a restricciones de sitios web
## ⚙️ Configuración
1. **Copia el archivo de configuración**:
```bash
cp .env.example .env
```
2. **Agrega tus API keys en `.env`**:
```bash
# Para mejores resultados
RAPIDAPI_KEY=tu_clave_rapidapi
SERPAPI_KEY=tu_clave_serpapi
# Opcional
GITHUB_TOKEN=tu_token_github
```
3. **Instala dependencias**:
```bash
pip install requests python-dotenv
```
## 🚀 Uso
```bash
python generate_claude_jobs.py
```
### Flujo de Funcionamiento:
1. **APIs Profesionales** (si están configuradas)
- RapidAPI: Busca en LinkedIn, Indeed, Glassdoor, etc.
- Google Jobs: Búsqueda semántica avanzada
2. **Scraping Tradicional** (fallback si no hay APIs)
- GitHub Issues/Discussions
- YCombinator Who's Hiring
- WeWorkRemotely RSS
3. **Generación del JSON**:
- Archivo: `docs/claude-jobs.json`
- Estructura compatible con la web existente
## 📊 Datos Generados
Cada trabajo incluye:
```json
{
"company": "Anthropic",
"company_icon": "https://anthropic.com/favicon.ico",
"location": "Remote",
"description": "Senior AI Developer to enhance Claude Code capabilities...",
"job_link": "https://anthropic.com/careers/claude-developer",
"source": "RapidAPI Jobs",
"date_posted": "2025-09-10T10:00:00Z",
"salary": 150000
}
```
## 🔧 Filtros Aplicados
El script usa filtrado **ultra-estricto**:
- **Debe mencionar "Claude"** explícitamente
- Términos específicos: `claude code`, `anthropic claude`, `claude ai`, etc.
- Validación de contexto laboral: `hiring`, `position`, `engineer`, etc.
## 📈 Resultados Esperados
Dado que Claude Code es muy nuevo (2025), los resultados serán limitados pero precisos:
- **Con APIs**: 5-20 trabajos relevantes potenciales
- **Solo Scraping**: 0-5 trabajos (debido a restricciones)
- **Calidad**: 100% relevantes (menciones específicas de Claude)
## 🔄 Automatización
Para ejecutar periódicamente:
```bash
# Cron job diario a las 9 AM
0 9 * * * cd /path/to/project && python generate_claude_jobs.py
# GitHub Actions (recomendado)
# Ver ejemplo en .github/workflows/
```
## ⚠️ Limitaciones
1. **Claude Code es nuevo**: Pocas ofertas laborales específicas aún
2. **APIs pagadas**: Mejores resultados requieren suscripciones
3. **Rate limits**: Respetar límites de APIs para evitar bloqueos
4. **Falsos positivos**: Filtrado estricto puede omitir trabajos relevantes
## 🆘 Troubleshooting
### Sin resultados:
- ✅ Verifica API keys en `.env`
- ✅ Revisa límites de rate en las APIs
- ✅ Claude Code es muy específico - resultados limitados son normales
### Errores de API:
- ✅ Verifica saldo en RapidAPI/SerpAPI
- ✅ Revisa formato de API keys
- ✅ Usa VPN si hay restricciones geográficas
## 🔮 Futuro
A medida que Claude Code se popularice (2025-2026):
- Más trabajos específicos aparecerán
- Términos de búsqueda se pueden expandir
- APIs especializadas en AI jobs pueden surgir
---
**Resultado**: JSON estructurado en `docs/claude-jobs.json` listo para consumo por la web.
+60
View File
@@ -0,0 +1,60 @@
# 🚀 Deployment Guide
This project is configured for automatic deployment to Vercel from the `main` branch.
## GitHub Actions Setup
### Required Secrets
Add these secrets to your GitHub repository settings:
1. **VERCEL_TOKEN**: Your Vercel account token
- Go to [Vercel Account Settings](https://vercel.com/account/tokens)
- Create a new token with appropriate permissions
- Add as `VERCEL_TOKEN` in GitHub Secrets
2. **VERCEL_ORG_ID**: Your Vercel organization ID
- Run `vercel link` in your project
- Copy the `orgId` from `.vercel/project.json`
- Add as `VERCEL_ORG_ID` in GitHub Secrets
3. **VERCEL_PROJECT_ID**: Your Vercel project ID
- Run `vercel link` in your project
- Copy the `projectId` from `.vercel/project.json`
- Add as `VERCEL_PROJECT_ID` in GitHub Secrets
### Getting the IDs
Run these commands in your project root:
```bash
# Link to Vercel project
vercel link
# Get your IDs from the generated file
cat .vercel/project.json
```
## Deployment Flow
-**Push to main** → Automatic production deploy to aitmpl.com
-**Other branches** → Manual deploy only (no auto-deploy)
-**Pull Requests** → No deployment
## Manual Deployment
For testing other branches:
```bash
# Deploy current branch to preview URL
vercel
# Deploy current branch to production
vercel --prod
```
## Domain Configuration
The main branch deploys to the custom domain: **aitmpl.com**
Configured in Vercel dashboard under Project Settings → Domains.
+313
View File
@@ -0,0 +1,313 @@
# Discord Bot Setup - Vercel Serverless
Discord bot para claude-code-templates integrado con Vercel Functions usando webhooks. Este enfoque es más eficiente que mantener un bot tradicional con conexión persistente.
## 🚀 Ventajas de la Arquitectura Serverless
-**Sin servidor permanente**: Solo se ejecuta cuando hay interacciones
-**Escalabilidad automática**: Vercel maneja el scaling
-**Integrado con tu infraestructura**: Mismo proyecto, mismo deployment
-**Costo reducido**: Solo pagas por ejecuciones reales
-**Cache inteligente**: Reutiliza datos entre invocaciones
## 📋 Comandos Disponibles
### Comandos Básicos (Fase 1)
1. **`/search <query> [type]`** - Buscar componentes
2. **`/info <name> [type]`** - Información detallada
3. **`/install <name> [type]`** - Comando de instalación
4. **`/popular <type> [limit]`** - Componentes más populares
5. **`/random <type>`** - Descubre componentes aleatorios
## 🛠️ Setup Paso a Paso
### 1. Crear Discord Application
1. Ve a [Discord Developer Portal](https://discord.com/developers/applications)
2. Click "New Application" y dale un nombre
3. En la sección "General Information":
- Copia el **Application ID** → Esto es tu `DISCORD_APP_ID`
4. Ve a la sección "Bot":
- Click "Add Bot"
- Copia el **Bot Token** → Esto es tu `DISCORD_BOT_TOKEN`
- Habilita "Message Content Intent" si lo necesitas
5. En "General Information" nuevamente:
- Copia el **Public Key** → Esto es tu `DISCORD_PUBLIC_KEY`
### 2. Configurar Variables de Entorno
#### En Local (para testing)
Crea/actualiza tu archivo `.env`:
```bash
# Discord Bot Configuration
DISCORD_APP_ID=123456789012345678
DISCORD_BOT_TOKEN=MTIzNDU2Nzg5MDEyMzQ1Njc4.AbCdEf.GhIjKlMnOpQrStUvWxYz
DISCORD_PUBLIC_KEY=abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
DISCORD_GUILD_ID=987654321098765432 # Opcional, para testing en un server específico
# API Configuration
COMPONENTS_API_URL=https://aitmpl.com/components.json
```
#### En Vercel (para producción)
1. Ve a tu proyecto en Vercel Dashboard
2. Settings → Environment Variables
3. Agrega estas variables:
- `DISCORD_APP_ID`
- `DISCORD_BOT_TOKEN`
- `DISCORD_PUBLIC_KEY`
- `COMPONENTS_API_URL` (opcional, por defecto usa aitmpl.com)
### 3. Instalar Dependencias
```bash
npm install
```
Esto instalará:
- `discord-interactions` - Para verificar requests de Discord
- `axios` - Para cargar components.json
- `dotenv` - Para variables de entorno
### 4. Registrar Comandos con Discord
```bash
npm run discord:register
```
Output esperado:
```
📦 Registering Discord slash commands...
Registering to guild: 987654321098765432
✅ Successfully registered 5 commands!
📝 Registered commands:
1. /search - Search for components by keyword
2. /info - Get detailed information about a specific component
3. /install - Get the installation command for a component
4. /popular - View the most popular components by download count
5. /random - Discover a random component
```
### 5. Deploy a Vercel
```bash
vercel --prod
```
O usa el deployment automático de GitHub si lo tienes configurado.
Después del deploy, copia tu URL de producción:
```
https://your-project.vercel.app
```
### 6. Configurar Interactions Endpoint en Discord
1. Ve a Discord Developer Portal → Tu aplicación
2. Ve a "General Information"
3. En **Interactions Endpoint URL**, pega:
```
https://your-project.vercel.app/api/discord/interactions
```
4. Click "Save Changes"
Discord intentará verificar la URL enviando un PING. Si todo está bien configurado, verás un ✅.
### 7. Invitar el Bot a tu Servidor
1. En Discord Developer Portal → OAuth2 → URL Generator
2. Selecciona scopes:
- ✅ `bot`
- ✅ `applications.commands`
3. Selecciona permisos del bot:
- ✅ Send Messages
- ✅ Embed Links
- ✅ Read Message History
4. Copia la URL generada y ábrela en tu navegador
5. Selecciona tu servidor y autoriza
## 🧪 Testing Local
Para testear localmente antes de hacer deploy:
```bash
# 1. Instala Vercel CLI si no lo tienes
npm i -g vercel
# 2. Inicia el servidor de desarrollo
vercel dev
```
Esto correrá en `http://localhost:3000`
Para que Discord pueda enviar webhooks a tu localhost, necesitas un túnel:
```bash
# Opción 1: ngrok
ngrok http 3000
# Opción 2: Vercel dev con --listen
vercel dev --listen 3000
```
Usa la URL pública del túnel en Discord Interactions Endpoint.
## 📁 Estructura del Proyecto
```
api/
└── discord/
├── interactions.js # Endpoint principal de webhooks
├── register-commands.js # Script para registrar comandos
├── handlers/ # Handlers de cada comando
│ ├── search.js
│ ├── info.js
│ ├── install.js
│ ├── popular.js
│ └── random.js
└── utils/ # Utilidades compartidas
├── componentsLoader.js # Cache de components.json
└── embedBuilder.js # Generador de embeds
```
## 🔍 Cómo Funciona
### Flujo de una Interacción
1. Usuario ejecuta `/search security` en Discord
2. Discord envía POST a `https://your-domain.vercel.app/api/discord/interactions`
3. Vercel ejecuta `api/discord/interactions.js`
4. El handler verifica la firma (seguridad)
5. Identifica el comando y llama al handler correspondiente
6. Handler carga components.json (desde cache si existe)
7. Ejecuta la búsqueda y genera un embed
8. Retorna respuesta a Discord
9. Discord muestra el resultado al usuario
### Cache de Componentes
El sistema mantiene `components.json` en memoria por 5 minutos:
- Primera request: Descarga desde aitmpl.com
- Siguientes requests (< 5 min): Usa cache
- Después de 5 min: Actualiza automáticamente
Esto reduce latencia y requests a la API.
## 🐛 Troubleshooting
### Error: "Invalid request signature"
**Causa**: La PUBLIC_KEY no está configurada o es incorrecta
**Solución**:
1. Verifica que `DISCORD_PUBLIC_KEY` esté en las variables de entorno de Vercel
2. Asegúrate de copiar la Public Key correcta del Developer Portal
3. Redeploy después de cambiar variables de entorno
### Error: Discord no puede verificar la URL
**Causa**: El endpoint no responde correctamente al PING
**Solución**:
1. Verifica que el deployment fue exitoso
2. Prueba manualmente: `curl https://your-domain.vercel.app/api/discord/interactions`
3. Revisa los logs en Vercel Dashboard → Functions
### Comandos no aparecen en Discord
**Causa**: No se registraron o falta scope
**Solución**:
1. Ejecuta `npm run discord:register` nuevamente
2. Si usaste `DISCORD_GUILD_ID`, los comandos solo aparecen en ese server
3. Quita el bot del server y vuelve a invitarlo con el scope `applications.commands`
4. Espera unos minutos (comandos globales pueden tardar hasta 1 hora)
### Bot no responde
**Causa**: Error en el handler o falta de permisos
**Solución**:
1. Revisa logs en Vercel Dashboard → Functions
2. Verifica que el bot tenga permisos de "Send Messages" y "Embed Links"
3. Prueba con un comando simple como `/random`
### "Components data not loaded"
**Causa**: No puede acceder a components.json
**Solución**:
1. Verifica que `https://aitmpl.com/components.json` sea accesible
2. Revisa la variable `COMPONENTS_API_URL` si usas una URL custom
3. Chequea los logs de Vercel para ver el error específico
## 📊 Monitoreo
### Vercel Dashboard
Ve a tu proyecto en Vercel → Functions para ver:
- Invocaciones totales
- Errores
- Tiempo de respuesta
- Logs en tiempo real
### Discord Logs
Cada comando registra en consola:
```
🔹 Command received: /search
✅ Components data loaded
```
Revisa estos logs en Vercel Functions.
## 🚀 Próximos Pasos
### Fase 2: Comandos Interactivos
- `/stats` - Estadísticas de la plataforma
- `/new` - Componentes recientes
- `/daily` - Componente del día
### Fase 3: Botones y Menús
- Agregar botones de acción a los embeds
- Select menus para filtros avanzados
- Modal forms para búsqueda compleja
### Fase 4: Integración Avanzada
- Tracking de instalaciones vía Discord
- Notificaciones automáticas de releases
- Sistema de votación y reviews
## 💡 Tips y Mejores Prácticas
1. **Testing**: Usa `DISCORD_GUILD_ID` para testing rápido en tu server
2. **Production**: Quita `DISCORD_GUILD_ID` para comandos globales
3. **Cache**: Ajusta `CACHE_DURATION` en `componentsLoader.js` según tus necesidades
4. **Errores**: Todos los errores retornan embeds ephemeral (solo visibles para el usuario)
5. **Logs**: Los logs en Vercel te ayudan a debuggear problemas en producción
## 📚 Recursos
- [Discord Developer Portal](https://discord.com/developers/applications)
- [Discord Interactions Documentation](https://discord.com/developers/docs/interactions/receiving-and-responding)
- [Vercel Functions Documentation](https://vercel.com/docs/functions)
- [discord-interactions npm](https://www.npmjs.com/package/discord-interactions)
## 🤝 Soporte
Si tienes problemas:
1. Revisa los logs en Vercel Dashboard
2. Verifica todas las variables de entorno
3. Prueba los endpoints manualmente con curl
4. Abre un issue en GitHub con los logs relevantes
---
**¡Listo!** Tu bot de Discord está corriendo en Vercel Functions 🎉
+193
View File
@@ -0,0 +1,193 @@
# Growth Kit - Content Marketing Automation Commands
## Overview
This PR adds **Growth Kit** - a comprehensive content marketing automation toolkit that helps developers distribute blog content across social media platforms with a single command.
Built by [Kanaeru Labs](https://www.kanaeru.ai) while building Kanaeru AI, these commands solve the time-consuming problem of manually converting blog posts into platform-specific content.
## What's Included
### Marketing Commands (5 new commands)
**New Category:** `commands/marketing/`
1. **`publisher-x.md`** - X/Twitter Thread Generator
- Generates copy-pastable X threads from any content source
- **3 format options**: Thread (5-8 posts), Single Long, Single Short
- Supports multi-language (EN/JA)
- Creates interactive HTML preview with copy buttons
- Auto-opens X.com for posting
2. **`publisher-linkedin.md`** - LinkedIn Post Generator
- Creates professional LinkedIn posts via API
- Automatic media attachment (images/PDFs)
- Handles OAuth flow automatically
- Works with zero dependencies (bash + curl only)
3. **`publisher-medium.md`** - Medium Article Converter
- Converts blog posts to Medium-ready HTML
- Image upload markers with file paths
- One-click copy from HTML preview
- Opens Medium editor automatically
4. **`publisher-devto.md`** - Dev.to RSS Generator
- Generates complete RSS feed from all blog posts
- One-time setup for automatic syndication
- All future posts auto-import to Dev.to
5. **`publisher-all.md`** - All-Platform Generator
- Runs all 4 publishers in one command
- Saves ~2 hours of manual work per post
- Opens all previews in browser tabs
### Setup Commands (1 new command)
**Existing Category:** `commands/setup/`
6. **`vercel-analytics.md`** - Vercel Analytics Setup
- Auto-installs @vercel/analytics and @vercel/speed-insights
- Configures React/Vite apps
- Creates vercel.json for SPA routing
- Fixes 404 errors on Vercel deployment
## Key Features
**Universal Input Support**
- Blog post slugs (e.g., `2025-10-06-my-post`)
- File paths (markdown, PDF, HTML, text)
- URLs (fetches and converts)
**Zero Dependencies**
- Works in ANY repo type (Python, Rust, Go, JavaScript, etc.)
- Uses only Claude's built-in tools (Read, Write, Bash, Glob, WebFetch)
- No Node.js/npm required (except for Vercel Analytics)
**Multi-Language Support**
- English and Japanese (EN/JA)
- Auto-detects language from content/path
- Platform-specific tone and formatting
**Production-Ready**
- Tested at Kanaeru Labs in production
- Handles LinkedIn API authentication
- Proper character counting for X/Twitter
- HTML preview files with copy buttons
## Use Cases
**For Blog Authors:**
```bash
# Distribute a blog post across all platforms
/publisher-all my-latest-post
# Generate just an X thread
/publisher-x my-latest-post
# Create LinkedIn post with custom image
/publisher-linkedin my-latest-post en diagram.png
```
**For Content Marketers:**
```bash
# Convert any URL to X thread
/publisher-x https://competitor.com/article
# Generate Medium article from PDF
/publisher-medium whitepaper.pdf
# Set up Dev.to auto-syndication
/publisher-devto
```
**For Developers:**
```bash
# Add analytics to React app
/vercel-analytics
```
## Testing
All commands have been:
- ✅ Tested in production at Kanaeru Labs
- ✅ Validated across multiple blog structures
- ✅ Verified to work in Python, Rust, Go, and JavaScript repos
- ✅ Tested with both English and Japanese content
## Benefits to the Community
**Time Savings:**
- X thread generation: ~30 minutes → 2 minutes
- All platforms: ~2 hours → 5 minutes
- One-time Dev.to setup enables automatic future syndication
**Developer-Friendly:**
- No configuration required (auto-detects blog structure)
- Works universally (any repo type, any framework)
- Clear error messages and helpful prompts
**Production Quality:**
- Proper API authentication handling
- Character limit validation
- Multi-language support
- HTML previews for easy copying
## Integration Notes
**File Locations:**
- Marketing commands: `cli-tool/components/commands/marketing/`
- Analytics command: `cli-tool/components/commands/setup/`
**Frontmatter Format:**
All commands include proper frontmatter:
```yaml
---
allowed-tools: Read, Write, Bash, Glob, WebFetch
argument-hint: <input> [lang]
description: [Clear description]
---
```
**Auto-Discovery:**
Commands will be automatically discovered by the `scripts/generate_components_json.py` script when scanning the commands directory.
## Screenshots
Available at: https://github.com/kanaerulabs/growth-kit
See the Growth Kit README for visual examples of:
- X thread preview with 3 format tabs
- LinkedIn post with PDF attachment
- Medium article preview
- Dev.to RSS feed structure
## Attribution
**Author:** Kanaeru Labs (https://www.kanaeru.ai)
**Source Repository:** https://github.com/kanaerulabs/growth-kit
**License:** MIT
**Contact:** support@kanaeru.ai
## Related Resources
- Growth Kit Documentation: https://github.com/kanaerulabs/growth-kit
- Example Blog Posts: See Growth Kit repo for real examples
- LinkedIn API Setup: https://www.linkedin.com/developers/apps
---
## Why This Matters
Content distribution is a major bottleneck for developer bloggers and technical content creators. These commands solve real pain points we experienced while building Kanaeru AI:
- **Manual X thread creation** - repetitive and time-consuming
- **Platform-specific formatting** - each platform has different requirements
- **Character counting** - easy to exceed limits
- **Media attachment** - LinkedIn API complexity
- **Syndication setup** - Dev.to RSS configuration
Growth Kit automates all of this with Claude Code's built-in capabilities.
---
**We believe these commands will be valuable to the Claude Code community and help developers share their technical content more effectively.**