') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat(cli): rework command surface into hybrid grouping (#275) by jrob5756 · Pull Request #327 · microsoft/conductor · GitHub
Skip to content

feat(cli): rework command surface into hybrid grouping (#275) - #327

Merged
Jason Robert (jrob5756) merged 4 commits into
mainfrom
feature/275-cli-command-hybrid-grouping
Jul 21, 2026
Merged

feat(cli): rework command surface into hybrid grouping (#275)#327
Jason Robert (jrob5756) merged 4 commits into
mainfrom
feature/275-cli-command-hybrid-grouping

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Reworks the top-level CLI command surface into logical groups per #275:
group commands into help panels with new checkpoint/gate noun groups,
while keeping hot-path verbs (run, resume, validate, show, stop,
replay, update) flat and adding backward-compatible deprecated aliases
for gate-respond and checkpoints.

Changes

  • feat(cli): group commands into help panels with checkpoint/gate noun groups
  • test(cli): harden command-grouping tests and fix help-text accuracy

Closes#275.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

…groups
Rework the CLI command surface (issue #275): keep hot-path verbs flat while
moving the long tail under noun groups, organise --help into rich panels, and
keep existing invocations working via hidden deprecated aliases.
- Add a `checkpoint` group (`checkpoint list`) and a `gate` group
(`gate respond`) as Typer sub-apps modeled on the registry group, each with
a shared implementation function.
- Register the groups with rich_help_panel and panel all flat commands into
Author & Inspect / Run & Recover / Interact / State / Environment (doctor
lands in Environment alongside registry and update).
- Keep `checkpoints` and `gate-respond` as hidden aliases that warn on stderr
(removal in a future release) and forward to the shared implementations.
- Tests: add test_checkpoint / test_gate / test_help_panels, and repoint the
relocated checkpoints tests out of test_resume_command.
- Docs: update cli-reference, AGENTS, CHANGELOG, the conductor skill,
workflow-syntax, and the periodic-checkpoints example.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Address PR review feedback on the CLI hybrid-grouping change (#275):
- Width-pin checkpoint table assertions via an autouse fixture to prevent
narrow-terminal CI flakes (reproduced at COLUMNS=40)
- Add failure-path alias parity and argument-forwarding tests for the
deprecated checkpoints and gate-respond aliases
- Assert deprecation warnings route to stderr while data stays on stdout
- Assert each command maps to its correct rich_help_panel (structural check)
- Remove unused output_console in gate.py (module writes only to stderr)
- Correct the checkpoint list docstring (name the Trigger column; describe
the Agent column as the agent running or about to run) and the checkpoint
group help ("Inspect workflow checkpoints." — only list exists)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…rence
- AGENTS.md/CHANGELOG.md described the rich_help_panel order as Author &
Inspect / Run & Recover / Interact / State / Environment; the actual
rendered order (first-occurrence in the Click command list) is Run &
Recover / Author & Inspect / Environment / Interact / State. Verified via
CliRunner and corrected both docs.
- SKILL.md still referenced the old flat `checkpoints` command in one spot
while the rest of the file was updated to `checkpoint list`.
- Added tests for bare noun-group invocation (`gate`, `checkpoint` with no
subcommand exit 2 with usage) and each noun group's own `--help` text,
closing gaps flagged in code review.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756)force-pushed the feature/275-cli-command-hybrid-grouping branch from 4ae9ba4 to e514daeCompareJuly 21, 2026 18:31
@jrob5756
Jason Robert (jrob5756) marked this pull request as ready for review July 21, 2026 18:44
@jrob5756
Jason Robert (jrob5756) merged commit a7b9392 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the feature/275-cli-command-hybrid-grouping branch July 21, 2026 18:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Rework CLI command surface: hybrid grouping + deprecated aliases

1 participant

@jrob5756