From wicked-garden
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 claudepluginhub mikeparcewski/wicked-garden --plugin wicked-gardenThis skill uses the workspace's default tool permissions.
Classify file paths to determine which test types are needed.
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
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.