Problem
The tree currently shows a flat list of Make targets under Make Targets (13) — help, build, ci, clean, fmt, lint, package, setup, test, test-exclude-ci, plus variables like COVERAGE_THRESHOLDS_FILE and UNAME that leaked in as pseudo-targets. This doesn't scale: real Makefiles routinely have dozens of targets and users can't find what they need.
The same problem exists across every command-type we support (Mise tasks, VS Code tasks, npm scripts, Just recipes, etc.). Each provider currently shows a flat list, and there is no shared visual language for grouping.
Goal
A consistent grouping visual language across all command types — Make, Mise, VS Code tasks, npm, Just, Cargo, Gradle, Rake, Taskfile, etc. — so that a user who learns the grouping for one provider immediately understands the others.
GNU convention (source of truth for Make)
Per GNU Makefile Conventions — Standard Targets for Users, standard target names fall into natural groups:
| Group |
Standard targets |
| Build |
all (default) |
| Install |
install, install-html, install-pdf, install-ps, install-strip, installdirs, installcheck, uninstall |
| Clean |
clean, mostlyclean, distclean, maintainer-clean |
| Test |
check |
| Docs |
info, html, pdf, ps, TAGS |
| Dist |
dist |
These are the canonical groups a user expects. Our grouping must at minimum recognise these.
Proposed groups (cross-provider)
A single taxonomy used by every discovery provider:
- Build — compile/package (Make
all/build, npm build, Cargo build, VS Code build group, Mise build:*)
- Test — Make
check/test, npm test, pytest, Cargo test, VS Code test group
- Lint / Format —
lint, fmt, format, check-format
- Run / Dev —
start, dev, serve, watch, launch configs
- Clean —
clean, distclean, mostlyclean, maintainer-clean
- Install / Deps —
install, setup, bootstrap, uninstall, install-*
- Release / Dist —
dist, package, release, publish
- CI —
ci, ci-*
- Docs —
docs, html, pdf, info, ps
- Other — anything unmatched
Classification strategy
- Name-prefix / name-suffix rules —
test-*, *-test, docker-*, db-* group by prefix.
- Known-target dictionary — exact matches to GNU standard names and common ecosystem names (npm's
start/test/build; Cargo's build/test/check/doc; Mise build:*/test:*).
- Provider-native metadata where available:
- VS Code tasks:
group field (build, test) — see tasks.json reference.
- npm: lifecycle scripts (
pre*/post*) are grouped under their parent.
- Mise:
: namespace (build:web, build:api) — group by the prefix before :.
- Just: doc comments above recipes.
- Make: parse
## group: <name> or ## comment annotations when present (popular make help convention).
- Fallback: ungrouped targets go to Other.
Visual language
- Each group shown as a collapsible tree node with a consistent icon + label across providers.
- e.g. "Build" always uses the same icon whether it comes from Make, npm, or VS Code tasks.
- Group order is fixed across providers (Build → Test → Lint → Run → Clean → Install → Release → CI → Docs → Other).
- Groups with zero matches are hidden.
- Single-item groups still render (consistency beats compactness).
- A setting
commandtree.grouping with values auto (default) / flat / custom lets users opt out.
Out of scope (follow-ups)
- User-configurable custom groups via
commandtree.json.
- Per-workspace overrides of the default classification dictionary.
- Drag-to-regroup in the tree.
Acceptance
References
Problem
The tree currently shows a flat list of Make targets under Make Targets (13) —
help,build,ci,clean,fmt,lint,package,setup,test,test-exclude-ci, plus variables likeCOVERAGE_THRESHOLDS_FILEandUNAMEthat leaked in as pseudo-targets. This doesn't scale: real Makefiles routinely have dozens of targets and users can't find what they need.The same problem exists across every command-type we support (Mise tasks, VS Code tasks, npm scripts, Just recipes, etc.). Each provider currently shows a flat list, and there is no shared visual language for grouping.
Goal
A consistent grouping visual language across all command types — Make, Mise, VS Code tasks, npm, Just, Cargo, Gradle, Rake, Taskfile, etc. — so that a user who learns the grouping for one provider immediately understands the others.
GNU convention (source of truth for Make)
Per GNU Makefile Conventions — Standard Targets for Users, standard target names fall into natural groups:
all(default)install,install-html,install-pdf,install-ps,install-strip,installdirs,installcheck,uninstallclean,mostlyclean,distclean,maintainer-cleancheckinfo,html,pdf,ps,TAGSdistThese are the canonical groups a user expects. Our grouping must at minimum recognise these.
Proposed groups (cross-provider)
A single taxonomy used by every discovery provider:
all/build, npmbuild, Cargobuild, VS Codebuildgroup, Misebuild:*)check/test, npmtest,pytest, Cargotest, VS Codetestgrouplint,fmt,format,check-formatstart,dev,serve,watch, launch configsclean,distclean,mostlyclean,maintainer-cleaninstall,setup,bootstrap,uninstall,install-*dist,package,release,publishci,ci-*docs,html,pdf,info,psClassification strategy
test-*,*-test,docker-*,db-*group by prefix.start/test/build; Cargo'sbuild/test/check/doc; Misebuild:*/test:*).groupfield (build,test) — see tasks.json reference.pre*/post*) are grouped under their parent.:namespace (build:web,build:api) — group by the prefix before:.## group: <name>or## commentannotations when present (popularmake helpconvention).Visual language
commandtree.groupingwith valuesauto(default) /flat/customlets users opt out.Out of scope (follow-ups)
commandtree.json.Acceptance
TaskGroupenum + classifier module used by every discovery providergroupfield:namespaces become groupsCOVERAGE_THRESHOLDS_FILEandUNAMEno longer appear as Make "targets" (separate filtering fix in src/discovery/make.ts)all,clean,distclean,check,install, they land in Build / Clean / Clean / Test / Install respectivelypackage.json,Justfile, andmise.tomlwith equivalent tasksReferences
buildRootCategories()