Skip to content

Make/Mise: Demote private (_-prefixed) targets visually and sort them below public targets #13

@MelbourneDeveloper

Description

@MelbourneDeveloper

Summary

GNU Make (and by convention, Mise) uses naming conventions to distinguish user-facing targets from internal implementation targets. CommandTree should reflect these conventions in the UI.

Request

a) Sorting: Private targets grouped below public targets

Targets/tasks prefixed with _ are an established community convention for private, internal-use-only recipes — not meant to be invoked directly by the user. They should be rendered in a second sorted group, visually separated from the primary targets.

Layout:

▾ Makefile
  build
  ci
  clean
  fmt
  lint
  setup
  test
  ─────────────────  ← divider
  _build
  _clean
  _fmt
  _lint
  _test_e2e
  _test_fsharp

Same convention applies to Mise tasks (mise.toml). Mise has no built-in private task mechanism, but _-prefixed tasks are the de facto community convention (borrowed from Make).

b) Visual de-emphasis: Harder to accidentally tap

Private targets should be rendered in a lower-contrast, dimmed style so they don't compete visually with the primary targets. The goal is: present but obviously secondary — a user shouldn't accidentally tap one.

Suggested treatment:

  • Reduced opacity / muted foreground color (e.g., text-muted / secondary token)
  • Possibly slightly smaller font weight (not smaller size — still legible)
  • No bold or accent color

Additional Make Naming Conventions to Handle

While addressing this, here are other GNU Make conventions worth consistent treatment:

Convention Example Meaning Suggested UI treatment
_ prefix _test_fsharp Private/internal helper Dimmed, sorted below public
. prefix .PHONY, .DEFAULT, .SILENT GNU Make built-in special targets Hide entirely — these are not invokable targets
% pattern rules %.o: %.c Implicit/pattern rules Hide entirely — not directly invocable
help help Convention: prints available targets Pin to top or highlight as entry point
ALL_CAPS TAGS Metadata/utility targets (rare as targets) No special treatment needed unless prefixed

.PHONY as the canonical source of truth

In well-structured Makefiles, .PHONY declares all non-file targets. CommandTree could use .PHONY membership as a signal that a target is intentionally invokable (and not a file artifact), distinct from internal helper recipes that are often deliberately omitted from .PHONY.

Rationale

  • Users shouldn't accidentally run internal recipes (e.g., _test_fsharp without the test fixture setup that test provides)
  • Visual hierarchy reduces cognitive load — the 5–7 primary targets are what 95% of interactions need
  • Following existing conventions (rather than inventing new ones) means projects get the right behavior without any configuration

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions