SkillsVote skill
Two skills that pick other skills for a task: the hosted one fetches them from an index and collects feedback, the local one searches your SKILL.md folders
- 305 ★ on the repository
- Last commit
- MIT
Broad access
Why this level
- The hosted variant sends the rewritten task and a per-subtask action summary to api.skills.vote, and keeps the API key in a .env file inside the skill folder
- Downloads third-party skills from GitHub into the project, and the agent then follows their instructions and runs their scripts
- Runs scripts through `uv run` and may write a GitHub token into the same .env file
Install
- Works in
In your terminal, with SkillFoxx CLI
npx skillfoxx add skills/skillsvoteDetects the agents on your machine, shows the access level and pins the version.
Other ways to install
Access and checks
How we reviewBroad accessThe tool can change data, run commands or handle secrets.
- The hosted variant sends the rewritten task and a per-subtask action summary to api.skills.vote, and keeps the API key in a .env file inside the skill folder
- Downloads third-party skills from GitHub into the project, and the agent then follows their instructions and runs their scripts
- Runs scripts through `uv run` and may write a GitHub token into the same .env file
This is third-party code. Review the repository files before installing.
What it does
SkillsVote from MemTensor targets the problem of a large skill set: instead of a long list in context, the agent gets the skills that fit the task at hand. The repository holds two skills in integration/skills and the research code the authors used for evaluation. `skills-vote` works with a hosted service. The agent rewrites the task into a standalone search query and runs `scripts/recommend.py` once through `uv run`: the script sends the query to api.skills.vote, receives a list of skills and downloads them from GitHub into `.skills_vote/`. A run can take about five minutes, and the agent must wait for it to finish. When the task is done, `scripts/feedback.py` submits a report: which skills were actually used, how each subtask ended and what environment was required. `skills-vote-local` searches your own library and needs no cloud key. In `configs/config.yaml` you list the path globs for SKILL.md, then `scripts/route_prompt.py` gives the agent instructions for the chosen route: main agent or subagent, one pass or up to three. The default search method is agentic, with no index or embedding service, while Chroma-based vector search is enabled separately.
Who it is for. For people with dozens or thousands of skills who want Claude Code, Codex or another agent to pull in only the ones it needs instead of loading every description into context.
Good fit when
- Your agent has so many skills that their descriptions take a noticeable share of the context
- Before a complex task you want external skills found for it instead of browsing catalogs by hand
- Your team keeps a private SKILL.md library that cannot go to the cloud
- You want to collect reports on which recommended skills proved useful in the work
- You study skill selection and evolution and want to reproduce the authors' Terminal-Bench experiments
Not a fit when
- The network is unavailable or queries must not leave the machine: hosted `skills-vote` calls api.skills.vote, and only `skills-vote-local` works offline
- You need evaluation and evolution of skills inside a local library: that part of `skills-vote-local` is on the authors' roadmap and not released yet
- You cannot install the `uv` manager on the machine: both skills run their scripts with `uv run`
- You are not considering external skills at all: `skills-vote` itself says to skip it in that case
- The set is small and you know the skills you need: selection pays off for a large library, and two or three skills need only an ordinary install
Example request
Before you start, find skills for this task: add integration tests for a FastAPI service with a mocked gatewayLimitations
- Hosted `skills-vote` needs a `SKILLS_VOTE_API_KEY`, and the repository does not say how to get one. Downloading skills from GitHub without a token runs into rate limits, and private repositories need `GH_TOKEN` or `GITHUB_TOKEN`.
- The `client_name` field takes seven values: codex, codex-app, claude-code, cursor, gemini-cli, openclaw-cli, opencode. Other agents omit it.
- Two roadmap items remain open: attribution and evolution for `skills-vote-local`, and publication of the main experiment trajectories.
- The `subagent_multi_pass` route from the example config requires an agent that can create subagents. If it cannot, the variant with the `--fallback` flag runs.
- Vector search needs an embedding service, in the example an OpenAI-compatible address and a key in a variable.
- The experiment code targets Python 3.12 and newer and uses Harbor. MIT license.
How to disable. Delete the `skills-vote` or `skills-vote-local` skill folder from the agent's skills directory, for example with `npx skills remove`. For the hosted variant, delete the .env file in the installed skill folder together with the key, and the `SKILLS_VOTE_API_KEY` system variable if you put it in your profile. Downloaded recommendations sit in the project's `.skills_vote/` and can be deleted like ordinary files.
FAQ
What data goes to the cloud with the feedback?
According to the `feedback.py` description: a session id, OS family, expected write scope, whether elevated privileges are needed, network dependency, environment variable names without values, lists of executables and MCP servers, and a text summary of each subtask covering the goal, actions, skills used, outcome and the evidence for it.
Where do the recommended skills land?
In `.skills_vote/` relative to the current directory unless the request names another `download_dir`. The `download.py` script fetches files through the GitHub API, so rate limits and private repositories depend on a token.
How do I pick a route in the local variant?
The `routing.mode` field in `configs/config.yaml` takes `main_single_pass`, `main_multi_pass`, `subagent_single_pass` and `subagent_multi_pass`. The example config sets the last with three passes, and `retrieval.method` defaults to `agentic_search`.
Where does local mode look for skills?
Path globs go in `skill_library.include`, and exclusions such as .git, node_modules, .venv and dist are already in the example. With agentic search the search scope is always ./.skills/, and the `sync_skills.py` script gathers the matched skills there under aliases.
What did the authors test the approach on?
On Terminal-Bench Pro, Terminal-Bench 2.0 and SWE-Bench Pro. By their conclusion, just-in-time skill selection and feedback-driven evolution improve results on long tasks. Configs and reproduction scripts are described in docs/experiment.md, and the technical report is on arXiv as 2605.18401.
Discussion
No questions or reviews yet.
Related
SkillsA skill that designs, tests, evaluates and packages other agent skills, starting from architecture
A CLI skill manager for AI agents: install from repositories, translate between agent formats and deploy into their configs
A CLI that detects your project's stack and installs matching agent skills from a vetted registry in one command
Darwin Skill
darwin-skill
A skill that improves other skills: scores SKILL.md on nine criteria, edits, tests with prompts and reverts
A skill that helps an agent author other skills to the agentskills.io spec: structure, metadata, progressive disclosure and validation
A skill orchestrator that freezes requirements, plans work in phases and picks the right skills from your local set for the task
Comparison with similar tools
Entries that share the main search query, and how they differ.
| Entry | Official | Repository stars | Main difference |
|---|---|---|---|
| SkillsVote (this entry) | no | 305 | |
| SkillNet | no | 1,419 | a standalone CLI and Python SDK: searches a shared public library, downloads, creates and evaluates skills |
| SkillCorpus | no | 689 | an open pipeline: collects SKILL.md from repositories, checks security and licenses, scores quality and selects skills |
README in short
The description opens by posing the problem: how to manage the skill lifecycle from collection to update. It continues with the four stages of the loop, news from April to May 2026, a roadmap with two open items, three benchmarks and a quick start with a table of two install variants. The repository holds the `skills_vote` Python package with recommendation, feedback, evolution and router modules, Harbor experiment scripts, a Dockerfile and recommendation examples built on the pdf, xlsx and other skills.
README badge
Original SKILL.md
---
name: skills-vote
description: Find the most relevant external agent skills for the current task, then submit grounded feedback about which skills were actually used and useful in the same session. Whenever you start a task, use this skill first.
metadata:
version: "1.1.0"
---
# Skill Discovery And Feedback
Read only this file first. Do not read `scripts/` or any other files in this skill unless this file or a script output explicitly tells you to do so.
Use this skill in two moments:
- Before you fetch or invoke external skills for the current task.
- After the task is effectively done, to report what skills were actually useful.
Skip this skill if you are not considering any external skills at all.
All paths mentioned in this file are relative to this skill root. `cd` to this root directory before running any command here.
## Preconditions
Before using this skill, ensure that:
- `SKILLS_VOTE_API_KEY` is set in the environment
- `uv` is installed and available on `PATH`
- the runtime can execute local scripts with `uv run`
- `GITHUB_TOKEN` or `GH_TOKEN` may be needed later if GitHub blocks skill downloads because the repo is private or rate-limited
1. Confirm `SKILLS_VOTE_API_KEY` is set:
- macOS or Linux: `bash scripts/check_api_key.sh`
- Windows PowerShell: `powershell -ExecutionPolicy Bypass -File scripts/check_api_key.ps1`
2. Verify that `uv` is installed: `uv -V`
3. If `uv` is missing, install it from the [official docs](https://docs.astral.sh/uv/getting-started/installation/).
- macOS or Linux:
- If curl is available, `curl -LsSf https://astral.sh/uv/install.sh | sh`
- Otherwise `wget -qOhttps://astral.sh/uv/install.sh | sh`
- Windows PowerShell: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
4. Verify again: `uv -V`
## Recommend
### Request schema
`recommend.py` accepts one JSON object with these fields:
`query` (`str`): A standalone, explicit, and retrieval-optimized description of the user's task. Rewrite the original request to improve clarity, specificity, and usefulness for search, retrieval, or downstream planning. When appropriate, include reasonable implied constraints, likely substeps, supporting tasks, or candidate approaches that are directly relevant to completing the task. Favor expansions that make the task easier to retrieve against or execute, but avoid adding weakly supported assumptions, unrelated details, or excessive verbosity. For example, if the original query is "make a video," the rewritten query may expand it into a fuller task such as planning the content, identifying the audience, drafting a script, preparing slides, designing charts or visual assets, considering animation tools like Manim, recording narration, editing the final video, and rehearsing delivery.
- `client_name` (`Literal["codex", "codex-app", "claude-code", "cursor", "gemini-cli", "openclaw-cli", "opencode"] | None = None`): Name of this agent. If unknown/unverified or not listed, omit the field or return `null`.
- `client_version` (`str | None = None`): Version of this agent. Prefer the exact version string reported by the client itself. If unknown/unverified, omit the field or return `null`.
- `download_dir` (`str = ".skills_vote/"`): Directory to download recommended skills into. Relative paths are resolved from the current working directory. The path must be writable from the current runtime.
### Example
Before sending the request, try to identify the `client_name` and `client_version` from the executable or CLI when possible. If no command exists to extract the version and it cannot be retrieved from the environment (e.g., some desktop apps), omit these fields.
| `client_name` | `client_version` | `command` | `output` |
| :-: | :-: | :-: | :-: |
| `openclaw-cli` | `2026.3.24` | `openclaw -v` | `OpenClaw 2026.3.24 (cff6dc9)` |
| `codex` | `0.117.0` | `codex -V` | `codex-cli 0.117.0` |
| `codex-app` | `26.325.21221` | `N/A` | `N/A` |