skills/crew/change-type-detector/SKILL.md
Classifies a list of file paths into change types (ui, api, both, unknown) using an explicit two-pass decision algorithm: extension matching first, then path-segment matching for ambiguous cases. Use when: "detect change type", "classify files", "what kind of change", "ui or api change", "change-type detection", or before creating test tasks.
npx skillsauth add mikeparcewski/wicked-garden change-type-detectorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Classify file paths to determine which test types are needed.
{
"change_type": "ui|api|both|unknown",
"ui_files": [...],
"api_files": [...],
"ambiguous_files": [...],
"confidence": 0.0-1.0,
"reasoning": "file1: reason; file2: reason; ..."
}
Apply to EACH file independently, then combine results.
Rule 1.1 — UI Extensions (unambiguous by default)
Files with these extensions classify as ui:
.tsx, .jsx, .vue, .svelte, .html, .htm, .css, .scss, .sass, .less
Exception — .tsx-in-api/ override rule (apply before returning ui):
If a UI-extension file has API path segments (api, routes, controllers,
handlers, endpoints, server, backend, services, graphql, rest, grpc,
middleware, resolvers, mutations, queries) AND no UI path segments,
AND the task description contains API keywords — classify as api.
Otherwise keep ui (extension wins).
Rule 1.2 — API-Confirming Extensions
Files with .py, .rb, .go, .java, .kt, .rs, .cs, .php, .scala, .clj, .ex, .exs:
apiambiguous (treat as both)api (default for backend languages)Rule 1.3 — Ambiguous Extensions
Files with .ts, .js, .mjs, .cjs → proceed to Pass 2.
Rule 1.4 — Unrecognized Extensions
All other extensions (.md, .yaml, .json, .sh, Makefile, etc.):
uiapiambiguousunrecognized (does not contribute to change type)Check path segments (split on /, lowercase) against segment tables.
| Outcome | Condition |
|---------|-----------|
| ui | Has UI segment, no API segment |
| api | Has API segment, no UI segment |
| Use task description | Has both UI and API segments |
| Use task description | Has neither UI nor API segment |
Task description tiebreaker: tokenize description on non-alphanumeric characters, check against API keywords and UI keywords (see File Classification Rules).
apiuiambiguousAfter classifying all files:
| Files Present | change_type | confidence |
|---------------|-------------|------------|
| Only ui_files | ui | 1.0 |
| Only api_files | api | 1.0 |
| Both ui + api | both | 0.9 |
| ambiguous_files present | promotes to both | 0.7 |
| Only unrecognized | unknown | 0.8 |
| No files | unknown | 1.0 |
Ambiguous files are conservative: they promote the result to both (over-inclusive).
| Extension | Path Signals | Task Keywords | Result |
|-----------|-------------|---------------|--------|
| .tsx/.jsx/.vue/.svelte | — | — | ui |
| .tsx + api/ path | API kws in desc | yes | api |
| .css/.scss/.sass/.less | — | — | ui |
| .html/.htm | — | — | ui |
| .py/.rb/.go/.java/.kt | api/ path | — | api |
| .py/.rb/.go/.java/.kt | — (no path) | — | api |
| .ts/.js | components/ | — | ui |
| .ts/.js | api/ routes/ | — | api |
| .ts/.js | neither | API kws | api |
| .ts/.js | neither | UI kws | ui |
| .ts/.js | neither | neither | ambiguous |
| .md/.yaml/.json | — | — | unrecognized |
See File Classification Rules for the complete extension tables, path segment tables, and keyword lists.
development
--- name: large-scale-migration description: How to execute a LARGE MECHANICAL change across any codebase with LEVERAGE instead of an agent-grind or hand-edits — a cross-cutting migration, refactor, rename, dialect/framework/DB port, library adoption, or bulk transform. The map→transform→gate pattern: a deterministic transform driven by a source-of-truth map, proven by a differential-equivalence gate. Use when the work is "migrate all X to Y", "rename Z everywhere", "port to a new DB/dialect/fra
testing
v11 LLM-based work-shape classifier. Replaces the regex archetype detector with the model's own reasoning. Reads the user's prompt, picks the right archetype(s) from the catalog, identifies signals (blast_radius, novelty, reversibility, etc.), and persists to SessionState so subsequent turns steer correctly. Use when: the prompt_submit hook emitted a `<wg classify-due />` directive, OR explicitly invoked at session start, OR when re-classifying after the user changes scope mid-session.
tools
v11 work-shape archetype runner. When a prompt has been routed to one of the 9 archetypes (triage, explore, specify, decide, ship, review, incident, build, migrate), this skill is the entry point. It picks the right per-archetype playbook from refs/ and executes the phase shape declared in `.claude-plugin/archetypes.json`. Use when: a `<wg archetype="X">` or `<wg archetypes>` system-reminder tag appears, an explicit "let's run the X archetype" request, or when one of the per-archetype slash commands resolves to this skill.
development
Show or set the session intent variable. Intent gates how loud the framework is — simple-edit (silent), feature/research (synthesis directive), rigor (full crew context). Auto-detected on turn 1; this skill overrides explicitly. Sticky for the session. Use when: "set intent", "intent override", "/wicked-garden:intent", "make the framework quiet", "force rigor", "what's my intent".