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

Open
#18 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
38/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
typescript

Research direction

Start with src/CommandTreeProvider.ts and its buildRootCategories() entry point, then inspect the providers under src/discovery/. Review src/discovery/make.ts for the variable-filtering requirement and trace how each provider currently builds its command list. Done means a shared TaskGroup classifier and consistent grouping across the listed providers, with the specified Make, VS Code, Mise, and end-to-end fixture behavior.

Written by the indexing model from the issue text.

Description

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

Dominant language
TypeScript
Stars
3
Forks
2
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Nimblesite/CommandTree

All issues in Nimblesite/CommandTree

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.