/agentic-portfolio — Créez un portfolio agentique et gratuit propulsé par LLM pour tout utilisateur GitHub
Cette compétence génère l'application agentic-portfolio (Next.js 15 App Router + CopilotKit + la chaîne de survie /free-llm). L'implémentation de référence est github.com/wjlgatech/agentic-portfolio — clonez-la comme modèle, puis remplissez les données content/ pour l'utilisateur cible. Tout ce qui est personnel est une donnée ; le code de l'application est réutilisable tel quel.
0. Entrées et prérequis
- Identifiant GitHub (par ex.
wjlgatech). Pour les dépôts privés + points forts, exécutezgh auth status— l'utilisateur doit être authentifié avec le scoperepo. Le mode public uniquement fonctionne sans authentification. node >= 18,npm,gh,python3.
1. Récupérer les dépôts actifs (12 derniers mois)
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
# Pour les dépôts PUBLICS d'un autre utilisateur : gh api "users/<login>/repos?per_page=100&sort=pushed" ...
Exclure les forks (fork: true) et les dépôts meta (dotfiles, un portfolio existant).
2. Organiser dans content/projects.json
Pour chaque dépôt conservé, émettre {name, category, highlight, featured, private, language, stars, pushed, url} :
- Category — regrouper dans un petit ensemble (par ex. Agentic OS · Frameworks & Tooling · AI Products · Faith/Family · Open Knowledge) ; choisir des noms adaptés au travail réel de l'utilisateur.
- highlight — une ligne sans risque de divulgation. Pour les dépôts privés : uniquement un résumé de haut niveau, et définir
url: null(ne jamais lier ou exposer des informations internes). - featured — marquer les ~15–18 plus forts pour la vue par défaut.
3. Remplir content/profile.ts et content/portfolio.yaml
profile.ts: nom, tagline, mission, valeurs, love, et les 12X Future Practices (une douzaine de disciplines composées). Rédiger à partir de la bio de l'utilisateur + thèmes des dépôts ; indiquer clairement que c'est à lui de modifier.portfolio.yaml: la surface de contrôle — ordre/visibilité/étiquettes des sections, thème, et la liste articles (commencer vide). Le propriétaire remplit les articles en parlant à l'agent (« ajoute mon article LinkedIn … ») ou manuellement. LinkedIn est protégé par authentification — demander à l'utilisateur de coller ses posts, ou accepter des URLs d'articles publics et récupérer chaque page via WebFetch.- Définir
PORTFOLIO_OWNER_TOKENsur le déploiement pour que seul le propriétaire puisse appliquer les modifications de l'agent (les visiteurs restent en lecture seule). Non défini = développement local sans restriction.
4. Code de l'application — copier depuis le modèle, ne pas réécrire
Les parties réutilisables (identiques pour chaque utilisateur) :
app/page.tsx,app/layout.tsx,app/globals.cssapp/api/copilotkit/route.ts+lib/llm.ts(la chaîne free-LLM — clé uniquement côté serveur)components/Copilot.tsx,components/Projects.tsx,components/Articles.tsx- Configs :
package.json(épingler Next à une version 15.x patchée),tailwind.config.ts,tsconfig.json,postcss.config.mjs,.env.example
5. Vérifier, puis déployer
npm install && npm run build # doit être VERT avant de pousser
gh repo create <login>/<repo-name> --public --source=. --remote=origin --push
Puis déployer sur Vercel (importer le dépôt → ajouter une clé gratuite, par ex. NVIDIA_API_KEY → déployer).
Garde-fous
- Ne jamais divulguer d'informations privées. Dépôts privés : résumé uniquement,
url: null. - La clé reste côté serveur. Seul
app/api/copilotkit/route.tslit la clé LLM. - Tiers gratuits d'abord. Respecter l'ordre de
lib/llm.ts: NIM → Groq → Gemini → payant. - La construction doit être verte avant toute poussée. Signaler honnêtement l'état de la construction.
- La poussée du dépôt doit être validée par un humain sauf si l'utilisateur a dit « crée et pousse ».