Search the awesome-ChatGPT-repositories database for the user's query.
Instructions
Ground rules — they apply whether this skill was invoked explicitly or picked automatically:
- Present only repositories from the bundled data files, even when the list has just a few matches — then say so and suggest other keywords rather than filling the gap from elsewhere.
- Don't search the web or open repository pages to add or verify details (setup, license, activity) unless the user explicitly asks for that: the curated list is the source of truth here, and its star counts and descriptions are snapshots. Copy names, URLs, and star counts exactly as they appear in the records.
- The output templates in Steps 5b–7 are fixed: keep their Markdown headings (
##, ###), field labels, and order, and don't restyle them (for example, turning the result list into a table or a prose summary).
- If the data files can't be read (for example, shell commands are blocked), say so and link https://github.com/taishi-i/awesome-ChatGPT-repositories instead of substituting other sources.
Step 1 — Interpret the query
The query is the text the user passed to this skill (the same skill runs in Claude Code and Codex):
- Claude Code: the arguments of
/awesome-chatgpt-search:search, appended at the end as ARGUMENTS: ….
- Codex: the user's message that invoked
$awesome-chatgpt-search:search, minus the $… mention itself.
If there is no explicit query text, use the user's latest request.
Supported query modifiers:
category:<name> — filter to one category
language:<lang> — filter by programming language
list categories or categories — skip to Step 5b
- Plain text — keyword search across all categories
The descriptions are in English, so convert non-English queries to English keywords before searching.
Examples:
| User query |
English keywords to search |
| RAGを使ったチャットボット |
RAG, retrieval, chatbot, vector |
| 코드 생성 도구 (Korean) |
code generation, copilot, autocomplete |
| 中文问答系统 |
chinese, QA, question answering |
| outil de résumé (French) |
summarization, summary, text |
| LLMを使ったエージェント |
agent, autonomous, LLM, tool use |
Keyword tips:
- Use stems, not full words. Substring match catches variants:
embed → embedding/embeddings, retriev → retrieval/retrieve, classif → classification/classifier, generat → generation/generative, fine-tun → fine-tune/fine-tuning, summari → summarize/summarization, orchestrat → orchestrate/orchestration.
- Add domain-specific names. For common LLM/AI domains, include well-known tool or framework names present in the database:
| Domain (query hint) |
Stem keywords |
Tool/library names to add |
| RAG / 検索拡張生成 |
retriev, rag, embed, vector |
langchain, llamaindex, haystack, faiss, chroma, pinecone |
| Agent / エージェント |
agent, autonom, orchestrat |
autogpt, langchain, langgraph, crewai |
| Fine-tuning / ファインチューニング |
fine-tun, lora, peft, finetun |
lora, peft, qlora |
| Code generation / コード生成 |
code, coding, copilot, autocomplet |
copilot, codex, interpreter |
| Chatbot / チャットボット |
chat, bot, dialog, convers |
discord, telegram, slack |
| Prompt engineering |
prompt, few-shot, chain-of-thought, jailbreak |
promptflow, dspy |
| Evaluation / 評価 |
evaluat, benchmark, metric |
evals, lm-eval, deepeval |
| Image / 画像生成 |
image, vision, multimodal |
dall-e, stable-diffusion, midjourney |
| Voice / 音声 |
voice, speech, audio, tts, asr |
whisper, eleven |
- Aim for 3–6 keywords. Too few miss items; too many inflate low-quality partial matches.
Step 2 — Search the data files with grep
Data is split into per-category files. Each file is a JSON array with one repo record per line, so you can grep for matches instead of reading whole files — this keeps token use low (a typical query pulls in a few dozen matching lines instead of hundreds of KB). Fields per record:
u: GitHub URL · n: repository name · d: English description
c: category · l: language (optional) · t: topics comma-separated (optional)
sc: quality score 0–8 · st: star count (optional) · ns: normalized star score 0–10 (optional)
File list (all under data/ relative to this plugin; six categories over ~200 entries are split a/b):
| Category |
File(s) |
| Awesome-lists |
repos-awesome-lists.json |
| Prompts |
repos-prompts.json |
| Chatbots |
repos-chatbots-a.json, repos-chatbots-b.json |
| Browser-extensions |
repos-browser-extensions-a.json, repos-browser-extensions-b.json |
| CLIs |
repos-clis-a.json, repos-clis-b.json |
| Reimplementations |
repos-reimplementations.json |
| Tutorials |
repos-tutorials.json |
| NLP |
repos-nlp-a.json, repos-nlp-b.json |
| Langchain |
repos-langchain.json |
| Unity |
repos-unity.json |
| Openai |
repos-openai-a.json, repos-openai-b.json |
| Others |
repos-others-a.json, repos-others-b.json |
Which files to search — pick the minimum set that covers the query, then grep them (below):
Rule A — category: specified: grep only that category's file(s), skip routing below.
Match the category name case-insensitively and accept common variants:
cli/clis/command-line → CLIs · chatbot/bot/chatbots → Chatbots · browser/extension/browser-extension → Browser-extensions · prompt/prompts → Prompts · tutorial/tutorials → Tutorials · reimpl/reimplementation → Reimplementations · awesome/lists → Awesome-lists · open ai/openai → Openai. If the value matches no category, fall back to keyword routing (Rule C).
Rule B — list categories: skip the keyword search, jump to Step 5b.
Rule C — keyword routing for general queries:
Use the English keywords from Step 1 (not the original query text) for routing.
For each row below, check if any English keyword contains or matches the listed terms (case-insensitive substring).
Use that row's file(s) only if there is a match.
If multiple rows match, collect all their files (deduplicated).
If no rows match, use the default: repos-chatbots-a.json, repos-nlp-a.json, repos-openai-a.json, repos-others-a.json.
| If query mentions… |
Search these files |
| chatbot, bot, chat, dialog, conversation, assistant, discord, slack |
repos-chatbots-a.json, repos-chatbots-b.json |
| RAG, retrieval, vector, embed, semantic, FAISS, Chroma, Pinecone, similarity, index |
repos-nlp-a.json, repos-nlp-b.json, repos-langchain.json |
| NLP, text, classify, classification, NER, POS, sentiment, translation, extraction, summariz |
repos-nlp-a.json, repos-nlp-b.json |
| agent, agentic, workflow, autonomous, orchestrat, tool use, function call, multi-agent |
repos-others-a.json, repos-others-b.json, repos-langchain.json |
| OpenAI, GPT-3, GPT-4, gpt4, gpt3, completion, fine-tun, API key, endpoint |
repos-openai-a.json, repos-openai-b.json |
| browser, extension, Chrome, Firefox, sidebar, popup, Tampermonkey |
repos-browser-extensions-a.json, repos-browser-extensions-b.json |
| CLI, terminal, shell, command-line, command line |
repos-clis-a.json, repos-clis-b.json |
| tutorial, learn, course, beginner, guide, example, cookbook, sample |
repos-tutorials.json |
| prompt, prompting, few-shot, chain-of-thought, jailbreak, injection |
repos-prompts.json |
| Unity, game engine, 3D, game development |
repos-unity.json |
| LangChain, LlamaIndex, Haystack, chain, index, LangGraph |
repos-langchain.json |
| lora, peft, qlora, finetun, fine-tuning, quantiz |
repos-reimplementations.json, repos-nlp-a.json, repos-openai-a.json |
| evaluat, benchmark, metric, assess, leaderboard |
repos-nlp-a.json, repos-nlp-b.json, repos-others-a.json |
| reimplement, from scratch, reproduce, train, training, PyTorch |
repos-reimplementations.json |
| awesome list, curated, collection, survey, compilation |
repos-awesome-lists.json |
| code, coding, IDE, VS Code, copilot, autocomplete, interpreter |
repos-others-a.json, repos-others-b.json, repos-clis-a.json |
| image, vision, multimodal, DALL-E, Stable Diffusion, drawing |
repos-others-a.json, repos-nlp-a.json |
| voice, speech, audio, TTS, ASR, Whisper |
repos-others-a.json, repos-nlp-b.json |
Then grep those files for the keywords — do NOT read whole files into context (no Read tool, cat, or full-file dumps). Locate the data directory once — it is the plugin's data/ folder, two levels above this SKILL.md:
- Claude Code:
${CLAUDE_PLUGIN_ROOT}/data
- Codex:
<directory of this SKILL.md>/../../data, built from the absolute path you loaded this SKILL.md from.
If that directory does not exist (unusual install), find it — the data directory is the folder that contains the printed file:
find "${CODEX_HOME:-$HOME/.codex}/plugins" "$HOME/.claude/plugins" "$PWD" -type f -name repos-unity.json -path "*awesome-chatgpt-search*" 2>/dev/null | head -1
Shell variables may not persist between commands, so write the resolved absolute path in place of $DATA in the commands below.
Then grep the selected files for your Step 1 keywords and cap the output. Use -F (literal substring match — same semantics as the scoring step, and safe for keywords like c++ or .net) with one -e per keyword:
grep -ihF -e keyword1 -e keyword2 -e keyword3 "$DATA"/repos-nlp-a.json "$DATA"/repos-nlp-b.json | head -120
Each line of output is one repo record (a JSON object) that matched at least one keyword — score those lines directly in Step 4. This reads only the matching repos, not the whole files. Notes:
- If grep returns fewer than ~8 lines, broaden the keywords (add more general single-word stems or tool names from Step 1 — multi-word phrases rarely match) and re-run.
- If it returns the full
head cap, your keywords are good; proceed.
- Only fall back to reading individual files if
grep is unavailable.
Step 3 — Filter by language (if language:<lang> was given)
Append a language filter to the grep pipeline (the l field holds the language, matched case-insensitively):
grep -ihF -e keyword1 -e keyword2 "$DATA"/repos-clis-a.json "$DATA"/repos-clis-b.json | grep -iF '"l":"<lang>"' | head -120
Step 4 — Score candidates
Using the English keywords from Step 1, compute a relevance score for each repo record returned by grep:
Text match score (case-insensitive, per keyword):
- Name (
n) exact keyword match: +20 pts
- Name (
n) contains keyword: +10 pts
- Description (
d) contains keyword: +5 pts
- Topics (
t) contains keyword: +3 pts
- Category (
c) contains keyword: +2 pts
Popularity bonus (added once per item):
- If
ns (normalized star score) is present: min(4, ns * 0.4)
- Otherwise:
min(4, sc * 0.5)
Quality bonus (always added): min(2, sc * 0.25)
Combined score = text_match + popularity_bonus + quality_bonus
Exclude items with text_match < 5 (catches only accidental partial hits). Collect top 20 candidates by combined score.
Step 5a — Re-rank with your judgment
Apply semantic judgment to produce the final ordered list of 10 results — fewer only when fewer candidates actually fit the query.
Re-rank by evaluating each candidate on:
- Semantic centrality — how directly does this repo address the query's core intent?
- Quality signal — higher
sc means a richer, better-documented project.
- Category fit — match the repo type to the implied need:
- "build a chatbot / ボット" → prefer
Chatbots, CLIs
- "learn / tutorial / 勉強" → prefer
Tutorials
- "prompt engineering" → prefer
Prompts
- "use from browser" → prefer
Browser-extensions
- "NLP task" → prefer
NLP, Langchain
- "OpenAI API" → prefer
Openai
- Specificity — a repo specialized for the exact use-case beats a general one.
- Language fit — if the user implied a language, prefer repos with matching
l.
Step 5b — List categories (only if query was list categories / categories)
Skip scoring. Count the repositories per category from the data (one cheap command, so the numbers always match the bundled data):
grep -ho '"c":"[^"]*"' "$DATA"/repos-*.json | sort | uniq -c
Present the counts in this order, followed by the total:
## Available categories
| Category | Count |
|----------|-------|
| Awesome-lists | N |
| Prompts | N |
| Chatbots | N |
| Browser-extensions | N |
| CLIs | N |
| Reimplementations | N |
| Tutorials | N |
| NLP | N |
| Langchain | N |
| Unity | N |
| Openai | N |
| Others | N |
| **Total** | **N** |
Step 6 — Format the output
## Search results for "<query>"
*(Searched for: keyword1, keyword2, ...)*
Found N result(s).
### 1. [repository-name](url)
**Category:** category · **Language:** language · ⭐ {st} stars
Description text here.
*Topics: tag1, tag2, tag3*
### 2. ...
Fill every field from the record: link text n, URL u, category c, language l, stars st as-is, the description d verbatim (you may drop :emoji: shortcodes), and topics from t (trim long lists to about 8). The results stay in English like the data; only the Step 7 guide follows the query language.
Omit the Language line if l is absent. Omit ⭐ stars if st is absent. Omit the Topics line if t is absent.
If no results found, suggest alternate keywords and link to:
https://github.com/taishi-i/awesome-ChatGPT-repositories
Step 7 — Output use-case selection guide
After the search results list, append a guide table to help users pick the right repo for their specific situation.
Match the section heading and table language to the query language — if the query was in Japanese, use Japanese for the heading and column headers; otherwise use English.
## Use-case Selection Guide
| Use case | Recommended | Score | Why |
|---|---|---|---|
| ... | [name](url) | sc=N | short reason |
Rules:
- List 3–6 distinct use cases derived from the top 10 results. Each row should represent a meaningfully different scenario (e.g., "deploy a self-hosted chatbot" vs. "build a RAG pipeline"), not just a restatement of the query.
- For each row, select the single best repo from the top 10 results.
- Score column: show
sc=N using the item's quality score.
- Why: write a 10–15 word reason in the query language explaining the practical benefit. Do not copy the description verbatim.
- If two use cases map to the same repo, merge them into one row or drop the weaker one.
- If there are fewer than 3 meaningfully distinct use cases in the results, output as many rows as make sense (minimum 1).
1---2name: search-33description: Search 2500+ curated ChatGPT and LLM open-source repositories. Use when the user asks to find tools, libraries, or repos related to ChatGPT, LLMs, RAG, agents, langchain, NLP, AI development, or any open-source AI tooling.4---56Search the awesome-ChatGPT-repositories database for the user's query.78## Instructions910Ground rules — they apply whether this skill was invoked explicitly or picked automatically:11- Present only repositories from the bundled data files, even when the list has just a few matches — then say so and suggest other keywords rather than filling the gap from elsewhere.12- Don't search the web or open repository pages to add or verify details (setup, license, activity) unless the user explicitly asks for that: the curated list is the source of truth here, and its star counts and descriptions are snapshots. Copy names, URLs, and star counts exactly as they appear in the records.13- The output templates in Steps 5b–7 are fixed: keep their Markdown headings (`##`, `###`), field labels, and order, and don't restyle them (for example, turning the result list into a table or a prose summary).14- If the data files can't be read (for example, shell commands are blocked), say so and link https://github.com/taishi-i/awesome-ChatGPT-repositories instead of substituting other sources.1516### Step 1 — Interpret the query1718The query is the text the user passed to this skill (the same skill runs in Claude Code and Codex):19- **Claude Code:** the arguments of `/awesome-chatgpt-search:search`, appended at the end as `ARGUMENTS: …`.20- **Codex:** the user's message that invoked `$awesome-chatgpt-search:search`, minus the `$…` mention itself.2122If there is no explicit query text, use the user's latest request.2324Supported query modifiers:25- `category:<name>` — filter to one category26- `language:<lang>` — filter by programming language27- `list categories` or `categories` — skip to Step 5b28- Plain text — keyword search across all categories2930The descriptions are in **English**, so convert non-English queries to English keywords before searching.3132Examples:33| User query | English keywords to search |34|------------|---------------------------|35| RAGを使ったチャットボット | RAG, retrieval, chatbot, vector |36| 코드 생성 도구 (Korean) | code generation, copilot, autocomplete |37| 中文问答系统 | chinese, QA, question answering |38| outil de résumé (French) | summarization, summary, text |39| LLMを使ったエージェント | agent, autonomous, LLM, tool use |4041**Keyword tips:**42- **Use stems, not full words.** Substring match catches variants: `embed` → embedding/embeddings, `retriev` → retrieval/retrieve, `classif` → classification/classifier, `generat` → generation/generative, `fine-tun` → fine-tune/fine-tuning, `summari` → summarize/summarization, `orchestrat` → orchestrate/orchestration.43- **Add domain-specific names.** For common LLM/AI domains, include well-known tool or framework names present in the database:4445| Domain (query hint) | Stem keywords | Tool/library names to add |46|---|---|---|47| RAG / 検索拡張生成 | `retriev`, `rag`, `embed`, `vector` | `langchain`, `llamaindex`, `haystack`, `faiss`, `chroma`, `pinecone` |48| Agent / エージェント | `agent`, `autonom`, `orchestrat` | `autogpt`, `langchain`, `langgraph`, `crewai` |49| Fine-tuning / ファインチューニング | `fine-tun`, `lora`, `peft`, `finetun` | `lora`, `peft`, `qlora` |50| Code generation / コード生成 | `code`, `coding`, `copilot`, `autocomplet` | `copilot`, `codex`, `interpreter` |51| Chatbot / チャットボット | `chat`, `bot`, `dialog`, `convers` | `discord`, `telegram`, `slack` |52| Prompt engineering | `prompt`, `few-shot`, `chain-of-thought`, `jailbreak` | `promptflow`, `dspy` |53| Evaluation / 評価 | `evaluat`, `benchmark`, `metric` | `evals`, `lm-eval`, `deepeval` |54| Image / 画像生成 | `image`, `vision`, `multimodal` | `dall-e`, `stable-diffusion`, `midjourney` |55| Voice / 音声 | `voice`, `speech`, `audio`, `tts`, `asr` | `whisper`, `eleven` |5657- **Aim for 3–6 keywords.** Too few miss items; too many inflate low-quality partial matches.5859### Step 2 — Search the data files with grep6061Data is split into per-category files. Each file is a JSON array with **one repo record per line**, so you can `grep` for matches instead of reading whole files — this keeps token use low (a typical query pulls in a few dozen matching lines instead of hundreds of KB). Fields per record:62- `u`: GitHub URL · `n`: repository name · `d`: English description63- `c`: category · `l`: language (optional) · `t`: topics comma-separated (optional)64- `sc`: quality score 0–8 · `st`: star count (optional) · `ns`: normalized star score 0–10 (optional)6566**File list** (all under `data/` relative to this plugin; six categories over ~200 entries are split a/b):6768| Category | File(s) |69|----------|---------|70| Awesome-lists | `repos-awesome-lists.json` |71| Prompts | `repos-prompts.json` |72| Chatbots | `repos-chatbots-a.json`, `repos-chatbots-b.json` |73| Browser-extensions | `repos-browser-extensions-a.json`, `repos-browser-extensions-b.json` |74| CLIs | `repos-clis-a.json`, `repos-clis-b.json` |75| Reimplementations | `repos-reimplementations.json` |76| Tutorials | `repos-tutorials.json` |77| NLP | `repos-nlp-a.json`, `repos-nlp-b.json` |78| Langchain | `repos-langchain.json` |79| Unity | `repos-unity.json` |80| Openai | `repos-openai-a.json`, `repos-openai-b.json` |81| Others | `repos-others-a.json`, `repos-others-b.json` |8283**Which files to search — pick the minimum set that covers the query, then grep them (below):**8485**Rule A — category: specified:** grep only that category's file(s), skip routing below.86Match the category name **case-insensitively** and accept common variants:87`cli`/`clis`/`command-line` → CLIs · `chatbot`/`bot`/`chatbots` → Chatbots · `browser`/`extension`/`browser-extension` → Browser-extensions · `prompt`/`prompts` → Prompts · `tutorial`/`tutorials` → Tutorials · `reimpl`/`reimplementation` → Reimplementations · `awesome`/`lists` → Awesome-lists · `open ai`/`openai` → Openai. If the value matches no category, fall back to keyword routing (Rule C).8889**Rule B — list categories:** skip the keyword search, jump to Step 5b.9091**Rule C — keyword routing for general queries:**9293Use the **English keywords from Step 1** (not the original query text) for routing.94For each row below, check if any English keyword contains or matches the listed terms (case-insensitive substring).95Use that row's file(s) only if there is a match.96If multiple rows match, collect all their files (deduplicated).97If **no rows match**, use the default: `repos-chatbots-a.json`, `repos-nlp-a.json`, `repos-openai-a.json`, `repos-others-a.json`.9899| If query mentions… | Search these files |100|--------------------|-----------------|101| chatbot, bot, chat, dialog, conversation, assistant, discord, slack | repos-chatbots-a.json, repos-chatbots-b.json |102| RAG, retrieval, vector, embed, semantic, FAISS, Chroma, Pinecone, similarity, index | repos-nlp-a.json, repos-nlp-b.json, repos-langchain.json |103| NLP, text, classify, classification, NER, POS, sentiment, translation, extraction, summariz | repos-nlp-a.json, repos-nlp-b.json |104| agent, agentic, workflow, autonomous, orchestrat, tool use, function call, multi-agent | repos-others-a.json, repos-others-b.json, repos-langchain.json |105| OpenAI, GPT-3, GPT-4, gpt4, gpt3, completion, fine-tun, API key, endpoint | repos-openai-a.json, repos-openai-b.json |106| browser, extension, Chrome, Firefox, sidebar, popup, Tampermonkey | repos-browser-extensions-a.json, repos-browser-extensions-b.json |107| CLI, terminal, shell, command-line, command line | repos-clis-a.json, repos-clis-b.json |108| tutorial, learn, course, beginner, guide, example, cookbook, sample | repos-tutorials.json |109| prompt, prompting, few-shot, chain-of-thought, jailbreak, injection | repos-prompts.json |110| Unity, game engine, 3D, game development | repos-unity.json |111| LangChain, LlamaIndex, Haystack, chain, index, LangGraph | repos-langchain.json |112| lora, peft, qlora, finetun, fine-tuning, quantiz | repos-reimplementations.json, repos-nlp-a.json, repos-openai-a.json |113| evaluat, benchmark, metric, assess, leaderboard | repos-nlp-a.json, repos-nlp-b.json, repos-others-a.json |114| reimplement, from scratch, reproduce, train, training, PyTorch | repos-reimplementations.json |115| awesome list, curated, collection, survey, compilation | repos-awesome-lists.json |116| code, coding, IDE, VS Code, copilot, autocomplete, interpreter | repos-others-a.json, repos-others-b.json, repos-clis-a.json |117| image, vision, multimodal, DALL-E, Stable Diffusion, drawing | repos-others-a.json, repos-nlp-a.json |118| voice, speech, audio, TTS, ASR, Whisper | repos-others-a.json, repos-nlp-b.json |119120**Then grep those files for the keywords — do NOT read whole files into context (no Read tool, `cat`, or full-file dumps).** Locate the data directory once — it is the plugin's `data/` folder, two levels above this SKILL.md:121- **Claude Code:** `${CLAUDE_PLUGIN_ROOT}/data`122- **Codex:** `<directory of this SKILL.md>/../../data`, built from the absolute path you loaded this SKILL.md from.123124If that directory does not exist (unusual install), find it — the data directory is the folder that contains the printed file:125```126find "${CODEX_HOME:-$HOME/.codex}/plugins" "$HOME/.claude/plugins" "$PWD" -type f -name repos-unity.json -path "*awesome-chatgpt-search*" 2>/dev/null | head -1127```128Shell variables may not persist between commands, so write the resolved absolute path in place of `$DATA` in the commands below.129130Then grep the selected files for your Step 1 keywords and cap the output. Use `-F` (literal substring match — same semantics as the scoring step, and safe for keywords like `c++` or `.net`) with one `-e` per keyword:131```132grep -ihF -e keyword1 -e keyword2 -e keyword3 "$DATA"/repos-nlp-a.json "$DATA"/repos-nlp-b.json | head -120133```134Each line of output is one repo record (a JSON object) that matched at least one keyword — score those lines directly in Step 4. This reads only the matching repos, not the whole files. Notes:135- If grep returns **fewer than ~8 lines**, broaden the keywords (add more general single-word stems or tool names from Step 1 — multi-word phrases rarely match) and re-run.136- If it returns the full `head` cap, your keywords are good; proceed.137- Only fall back to reading individual files if `grep` is unavailable.138139### Step 3 — Filter by language (if `language:<lang>` was given)140141Append a language filter to the grep pipeline (the `l` field holds the language, matched case-insensitively):142```143grep -ihF -e keyword1 -e keyword2 "$DATA"/repos-clis-a.json "$DATA"/repos-clis-b.json | grep -iF '"l":"<lang>"' | head -120144```145146### Step 4 — Score candidates147148Using the English keywords from Step 1, compute a **relevance score** for each repo record returned by grep:149150**Text match score** (case-insensitive, per keyword):151- Name (`n`) exact keyword match: +20 pts152- Name (`n`) contains keyword: +10 pts153- Description (`d`) contains keyword: +5 pts154- Topics (`t`) contains keyword: +3 pts155- Category (`c`) contains keyword: +2 pts156157**Popularity bonus** (added once per item):158- If `ns` (normalized star score) is present: `min(4, ns * 0.4)`159- Otherwise: `min(4, sc * 0.5)`160161**Quality bonus** (always added): `min(2, sc * 0.25)`162163**Combined score = text_match + popularity_bonus + quality_bonus**164165Exclude items with **text_match < 5** (catches only accidental partial hits). Collect top **20** candidates by combined score.166167### Step 5a — Re-rank with your judgment168169Apply semantic judgment to produce the final ordered list of **10** results — fewer only when fewer candidates actually fit the query.170171Re-rank by evaluating each candidate on:1721. **Semantic centrality** — how directly does this repo address the query's core intent?1732. **Quality signal** — higher `sc` means a richer, better-documented project.1743. **Category fit** — match the repo type to the implied need:175 - "build a chatbot / ボット" → prefer `Chatbots`, `CLIs`176 - "learn / tutorial / 勉強" → prefer `Tutorials`177 - "prompt engineering" → prefer `Prompts`178 - "use from browser" → prefer `Browser-extensions`179 - "NLP task" → prefer `NLP`, `Langchain`180 - "OpenAI API" → prefer `Openai`1814. **Specificity** — a repo specialized for the exact use-case beats a general one.1825. **Language fit** — if the user implied a language, prefer repos with matching `l`.183184### Step 5b — List categories (only if query was `list categories` / `categories`)185186Skip scoring. Count the repositories per category from the data (one cheap command, so the numbers always match the bundled data):187```188grep -ho '"c":"[^"]*"' "$DATA"/repos-*.json | sort | uniq -c189```190Present the counts in this order, followed by the total:191192```193## Available categories194195| Category | Count |196|----------|-------|197| Awesome-lists | N |198| Prompts | N |199| Chatbots | N |200| Browser-extensions | N |201| CLIs | N |202| Reimplementations | N |203| Tutorials | N |204| NLP | N |205| Langchain | N |206| Unity | N |207| Openai | N |208| Others | N |209| **Total** | **N** |210```211212### Step 6 — Format the output213214```215## Search results for "<query>"216217*(Searched for: keyword1, keyword2, ...)*218219Found N result(s).220221### 1. [repository-name](url)222**Category:** category · **Language:** language · ⭐ {st} stars223Description text here.224*Topics: tag1, tag2, tag3*225226### 2. ...227```228229Fill every field from the record: link text `n`, URL `u`, category `c`, language `l`, stars `st` as-is, the description `d` verbatim (you may drop `:emoji:` shortcodes), and topics from `t` (trim long lists to about 8). The results stay in English like the data; only the Step 7 guide follows the query language.230231Omit the Language line if `l` is absent. Omit `⭐ stars` if `st` is absent. Omit the Topics line if `t` is absent.232233If no results found, suggest alternate keywords and link to:234https://github.com/taishi-i/awesome-ChatGPT-repositories235236### Step 7 — Output use-case selection guide237238After the search results list, append a guide table to help users pick the right repo for their specific situation.239240**Match the section heading and table language to the query language** — if the query was in Japanese, use Japanese for the heading and column headers; otherwise use English.241242```243## Use-case Selection Guide244245| Use case | Recommended | Score | Why |246|---|---|---|---|247| ... | [name](url) | sc=N | short reason |248```249250**Rules:**251- List **3–6 distinct use cases** derived from the top 10 results. Each row should represent a meaningfully different scenario (e.g., "deploy a self-hosted chatbot" vs. "build a RAG pipeline"), not just a restatement of the query.252- For each row, select the **single best repo** from the top 10 results.253- **Score column**: show `sc=N` using the item's quality score.254- **Why**: write a 10–15 word reason in the query language explaining the practical benefit. Do not copy the description verbatim.255- If two use cases map to the same repo, merge them into one row or drop the weaker one.256- If there are fewer than 3 meaningfully distinct use cases in the results, output as many rows as make sense (minimum 1).