tooyoung:gh-star-list
GitHub Star List
Organize GitHub starred repos into GitHub Lists automatically.
Prerequisites
Verify environment before starting. Run these checks and guide user through any failures:
# 1. Check gh CLI installed
gh --version || echo "MISSING"
# 2. Check gh authenticated with 'user' scope
gh auth status # must show 'user' in scopes
# 3. Check jq installed
jq --version || echo "MISSING"
Troubleshooting:
| Problem | Solution |
|---|---|
gh not installed |
macOS: brew install gh. Others: https://cli.github.com |
gh not logged in |
gh auth login -h github.com -p https -w (opens browser) |
user scope missing |
gh auth refresh -s user -h github.com |
jq not installed |
macOS: brew install jq. Others: https://jqlang.github.io/jq/download |
All checks must pass before proceeding. The user scope is required for GitHub Lists API access.
Scripts
All scripts are in scripts/ relative to this skill's directory.
| Script | Purpose |
|---|---|
fetch_stars.sh |
Fetch starred repos (paginated). Outputs one JSON object per line. |
manage_lists.sh |
CRUD for GitHub Lists: get, create, delete, add |
Modes
Mode 1: Full Batch (default)
Categorize all starred repos at once. Trigger: "整理所有 stars", "organize all my stars".
Mode 2: Selective
Categorize specific repos or the latest N stars. Trigger: "整理最近 10 个 star", "把 xxx/yyy 加到合适的 list".
When no specific repos are mentioned and user says "整理一下" without "所有/全部/all", default to latest 10 stars.
Workflow
Step 1: Fetch Data
Full batch mode:
bash scripts/fetch_stars.sh > /tmp/stars.jsonl
bash scripts/manage_lists.sh get > /tmp/lists.json
Selective mode (latest N):
bash scripts/fetch_stars.sh --limit N > /tmp/stars.jsonl
bash scripts/manage_lists.sh get > /tmp/lists.json
For specific repos, use gh api to fetch individual repo info:
gh api repos/{owner}/{repo} --jq '{id: .node_id, full_name: .full_name, description: (.description // ""), topics: (.topics // []), language: (.language // ""), url: .html_url}'
Tell user how many stars to process and how many existing lists found.
Step 2: Analyze and Propose Categories
Read /tmp/stars.jsonl and /tmp/lists.json.
Analyze all repos and existing lists. Propose a categorization plan.
Classification Principles (IMPORTANT)
- Classify by PURPOSE, not language (unless the user explicitly requests language-based grouping): A Rust-written JS bundler belongs in "Build & DX", not "Rust". A Swift-written clipboard tool belongs in "CLI & Tools", not "iOS". Language is metadata, not category.
- Description > Topics > Name > Language: Prioritize description to understand what the repo DOES. Language is the weakest signal and should only be used as a tiebreaker.
- Ask "what does this repo help the user DO?": A framework for building mobile apps → Mobile. A linter for Python → Build & DX. A deepfake tool → AI or Misc.
- Avoid over-broad categories: If a list exceeds 40 items, consider splitting by sub-purpose.
- Framework vs Library vs Tool: Web frameworks (Express, Hono, Koa) → Backend. UI component libraries (Ant Design, shadcn) → UI & Design. Build tools (Vite, Rspack) → Build & DX.
Recommended Categories
Use these as a starting template for full batch mode. Adjust based on user's actual star composition — skip empty categories, merge small ones, split large ones (>40 repos).
| Category | Description | Typical repos |
|---|---|---|
| AI | LLMs, ML frameworks, AI apps, agents | langchain, ollama, stable-diffusion |
| React | React ecosystem: frameworks, hooks, state management | next.js, react, zustand |
| React Native | React Native core, navigation, UI libs | react-navigation, expo |
| Vue | Vue ecosystem: frameworks, plugins, tools | nuxt, vueuse, element-plus |
| Flutter | Flutter/Dart packages and apps | flutter, riverpod |
| Mobile Native | iOS/Android native development | Kotlin/Swift libs, Jetpack |
| Mini programs, WeChat SDK, WePY | wepy, vant-weapp | |
| Backend | Server frameworks, databases, APIs | express, fastapi, prisma |
| Build & DX | Bundlers, linters, dev tools, monorepo | vite, eslint, turborepo |
| CLI & Tools | Desktop apps, CLI utilities, productivity | homebrew, raycast, warp |
| UI & Design | Component libraries, CSS, animation | tailwindcss, shadcn, framer-motion |
| Network & Proxy | HTTP clients, proxies, VPN, network tools | clash, axios, nginx |
| DevOps & Docker | CI/CD, containers, infra, monitoring | docker, k8s, terraform |
| Low-Code & Admin | Admin panels, low-code platforms, CMS | strapi, appsmith, refine |
| Awesome & Learning | Curated lists, tutorials, books, courses | awesome-xxx, free-programming-books |
| Misc | Repos that don't fit elsewhere |
Category Guidelines
- Respect existing lists: Keep lists that already have items. Prefer assigning to existing lists when they match.
- Generate new categories: Only for repos that don't fit any existing list.
- Total lists cap: Stay within GitHub's 32-list limit.
- Full batch: Target 15-25 total lists.
- Selective: Prefer assigning to existing lists; only propose new lists if truly needed.
Present the plan as a table. Wait for user confirmation or adjustments.
Step 3: Execute
After user confirms:
- Create new lists:
bash scripts/manage_lists.sh create "<name>" "<description>" - Collect all list IDs (existing + new)
- Add repos to lists:
bash scripts/manage_lists.sh add <repo_node_id> <list_id>
Critical: The add command calls updateUserListsForItem which replaces all list memberships for a repo. The listIds param is the complete set of lists the repo should belong to. To preserve existing membership, include ALL list IDs (old + new) in a single call.
Full batch: process in batches, report progress every 50 repos. Selective: process all at once.
Step 4: Summary
Run bash scripts/manage_lists.sh get and present a summary table showing list name, repo count, and whether each list is new or existing.
More from shiqkuangsan/oh-my-daily-skills
tooyoung:excalidraw-artist
Create Excalidraw hand-drawn style diagrams, including architecture, flowchart, swimlane/timeline, sequence, basic wireframe, ERD/data model, state machine, matrix/comparison table, tree/hierarchy, and CI/CD pipeline. Trigger words: draw diagram, architecture diagram, flowchart, swimlane, timeline, roadmap, Gantt, sequence diagram, excalidraw, ERD, data model, state machine, comparison table, matrix, tree, hierarchy, CI/CD pipeline
24tooyoung:chainlit-builder
Quickly build Chainlit AI chat demos and POCs using OpenAI-compatible chat completion patterns, including streaming, multi-turn memory, file upload, tool-call step visualization, and demo styling. Trigger words: chainlit, build demo, chat demo, conversation demo, Chainlit 演示, AI 聊天 demo, 对话式 POC
24tooyoung:threejs-builder
Create simple Three.js web apps with scene setup, lighting, geometries, materials, animations, OrbitControls, particles, and responsive rendering. Use for Three.js scenes, WebGL demos, 3D showcases, and interactive 3D web content. Trigger: threejs, Three.js, 3D scene, WebGL, 三维展示, 3D showcase, interactive 3D
23tooyoung:openclash-merger
将 vless+reality 等新协议配置转换为带 GEOSITE 规则的配置文件,支持 11 地区分组 + AI/媒体/游戏分流,可直接上传 OpenClash 使用。触发词:合并 OpenClash、转换订阅、Clash 配置
23tooyoung:nano-banana-builder
Build Next.js App Router image-generation apps using Gemini Nano Banana / Nano Banana Pro with AI SDK. Covers exact model names, Server Actions/API routes, conversational multi-turn image editing, storage, rate limiting, safety, and cost controls. Trigger: nano banana, Gemini image, AI 生图, 图片生成, text-to-image, image generation app, iterative image editor, multi-turn image editing
23tooyoung:easy-openrouter
Test individual LLM models through OpenRouter and compare observed latency, cost, token usage, and outputs. Includes model ID format, :nitro/:online modifiers, rankings/provider lookup, and simple manual comparison workflows. Trigger words: OpenRouter, test model, model ID, compare models, provider latency, throughput, cheapest provider, fastest provider, :nitro, :online
22