Skip to content

CLI-GUI Parity

The CLI covers the repeatable execution path — operations you would script, automate, or run in CI. The GUI covers interactive setup and exploration — operations that benefit from file pickers, visual conflict resolution, or multi-step wizards.

Full CLI-GUI parity is not a goal. Every CLI command carries a maintenance cost (tests, help text, golden outputs, documentation). Commands only earn their place if they serve a scripting or automation use case.

This mirrors how established tools split their surfaces:

  • GitHub: gh CLI focuses on PRs, issues, CI checks — scriptable workflows. GitHub Desktop covers visual diff, merge conflict resolution, branch management.
  • Vercel: CLI owns deploy, env vars, rollbacks, promotion — the CI/CD pipeline. Dashboard owns domain config, analytics, team settings.
  • Supabase: CLI owns migrations, local dev, project provisioning — repeatability. Dashboard owns data exploration, schema editing.

The shared pattern: CLI = repeatable execution, GUI = interactive setup.

The matrix below defines the CLI-vs-GUI split for workflow delivery:

WorkflowDesktopCLIDocsNotes
course.listyesyesyes
course.loadyesyesyes
course.saveyesyesyesInternal save path for CLI repo operations
course.deleteyesyesManaged in GUI course settings flow
settings.loadAppyesyesyesInternal to CLI runtime
settings.saveAppyesyesyesInternal to course load context switch
connection.verifyLmsDraftyesyesyes
connection.listLmsCoursesDraftyesyesOne-time discovery during setup
connection.verifyGitDraftyesyesyes
roster.importFromFileyesyesFile picker + column mapping
roster.importFromLmsyesyesSetup-phase, done once per course
roster.exportMembersyesyesFile save dialog
groupSet.fetchAvailableFromLmsyesyesSetup-phase exploration
groupSet.connectFromLmsyesyesInteractive selection + linking
groupSet.syncFromLmsyesyesSetup-phase, done once per group set
groupSet.previewImportFromFileyesyesVisual diff before commit
groupSet.previewReimportFromFileyesyesVisual diff before commit
groupSet.exportyesyesFile save dialog
gitUsernames.importyesyesFile picker + verification dialog
validation.rosteryesyesyesCalled internally by validate
validation.assignmentyesyesyes
repo.createyesyesyes
repo.cloneyesyesyes
repo.updateyesyesyes
userFile.inspectSelectionyesyesFile picker dependent
userFile.exportPreviewyesyesFile save target dependent

These 10 commands serve scripting and automation:

CommandWorkflow(s)Rationale
course listcourse.listQuick context check, pipeable
course activesettings.loadAppShell scripts need active course ID
course showcourse.loadJSON dump for jq pipelines and debugging
course loadcourse.load, settings.saveAppContext switching for multi-course scripting
lms verifyconnection.verifyLmsDraftConnection gate before batch ops
git verifyconnection.verifyGitDraftConnection gate before batch ops
repo createrepo.createPrimary automation: --dry-run, --all, --groups, --template-path
repo clonerepo.cloneBulk grading: --layout, --target, --groups
repo updaterepo.updateTemplate PR push across repos
validatevalidation.roster, validation.assignmentPre-flight check, scriptable gate

File picker / file save dependent: roster.importFromFile, roster.exportMembers, groupSet.previewImportFromFile, groupSet.previewReimportFromFile, groupSet.export, gitUsernames.import, userFile.inspectSelection, userFile.exportPreview

Interactive conflict resolution: groupSet.connectFromLms — requires visual selection from fetched LMS data, then linking.

Multi-step wizard: settings.saveApp — multi-pane connection setup for LMS and Git providers.

These 9 commands are intentionally excluded because they are setup-phase operations, better served by the GUI:

CommandWhy dropped
course deleteRarely needed, never in automation
roster showcourse show | jq .roster provides the same data with more flexibility
lms list-coursesOne-time discovery during course setup
lms import-studentsDone once per course; GUI shows conflict resolution
lms import-groupsDone once per group set; GUI shows group mapping
lms cache listSetup-phase group set management
lms cache fetchSetup-phase exploration
lms cache refreshSetup-phase, same as import-groups
lms cache deleteSetup-phase cleanup with referential integrity checks

A workflow should only be added to CLI if:

  1. It can complete without interactive user input beyond flags and arguments.
  2. It serves a repeatable execution or automation use case (not one-time setup).