Back-merge v0.1.0-beta.1 from main into develop#20
Conversation
Expand README and add hero GIF recording guide
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Convert MetadataHelpProvider.GetRootHelp to generate markdown with ## headings, bullet lists, and backtick formatting - Fix CliHost.WriteRootFlag to render via MarkdownRenderer.RenderToAnsi instead of plain stdout.WriteLine - Fix HelpCommand.RunAsync to display markdown in a fullscreen Terminal.Gui Markdown viewer using RunnableWrapper - Add tests for --help ANSI output, help --cat, and MetadataHelpProvider markdown generation Fixes #5 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…on tests The help command's TUI viewer rendered empty content because Markdown.Text was set before the view was initialized/laid out. Following the pattern from gui-cs/clet's MarkdownClet, set the text inside the Initialized event handler on the containing Runnable. Also switches from RunnableWrapper to a plain Runnable with an embedded Markdown view — the help viewer is read-only and needs no result extraction. Adds integration tests using Application.Create()/Init(ansi) with StopAfterFirstIteration to verify: - The TUI renders without hanging - Driver contents contain expected command text - Subcommand help renders correctly - RenderCatAsync produces ANSI output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Help command and --help flag should render markdown
- Re-record docs/images/hero.gif using tuirec v0.4.0 with the example app - Rewrite README for clarity: add badges, a Why section, feature table, real JSON output example, contributing pointer, and cleaner structure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add hero GIF and polish README
* feat: help TUI viewer, markdown rendering, rename ExampleApp to greet - HelpCommand.RunAsync launches a TUI Markdown viewer (Runnable + Markdown + StatusBar) matching clet's pattern, instead of returning raw text in CommandResult - MetadataHelpProvider.GetRootHelp emits markdown (tables, headers) instead of plain text - CliHost.WriteRootFlag passes --help output through MarkdownRenderer.RenderToAnsi for ANSI-styled stdout - Rename examples/Terminal.Gui.Cli.ExampleApp to examples/greet with AssemblyName=greet - Add README.md for the greet example app - Add visual UI tests (CommandUiHarness + golden-file assertions) ported from clet's CletUiHarness pattern - Add MetadataHelpProviderTests and CliHost help rendering tests Closes #5 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix terminal encoding for ANSI rendering and add multiple help topics - Port clet's MarkdownHelpRenderer approach: set Console.OutputEncoding to UTF-8 before rendering, use a full TG ANSI driver with proper layout/draw cycle, and restore encoding afterward. Fixes garbled box-drawing chars. - Add FarewellCommand with --until option for navigation testing - Add embedded markdown help files (help.md, greet.md, farewell.md, info.md) - Configure EmbeddedMarkdownHelpProvider in greet example - Fix InfoCommand to properly launch TUI viewer (was returning text without calling app.RunAsync, causing terminal to hang until Enter pressed) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add default command support, help link navigation, and fix positional args - Add DefaultCommand option to CliHostOptions so bare args/options are retried as the default command (e.g. 'greet World' == 'greet greet World') - Refactor CliHost.RunAsync into DispatchCommandAsync/ExecuteCommandAsync - Add help:topic link navigation in HelpCommand via Markdown.LinkClicked - Add 'Back to main help' links in all sub-topic help files - Add help:command anchors in root help.md for topic navigation - Make GreetCommand and FarewellCommand accept positional args for name - Set greet example DefaultCommand = 'greet' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Port clet's BrowseBar with back/forward nav and syntax highlighting - Add BrowseBar (ported from clet) with back/forward history stacks, Ctrl+Left/Right shortcuts, and proper statusbar styling - Rewrite HelpCommand.RunAsync to match clet's HelpClet pattern: BrowseBar, LinkClicked handler, NavigateTo, viewport reset - Add TextMateSyntaxHighlighter for code block coloring - Add horizontal scrollbar to markdown view - Update golden file for new status bar layout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add visual help browser tests and greet example execution tests - HelpBrowserUiTests: proves BrowseBar back/forward arrows render, embedded help content displays, subcommand view shows options, and golden file assertion for the browser layout - GreetExampleTests: proves every documented example in the help files actually works (greet World, --formal Alice, farewell Bob, farewell --until tomorrow Bob, default command dispatch, etc.) - Add embedded help.md resource to integration test assembly - Total: 24 integration tests, 17 unit tests (41 total, all passing) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Escape markdown table cells in MetadataHelpProvider Pipe characters and newlines in command/option descriptions would break the generated markdown table structure. Add EscapeCell helper that replaces | with \| and collapses newlines to spaces. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use explicit type in collection expression for ReSharper compliance ReSharper cannot infer target type for 'new' inside collection expressions, so use explicit 'new CommandOptionDescriptor(...)' instead of 'new (...)'. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add SourceLink and symbol package support (#11) Enable source debugging and .snupkg generation for NuGet consumers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Back-merge main into develop (#13) * Plan: help command and --help flag should render markdown Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix help command and --help flag to render markdown - Convert MetadataHelpProvider.GetRootHelp to generate markdown with ## headings, bullet lists, and backtick formatting - Fix CliHost.WriteRootFlag to render via MarkdownRenderer.RenderToAnsi instead of plain stdout.WriteLine - Fix HelpCommand.RunAsync to display markdown in a fullscreen Terminal.Gui Markdown viewer using RunnableWrapper - Add tests for --help ANSI output, help --cat, and MetadataHelpProvider markdown generation Fixes #5 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix help TUI: set Markdown.Text in Initialized handler, add integration tests The help command's TUI viewer rendered empty content because Markdown.Text was set before the view was initialized/laid out. Following the pattern from gui-cs/clet's MarkdownClet, set the text inside the Initialized event handler on the containing Runnable. Also switches from RunnableWrapper to a plain Runnable with an embedded Markdown view — the help viewer is read-only and needs no result extraction. Adds integration tests using Application.Create()/Init(ansi) with StopAfterFirstIteration to verify: - The TUI renders without hanging - Driver contents contain expected command text - Subcommand help renders correctly - RenderCatAsync produces ANSI output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add hero GIF recording and polish README - Re-record docs/images/hero.gif using tuirec v0.4.0 with the example app - Rewrite README for clarity: add badges, a Why section, feature table, real JSON output example, contributing pointer, and cleaner structure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix MarkdownRenderer global state leaks (#14) * Plan: help command and --help flag should render markdown Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix help command and --help flag to render markdown - Convert MetadataHelpProvider.GetRootHelp to generate markdown with ## headings, bullet lists, and backtick formatting - Fix CliHost.WriteRootFlag to render via MarkdownRenderer.RenderToAnsi instead of plain stdout.WriteLine - Fix HelpCommand.RunAsync to display markdown in a fullscreen Terminal.Gui Markdown viewer using RunnableWrapper - Add tests for --help ANSI output, help --cat, and MetadataHelpProvider markdown generation Fixes #5 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix help TUI: set Markdown.Text in Initialized handler, add integration tests The help command's TUI viewer rendered empty content because Markdown.Text was set before the view was initialized/laid out. Following the pattern from gui-cs/clet's MarkdownClet, set the text inside the Initialized event handler on the containing Runnable. Also switches from RunnableWrapper to a plain Runnable with an embedded Markdown view — the help viewer is read-only and needs no result extraction. Adds integration tests using Application.Create()/Init(ansi) with StopAfterFirstIteration to verify: - The TUI renders without hanging - Driver contents contain expected command text - Subcommand help renders correctly - RenderCatAsync produces ANSI output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add hero GIF recording and polish README - Re-record docs/images/hero.gif using tuirec v0.4.0 with the example app - Rewrite README for clarity: add badges, a Why section, feature table, real JSON output example, contributing pointer, and cleaner structure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix MarkdownRenderer global state leaks - Save and restore DisableRealDriverIO env var in finally block - Move app.Init inside try/finally so cleanup runs if Init throws - Add MarkdownRendererTests verifying env var restoration - Disable test parallelization (Terminal.Gui uses global state) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: set IApplication.AppModel and defer Init() for inline input commands (#16) RunWithTerminalGuiAsync previously always called Init() regardless of whether the command actually uses the TUI. For inline input commands, Init() modifies terminal state (cursor save/scroll), and if the command returns without running the TUI event loop (e.g. greet hello), Dispose() restores the cursor to the wrong position, causing output to appear at incorrect rows. Fix: - Set app.AppModel on the IApplication instance (not the process-wide static) - Only call Init() upfront for fullscreen commands (viewers, --fullscreen) - For inline input commands, defer Init() to InputCommandRunner where the TUI is actually started via app.RunAsync() - Commands that compute and return without TUI (like greet) never trigger Init(), so terminal state is never modified Fixes #15 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: remove duplicate TestSetup class introduced by merge --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 73a1685b53
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| height = 24; | ||
| } | ||
|
|
There was a problem hiding this comment.
Centralize Terminal.Gui lifecycle in CliHost
This helper now creates and initializes a Terminal.Gui application outside CliHost, which violates specs/constitution.md C1: only CliHost may call Terminal.Gui lifecycle APIs. The new RenderToAnsi path is reachable from help --cat, root --help, and example viewer cat rendering, so lifecycle ownership is no longer centralized and future commands/helpers can bypass the host's initialization model.
Useful? React with 👍 / 👎.
| /// Alias of the default command to invoke when args don't match any registered command. | ||
| /// When set, bare positional args or unrecognized options are retried as args to this command. | ||
| /// </summary> | ||
| public string? DefaultCommand { get; set; } |
There was a problem hiding this comment.
Document DefaultCommand in the public API spec
Adding CliHostOptions.DefaultCommand changes the public API surface, but this commit does not update specs/library-spec.md. That violates specs/constitution.md C2, so consumers and governance docs will not reflect the new default-command dispatch semantics.
Useful? React with 👍 / 👎.
Addresses review feedback raised on the (bogus) back-merge PRs #20/#21 so this branch is the complete/correct source of truth: - Fix example project paths in README.md and examples/greet/README.md to the actual examples/greet location (PR #21 P2). The old examples/Terminal.Gui.Cli.ExampleApp / examples/Terminal.Gui.Cli.Greet paths no longer exist and produced project-not-found errors. - Document CliHostOptions.DefaultCommand dispatch semantics in specs/library-spec.md, satisfying constitution C2 (PR #20 P1). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Closing: develop already contains all of this content (via the original feature PRs and back-merge #13) — the commits differ only by SHA. A merge-tree against develop shows the only delta is src/Terminal.Gui.Cli/MarkdownRenderer.cs, where this branch carries the old lifecycle code that would conflict with / regress the C1 fix merged in #22. Also a strict subset of #21. |
Automatic back-merge after release v0.1.0-beta.1. Merge this to keep
developin sync withmain.