/agentic-portfolio — construye un portafolio agéntico y gratuito con LLM para cualquier usuario de GitHub
Esta habilidad andamia la aplicación agentic-portfolio (Next.js 15 App Router + CopilotKit + la cadena de supervivencia /free-llm). La implementación de referencia es github.com/wjlgatech/agentic-portfolio — clónala como plantilla, luego repuebla los datos en content/ para el usuario objetivo. Todo lo personal son datos; el código de la aplicación se reutiliza tal cual.
0. Entradas y requisitos previos
- Usuario de GitHub (ej.
wjlgatech). Para repos privados + destacados, ejecutagh auth status— el usuario debe estar autenticado con el alcancerepo. Solo repos públicos funciona sin autenticación. node >= 18,npm,gh,python3.
1. Obtener los repos activos (últimos 12 meses)
SINCE=$(python3 -c "import datetime as d;print((d.date.today()-d.timedelta(days=365)).isoformat())")
gh api -X GET 'user/repos?per_page=100&sort=pushed&affiliation=owner' --paginate \
--jq ".[] | select(.pushed_at >= \"$SINCE\") | {name,private,fork,lang:.language,desc:.description,pushed:.pushed_at[0:10],stars:.stargazers_count,url:.html_url}" \
> repos.ndjson
# Para repos PÚBLICOS de otro usuario: gh api "users/<login>/repos?per_page=100&sort=pushed" ...
Excluir forks (fork: true) y repos meta (dotfiles, un portfolio existente).
2. Organizar en content/projects.json
Para cada repositorio mantenido, genera {name, category, highlight, featured, private, language, stars, pushed, url}:
- Category — agrupa en un conjunto pequeño (ej. Agentic OS · Frameworks & Tooling · AI Products · Faith/Family · Open Knowledge); elige nombres que se ajusten al trabajo real del usuario.
- highlight — una línea segura para IP. Para repos privados: solo a alto nivel, y establece
url: null(nunca enlazar ni exponer internos). - featured — marca los ~15–18 más fuertes para la vista predeterminada.
3. Llenar content/profile.ts y content/portfolio.yaml
profile.ts: nombre, eslogan, misión, valores, amor y las Prácticas Futuras 12X (una docena de disciplinas que se acumulan). Redacta a partir de la biografía del usuario + temas del repositorio; deja claro que es editable por el usuario.portfolio.yaml: la superficie de control — orden/visibilidad/etiquetas de secciones, tema y la lista de artículos (inicia vacía). El propietario llena los artículos hablando con el agente ("agrega mi artículo de LinkedIn …") o manualmente. LinkedIn está protegido por autenticación — pide al usuario que pegue sus publicaciones, o acepta URLs de artículos públicos y WebFetch de cada uno.- Establece
PORTFOLIO_OWNER_TOKENen el despliegue para que solo el propietario pueda aplicar ediciones del agente (los visitantes solo ven). Sin establecer = desarrollo local sin restricciones.
4. Código de la aplicación — copia desde la plantilla, no reescribas
Las partes reutilizables (idénticas para cada usuario):
app/page.tsx,app/layout.tsx,app/globals.cssapp/api/copilotkit/route.ts+lib/llm.ts(la cadena gratuita de LLM — solo del lado del servidor)components/Copilot.tsx,components/Projects.tsx,components/Articles.tsx- configuraciones:
package.json(fija Next a una versión 15.x parcheada),tailwind.config.ts,tsconfig.json,postcss.config.mjs,.env.example
5. Verificar, luego desplegar
npm install && npm run build # debe ser VERDE antes de hacer push
gh repo create <login>/<repo-name> --public --source=. --remote=origin --push
Luego despliega en Vercel (importa el repositorio → agrega una clave gratuita, ej. NVIDIA_API_KEY → despliega).
Barreras de seguridad
- Nunca filtrar IP privada. Repos privados: solo destacado,
url: null. - La clave permanece en el servidor. Solo
app/api/copilotkit/route.tslee la clave del LLM. - Primero los niveles gratuitos. Mantén el orden de
lib/llm.ts: NIM → Groq → Gemini → pago. - La compilación debe ser verde antes de cualquier push. Reporta el estado de la compilación honestamente.
- El push del repositorio debe tener puerta humana a menos que el usuario haya dicho "crear y hacer push".