Skip to content

Group Make targets (and other command types) with a consistent visual language #18

@MelbourneDeveloper

Description

@MelbourneDeveloper

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 / Formatlint, fmt, format, check-format
  • Run / Devstart, dev, serve, watch, launch configs
  • Cleanclean, distclean, mostlyclean, maintainer-clean
  • Install / Depsinstall, setup, bootstrap, uninstall, install-*
  • Release / Distdist, package, release, publish
  • CIci, ci-*
  • Docsdocs, html, pdf, info, ps
  • Other — anything unmatched

Classification strategy

  1. Name-prefix / name-suffix rulestest-*, *-test, docker-*, db-* group by prefix.
  2. 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:*).
  3. 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).
  4. 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

  • Shared TaskGroup enum + classifier module used by every discovery provider
  • GNU standard Make target names classify correctly (see table above)
  • VS Code tasks honour their native group field
  • Mise : namespaces become groups
  • Variables like COVERAGE_THRESHOLDS_FILE and UNAME no longer appear as Make "targets" (separate filtering fix in src/discovery/make.ts)
  • E2E test asserts that, given a fixture Makefile with all, clean, distclean, check, install, they land in Build / Clean / Clean / Test / Install respectively
  • E2E test asserts grouping is identical in structure for a fixture package.json, Justfile, and mise.toml with equivalent tasks

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions