Skip to content

v2 CLI: normalize flattened normal-user command vocabulary #252

Description

@shpoont

Parent: #209
Related: #228, #214

Purpose

Normalize the v2 normal-user CLI around flattened action commands while keeping catalog ... and recipe ... as focused umbrella namespaces.

This issue exists because the #228 catalog-discovery UX decision clarified the desired command model, but some of the broader command cleanup is cross-cutting and should not be silently folded into #228 if it exceeds official-catalog discovery.

Product decision

Normal users manage settings for apps/tools, not recipes. The normal command surface should be action-first:

dotfiles-manager list
dotfiles-manager search <query>
dotfiles-manager explain <app>
dotfiles-manager manage <app>
dotfiles-manager unmanage <app>
dotfiles-manager status [<app>...]
dotfiles-manager diff [<app>...]
dotfiles-manager sync [<app>...]
dotfiles-manager save [<app>...]
dotfiles-manager apply [<app>...]

Specialized namespaces remain:

dotfiles-manager catalog ...   # support sources/catalog lifecycle
dotfiles-manager recipe ...    # advanced recipe authoring/debugging

recipe must not be the normal-user discovery noun.

Draft work-item contract

Type: delivery/design cleanup.
Risk tier: Tier 1.
Reason: this changes user-facing CLI vocabulary, help output, examples, and compatibility behavior, but should not introduce new live-setting write authority.

Scope

  • Define and implement the canonical flattened command vocabulary for normal users.
  • Ensure list, search, and explain <app> are the normal discovery/explanation path.
  • Define manage as enrolling an app/tool into dotfiles-manager control without silently overwriting live settings.
  • Define unmanage as removing an app/tool from the default managed set without uninstalling the app, deleting live settings, or deleting stored settings.
  • Keep status, diff, sync, save, and apply top-level and app-filterable.
  • Decide compatibility behavior for existing command names such as add, recipe list, recipe explain, and app create/validate/test.
  • Keep catalog ... and recipe ... as umbrella commands for their specialized audiences.
  • Update CLI help, docs examples, and tests/fixtures affected by the vocabulary decision.

Non-goals

Design evidence required before implementation

  • CLI transcript or docs-first examples covering:
    • list with supported/managed state;
    • search <query> across enabled catalogs;
    • explain <app> with source/provenance/candidate information;
    • manage <app> safe enrollment and next steps;
    • unmanage <app> safe unenrollment with data left untouched;
    • app-filtered status, diff, sync, save, and apply;
    • compatibility/deprecation behavior for replaced commands.

Real-result verification required

  • Targeted CLI tests plus go test ./... unless a narrower test set is justified.
  • Temp-home/fixture command output proving the normal-user command flow.
  • Verification that command renames/aliases do not create new write authority or mutate real user settings.

Validation criteria

  • Normal help surfaces the flattened normal-user commands and does not teach recipe as the happy-path discovery noun.
  • manage and unmanage semantics are safe and clear.
  • status, diff, sync, save, and apply remain top-level and app-filterable.
  • Existing compatibility commands either keep working with clear advanced/legacy wording or are explicitly deprecated according to the accepted contract.
  • Tests and docs examples align with the accepted vocabulary.

Acceptance rule

Project Owner acceptance required before closing.

Notes

Created from the #228 managed change recorded at:
#228 (comment)

Project Execution Standards alignment

Latest standard read for this update: /Users/shpoont/Work/shpoont/project-execution-standards/project-execution-standard.md, last-updated 2026-06-29.

Project record / source of truth: #209 plus docs/internal/project/v2-reset-execution-record.md. This issue is a future CLI vocabulary work-item contract and does not override the active #228/#229/#230/#231 gates.

Current gate / no-go actions:

Closure rule:

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions