Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill whenever the user gives a short or vague vibe-coding instruction that references existing UI elements, components, pages, or behavior inside an existing codebase (e.g. "ubah button di header", "samain style sama halaman login", "fix the navbar spacing"). This skill enforces a scoping-first workflow: run scripts/scoper.py to get a short list of relevant file paths BEFORE reading any file contents, instead of scanning or reading the whole project. Do not use this for brand-new files
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 1026% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 163% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 29% | 0% |
Vibe-coding instructions are short ("ubah button di header") but resolving them naively costs a lot of tokens: reading the whole file tree, or opening many files just to find the one that matters. This skill enforces a disciplined order of operations: locate candidates first, read second.
Step 1 — Run the scoper, do not browse the filesystem manually first.
bashpython3 <skill_dir>/scripts/scoper.py --root <project_root> --scope "<user's instruction, verbatim>"
Replace <skill_dir> with this skill's own directory and <project_root> with the project's root (usually the current working directory or git worktree root). Pass the user's instruction as close to verbatim as possible — do not pre-summarize it, since the matcher extracts its own keywords.
The script returns JSON:
json{ "cache_status": "hit" | "rebuilt", "total_files_indexed": 132, "candidates": ["src/components/Header.jsx"], "related_files": ["src/components/Button.jsx"], "token_estimate": {"src/components/Header.jsx": 812, "src/components/Button.jsx": 210}, "warnings": [] }
candidates — the primary files to read and edit.related_files — files structurally connected to a candidate via theimport graph (something a candidate imports, or something that imports a candidate) that didn't independently match the prompt's keywords. Treat these as reference/context only (e.g. a shared theme/Button file a matched component imports) — don't edit them unless the task actually requires it.
token_estimate — rough token-size estimate per file (candidates +related_files). Useful for judging whether a file is worth reading in full vs. grep-ing just the relevant part.
warnings — populated when a candidate file is unusually large, or thecombined estimated size of all candidates is large. Take these seriously: prefer reading only the relevant section (e.g. via grep -n or a targeted view range) over reading the whole file when a warning is present.
.gitignore-aware (via git ls-files), sonode_modules, build output, etc. are already excluded — don't add your own exclusion logic on top.
<project_root>/.scoper_cache/ and is reused acrosscalls within the same working session, so repeated prompts in one session are cheap after the first call.
package.json/pyproject.toml/etc. rootsdetected), candidates outside the package of the top match are ranked lower automatically — you don't need to reason about this yourself, just trust the ordering candidates already comes in.
Step 2 — Judge the candidates before reading anything.
candidates is empty, or clearly doesn't match what the user meant(e.g. score was too low), do NOT fall back to a broad manual scan. Instead, ask the user one short clarifying question naming a folder/component, or ask them to point at the relevant file directly.
candidates has 1-2 clearly relevant files: proceed to Step 3.candidates has several plausible files and it's ambiguous whichone the user means (e.g. multiple Header.jsx in different subfolders/packages), ask a single clarifying question before reading any of them.
Step 3 — Read candidates first, related_files only if actually needed.
candidates. Do not proactively read siblingfiles, entire directories, or the project tree "just in case."
related_files are surfaced via the import graph as likely context(e.g. a shared component/theme file a candidate imports). Only open one if the edit genuinely requires understanding or touching it — don't read all of them by default just because they're listed.
fine to read that one additional file — but don't use this as an excuse to widen the scope broadly. Read only what the edit actually requires.
warnings flagged a file as large, prefer a targeted read (grep forthe relevant function/section, or a bounded view range) over reading the entire file.
view on the whole projectroot, find ., ls -R, etc.) before calling the scoper. The scoper's job is precisely to avoid that.
If the scoper's candidate list feels insufficient, re-run it with a more specific --scope string (e.g. add a folder hint the user mentioned) rather than manually exploring.
Running it is cheap; skipping it is the exact anti-pattern this skill exists to prevent.
locate (there's nothing to scope).
everywhere", "add TypeScript to the whole project") — scoping to a handful of files would be counterproductive; a full-project approach is correct here.
The scoper combines four signals when ranking primary candidates:
folder name (including tokenized camelCase/kebab-case, e.g. "header" matches TopHeader.jsx)?
class name declared inside a file, even if the filename itself doesn't match (e.g. TopHeader declared inside Nav.jsx)?
last few commits get a small ranking boost, since vibe-coding prompts are often continuations of whatever was just being worked on.
candidates (.scoper_cache/session_log.json); a new prompt similar to a recent one gets a boost toward those same files (helps "lanjutin yang tadi, tambahin border juga" follow-ups).
On top of that:
package/workspace roots, candidates outside the package of the top-scoring match are ranked lower (not excluded).
candidates are surfaced separately as related_files, so a shared file (e.g. a Button/theme component) shows up even without keyword overlap.
size estimate, with warnings when a file or the total is large enough that reading it whole would be wasteful.
None of these fully replace judgment: if matching still misses a file due to very unusual naming or project structure, fall back to asking the user rather than reading broadly.
Other measured skills in the registry, with their headline benchmark lift.