From 3287aaf7b498d71a352149774fc825f2b848d01e Mon Sep 17 00:00:00 2001 From: Tig Date: Tue, 23 Jun 2026 09:46:51 -0700 Subject: [PATCH] =?UTF-8?q?Rename=20internal=20references:=20gui-cs=20?= =?UTF-8?q?=E2=86=92=20tui-cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Org rename gui-cs → tui-cs. GitHub auto-redirects all github.com/gui-cs/* URLs; this updates internal references so the repo is self-consistent. Mechanical: every `gui-cs` (hyphen, the org login) → `tui-cs`. The historical brand `gui.cs` (dot) is left as-is. Machine-local absolute paths left untouched. Part of the org-wide gui-cs → tui-cs rename. Merge AFTER the org rename. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/README.md | 4 +- .github/workflows/release.yml | 6 +- CLAUDE.md | 2 +- Directory.Build.props | 6 +- README.md | 18 +++--- docs/runbooks/release-rollback.md | 22 +++---- scripts/CLET-COLOR-GIF.md | 2 +- scripts/CLET-HELP-GIF.md | 4 +- scripts/CLET-PICK-FILE-GIF.md | 6 +- specs/clet-spec.md | 62 +++++++++---------- specs/decisions.md | 28 ++++----- specs/press-release.md | 14 ++--- src/Clet/Clet.csproj | 4 +- src/Clet/Clets/Input/LinearRangeClet.cs | 2 +- src/Clet/Clets/Viewer/ConfigClet.cs | 6 +- src/Clet/Clets/Viewer/EditorClet.cs | 2 +- src/Clet/Help/help.md | 2 +- src/Clet/Help/overview.md | 2 +- .../ConfigCletIntegrationTests.cs | 4 +- tests/Clet.UITests/Goldens/config.ans | 6 +- tests/SPEC.md | 14 ++--- 22 files changed, 109 insertions(+), 109 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 121c616..566bfd2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -6,7 +6,7 @@ labels: bug > **Is this a Terminal.Gui core bug?** > If the issue is in rendering, a driver, a built-in View, or keybindings, it belongs in -> [`gui-cs/Terminal.Gui`](https://github.com/gui-cs/Terminal.Gui/issues). +> [`tui-cs/Terminal.Gui`](https://github.com/tui-cs/Terminal.Gui/issues). > Not sure? File here first. The clet maintainer will reproduce, isolate, and escalate > upstream if the root cause turns out to be in TG core (spec §2.1). diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 09363ef..45d44e6 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -57,7 +57,7 @@ resolve-version → build (3 RIDs) → tag → publish-nuget **NuGet:** Main publishes to package id `clet` (see [D-024](../../specs/decisions.md)). Prerelease versions (`-rc`) are hidden from default `dotnet tool install -g clet`; consumers opt in with `--prerelease`. -**Homebrew / WinGet:** Only on stable main releases (version has no `-` suffix). Both are placeholders until `gui-cs/homebrew-tap` exists and WinGet tooling is wired (D-012). +**Homebrew / WinGet:** Only on stable main releases (version has no `-` suffix). Both are placeholders until `tui-cs/homebrew-tap` exists and WinGet tooling is wired (D-012). ## Terminal.Gui versions @@ -77,7 +77,7 @@ Release builds reject Terminal.Gui or Terminal.Gui.Editor versions older than th | Name | Type | Used by | Purpose | |------|------|---------|---------| | `NUGET_API_KEY` | Secret | `publish-nuget` | Push packages to nuget.org | -| `HOMEBREW_TAP_TOKEN` | Secret | `publish-homebrew` | Push to `gui-cs/homebrew-tap` | +| `HOMEBREW_TAP_TOKEN` | Secret | `publish-homebrew` | Push to `tui-cs/homebrew-tap` | | `HOMEBREW_TAP_ENABLED` | Variable | `publish-homebrew` | Set to `true` to enable | | `WINGET_ENABLED` | Variable | `publish-winget` | Set to `true` to enable | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd4ef4b..e380c9d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,8 +10,8 @@ name: Release # # Triggers: # 1. Push to main that changes code -# 2. repository_dispatch from gui-cs/Terminal.Gui (any main-branch publish: rc, beta, stable) -# 3. repository_dispatch from gui-cs/Editor (any main-branch publish) +# 2. repository_dispatch from tui-cs/Terminal.Gui (any main-branch publish: rc, beta, stable) +# 3. repository_dispatch from tui-cs/Editor (any main-branch publish) # 4. Manual workflow_dispatch on: push: @@ -465,7 +465,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - repository: gui-cs/homebrew-tap + repository: tui-cs/homebrew-tap token: ${{ secrets.HOMEBREW_TAP_TOKEN }} - name: Download macOS artifacts diff --git a/CLAUDE.md b/CLAUDE.md index dd54535..081196d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ The repo intentionally splits "design intent" from "current code" from "queued c - **`specs/clet-spec.md`** — authoritative design document. Planned clets, exit code semantics, JSON schema (§4.3 + §4.3.1 versioning + §4.3.2 per-clet shapes), milestone roadmap (§7), risks (§8), open questions (§9), auto-discovery exploration (§11). Where the spec and current code diverge, the decisions log says why. **§6 (Testing) is a thin pointer** to `tests/SPEC.md`. - **`tests/SPEC.md`** — authoritative testing strategy. Nine test layers, tier matrix (which layers run when), per-layer cases, harness shapes, golden-file conventions. Lives next to the test projects so it stays in sync. The main spec defers to it for everything in `tests/`. - **`specs/decisions.md`** — historical log of cross-cutting decisions. **Read-only reference** — do not append new entries. New design rationale goes in the PR description instead. Existing entries are still useful context for understanding *why* something was built a certain way (e.g. D-006 for the hand-rolled parser, D-007 for deferred TUIcast). -- **[Bar-raise backlog issue #11](https://github.com/gui-cs/clet/issues/11)** (label `bar-raise`) — critique that's been raised, considered, and *not yet* acted on. Before claiming a section is "done," check the backlog for queued items in that area. New design pushback goes there, not into a side conversation. +- **[Bar-raise backlog issue #11](https://github.com/tui-cs/clet/issues/11)** (label `bar-raise`) — critique that's been raised, considered, and *not yet* acted on. Before claiming a section is "done," check the backlog for queued items in that area. New design pushback goes there, not into a side conversation. - **`docs/runbooks/release-rollback.md`** — operational runbook for withdrawing a bad release across Homebrew/WinGet/NuGet. Draft until exercised at v0.9. ### Doc-update gate for every PR diff --git a/Directory.Build.props b/Directory.Build.props index 0841900..68f7050 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -8,9 +8,9 @@ true true - gui-cs - gui-cs - Copyright (c) gui-cs and contributors + tui-cs + tui-cs + Copyright (c) tui-cs and contributors 2.4.5 diff --git a/README.md b/README.md index d6a5f84..2c20396 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,8 @@ Works for humans and AI agents alike. ### Release (not available until v1.0 is released) ```sh -brew install gui-cs/tap/clet # macOS / Linux -winget install gui-cs.clet # Windows 10/11 +brew install tui-cs/tap/clet # macOS / Linux +winget install tui-cs.clet # Windows 10/11 dotnet tool install -g clet # any platform with .NET SDK ``` @@ -143,7 +143,7 @@ Exit codes: ## RC feedback -clet is in **release candidate** status ([milestone tracker](https://github.com/gui-cs/clet/issues/33)). If something doesn't work, looks wrong, or is just confusing, **[file an issue](https://github.com/gui-cs/clet/issues/new)**. Include: +clet is in **release candidate** status ([milestone tracker](https://github.com/tui-cs/clet/issues/33)). If something doesn't work, looks wrong, or is just confusing, **[file an issue](https://github.com/tui-cs/clet/issues/new)**. Include: - `clet --version` output (e.g. `1.0.0-rc.3 (Terminal.Gui 2.0.2-develop.37)`). - Your terminal + OS (e.g. "Windows Terminal on Windows 11", "iTerm2 on macOS 15"). @@ -228,7 +228,7 @@ Here's `clet color` with the Anders theme applied: ![clet color with Anders theme](./docs/images/clet-color.gif) -All clets render with the `Base` color scheme, so customizing `Base` controls every clet's appearance. See the [Terminal.Gui Configuration docs](https://gui-cs.github.io/Terminal.Gui/docs/configuration.html) for the full schema. +All clets render with the `Base` color scheme, so customizing `Base` controls every clet's appearance. See the [Terminal.Gui Configuration docs](https://tui-cs.github.io/Terminal.Gui/docs/configuration.html) for the full schema. ### Q: Key bindings? @@ -256,11 +256,11 @@ Releases from `main` publish prerelease packages to NuGet (versioned `1.x.y-rc.N ### Q: How do I report a bug or give feedback? -[File an issue](https://github.com/gui-cs/clet/issues/new). That's the only feedback channel — no Discussions, no forum. See the [RC feedback](#rc-feedback) section above for what to include. +[File an issue](https://github.com/tui-cs/clet/issues/new). That's the only feedback channel — no Discussions, no forum. See the [RC feedback](#rc-feedback) section above for what to include. ## Native binaries install -Every [GitHub release](https://github.com/gui-cs/clet/releases) ships standalone NativeAOT binaries for the three primary platforms. **No .NET runtime required** — single-file executable, ~20 MB, cold-start in tens of milliseconds. +Every [GitHub release](https://github.com/tui-cs/clet/releases) ships standalone NativeAOT binaries for the three primary platforms. **No .NET runtime required** — single-file executable, ~20 MB, cold-start in tens of milliseconds. | Platform | Asset | |---|---| @@ -273,7 +273,7 @@ Every [GitHub release](https://github.com/gui-cs/clet/releases) ships standalone **macOS (Apple Silicon):** ```sh # Replace with the release tag, e.g. 1.0.0-develop.41 -curl -LO https://github.com/gui-cs/clet/releases/latest/download/clet--osx-arm64.tar.gz +curl -LO https://github.com/tui-cs/clet/releases/latest/download/clet--osx-arm64.tar.gz tar -xzf clet--osx-arm64.tar.gz xattr -d com.apple.quarantine ./clet # clear Gatekeeper quarantine sudo mv clet /usr/local/bin/ @@ -282,7 +282,7 @@ clet --version **Linux x64:** ```sh -curl -LO https://github.com/gui-cs/clet/releases/latest/download/clet--linux-x64.tar.gz +curl -LO https://github.com/tui-cs/clet/releases/latest/download/clet--linux-x64.tar.gz tar -xzf clet--linux-x64.tar.gz chmod +x ./clet sudo mv clet /usr/local/bin/ @@ -292,7 +292,7 @@ clet --version **Windows x64 (PowerShell):** ```powershell # Replace with the release tag -Invoke-WebRequest -Uri "https://github.com/gui-cs/clet/releases/latest/download/clet--win-x64.zip" -OutFile clet.zip +Invoke-WebRequest -Uri "https://github.com/tui-cs/clet/releases/latest/download/clet--win-x64.zip" -OutFile clet.zip Expand-Archive clet.zip -DestinationPath $env:USERPROFILE\bin\clet # Add $env:USERPROFILE\bin\clet to your PATH, then: clet --version diff --git a/docs/runbooks/release-rollback.md b/docs/runbooks/release-rollback.md index cd8e307..d1d5b28 100644 --- a/docs/runbooks/release-rollback.md +++ b/docs/runbooks/release-rollback.md @@ -2,12 +2,12 @@ > **Status:** DRAFT — exercised once before v0.9 RC per `specs/clet-spec.md` §7. Until that exercise has happened, treat every step here as "best guess; verify before executing." -> **Audience:** the maintainer paged at 3am for a `clet` release that escaped the §5.3 smoke gate. Assume you did not ship the bad release. Assume you have repo-admin on `gui-cs/clet`, push access to `gui-cs/homebrew-tap`, the WinGet PR-author cred, and the NuGet API key in a known location. +> **Audience:** the maintainer paged at 3am for a `clet` release that escaped the §5.3 smoke gate. Assume you did not ship the bad release. Assume you have repo-admin on `tui-cs/clet`, push access to `tui-cs/homebrew-tap`, the WinGet PR-author cred, and the NuGet API key in a known location. `clet` auto-publishes from the `main` release workflow: - **Prerelease phase** (`-rc` suffix from `src/Clet/Clet.csproj`): NuGet `clet` prerelease only (off `latest`; opt-in via `--prerelease`). See [D-024](../../specs/decisions.md) for the package id. -- **Stable phase** (no `-` suffix in version): NuGet `clet` (latest), Homebrew (gui-cs tap), WinGet (`microsoft/winget-pkgs`). +- **Stable phase** (no `-` suffix in version): NuGet `clet` (latest), Homebrew (tui-cs tap), WinGet (`microsoft/winget-pkgs`). When the §5.3 smoke gate fails, the workflow halts and nothing reaches users — that case is an *aborted* release, not a *bad* release, and is out of scope for this runbook. This runbook covers the case where the gate let something through (a regression it didn't cover, a manifest bug, a signing failure mid-publish) and one or more channels carry a broken `clet`. @@ -28,17 +28,17 @@ If you are not sure, rollback. Re-publishing later is cheap; pulling back a bad > Run withdrawals **in parallel** if you have help. Each channel is independent; nothing here serializes. -### 2.1 Homebrew tap (`gui-cs/homebrew-tap`) +### 2.1 Homebrew tap (`tui-cs/homebrew-tap`) **What happens to users:** Already-installed bad version stays on the user's machine until they `brew upgrade`. After withdrawal, `brew upgrade clet` resolves to the prior-known-good version. **Steps:** -1. `git clone https://github.com/gui-cs/homebrew-tap` +1. `git clone https://github.com/tui-cs/homebrew-tap` 2. Identify the commit that bumped `clet.rb` to the bad version. 3. **`git revert `** — never `--force` push, never `reset --hard`. The revert preserves the audit trail and re-pins to the prior version's bottle URLs and SHA256s. 4. `git push origin main` (or whatever the tap's default branch is). -5. Verify: on a fresh runner, `brew update && brew info gui-cs/tap/clet` should report the prior version. +5. Verify: on a fresh runner, `brew update && brew info tui-cs/tap/clet` should report the prior version. 6. Optional: post a one-liner to the tap repo's Discussions explaining the revert. **Caveat:** Homebrew bottles are immutable on GitHub Releases by URL. The bad bottle URL still resolves; it's just no longer pointed to. If you need the bad bottle file *gone* (license/security reason), delete the asset from the GitHub Release manually — but `brew install` will then 404 for anyone who has the old formula in cache. @@ -50,12 +50,12 @@ If you are not sure, rollback. Re-publishing later is cheap; pulling back a bad **Steps:** 1. Fork `microsoft/winget-pkgs` if you don't already have a fork. -2. Delete the directory `manifests/g/gui-cs/clet//` from the fork. -3. Open a PR titled `Remove gui-cs.clet (broken release)` with a one-paragraph explanation. +2. Delete the directory `manifests/g/tui-cs/clet//` from the fork. +3. Open a PR titled `Remove tui-cs.clet (broken release)` with a one-paragraph explanation. 4. Microsoft's bot validates and merges if the manifest removal is clean. **Typical SLA: 2–24 hours.** There is no faster path; WinGet does not have an emergency-yank API. 5. Verify post-merge: `winget search clet` should no longer list the bad version. -**While the PR is pending,** consider posting a GitHub Release note on `gui-cs/clet` warning Windows users not to upgrade. +**While the PR is pending,** consider posting a GitHub Release note on `tui-cs/clet` warning Windows users not to upgrade. ### 2.3 NuGet (`clet`) @@ -63,7 +63,7 @@ If you are not sure, rollback. Re-publishing later is cheap; pulling back a bad **Steps:** -1. Sign in to `https://www.nuget.org` with the gui-cs account. +1. Sign in to `https://www.nuget.org` with the tui-cs account. 2. Navigate to `Manage Packages → clet → `. 3. Click **Unlist** and confirm. (`dotnet nuget delete` is a list-only op, equivalent — use the web UI for the audit trail.) 4. Verify: `dotnet tool search clet` should not surface the bad version. @@ -87,7 +87,7 @@ Once channels are withdrawn (or while the WinGet PR is pending): Within 48 hours of stabilization: -1. File an issue in `gui-cs/clet` titled `Incident: rollback`. Tag `incident`. Include: timeline (UTC), trigger, blast radius (channels affected, estimated user count if available), root cause, fix. +1. File an issue in `tui-cs/clet` titled `Incident: rollback`. Tag `incident`. Include: timeline (UTC), trigger, blast radius (channels affected, estimated user count if available), root cause, fix. 2. Add the failure mode as a new case to `tests/Clet.SmokeTests` (so a future regression of the same shape is caught) and to the §6.8 release-pipeline dry-run cases (so a future pipeline regression of the same shape is caught). 3. If a runbook step here was wrong or missing, **edit this file** in the same PR. The runbook must end the incident better than it started it. @@ -102,7 +102,7 @@ Within 48 hours of stabilization: ## Open questions (resolve before v0.9) - **Tag scheme for rollback patches** (see §3 step 3 above). -- **On-call rotation.** Who carries the pager during release weeks? `gui-cs` does not currently have a rotation; until it does, "the person who tagged the TG release" is the de facto owner. +- **On-call rotation.** Who carries the pager during release weeks? `tui-cs` does not currently have a rotation; until it does, "the person who tagged the TG release" is the de facto owner. - **Paging channel.** GitHub release-issue auto-comment is not a pager. Matrix? Discord? Email-to-SMS? Decide and document here. - **WinGet emergency contact.** Is there a faster path for Microsoft-bot-merged manifest removal in a security incident? Investigate before v0.9. - **Asciinema artifact retention.** TUIcast captures a `.cast` per smoke run (§5.3). Retention policy? Indefinitely is cheap; document explicitly so post-incident replays are guaranteed available. diff --git a/scripts/CLET-COLOR-GIF.md b/scripts/CLET-COLOR-GIF.md index f094c09..c84ad6f 100644 --- a/scripts/CLET-COLOR-GIF.md +++ b/scripts/CLET-COLOR-GIF.md @@ -4,7 +4,7 @@ Produces `docs/images/clet-color.gif` — an animated GIF demonstrating clet's c ## Prerequisites -- [tuirec](https://github.com/gui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/gui-cs/tuirec/cmd/tuirec@latest`) +- [tuirec](https://github.com/tui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/tui-cs/tuirec/cmd/tuirec@latest`) - .NET 10 SDK (for building clet) - `agg` is auto-downloaded by tuirec on first use diff --git a/scripts/CLET-HELP-GIF.md b/scripts/CLET-HELP-GIF.md index 48812fa..ae97012 100644 --- a/scripts/CLET-HELP-GIF.md +++ b/scripts/CLET-HELP-GIF.md @@ -4,7 +4,7 @@ Produces `docs/images/clet-help.gif` — a high-quality animated GIF demonstrati ## Prerequisites -- [tuirec](https://github.com/gui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/gui-cs/tuirec/cmd/tuirec@latest`) +- [tuirec](https://github.com/tui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/tui-cs/tuirec/cmd/tuirec@latest`) - .NET 10 SDK (for building clet) - `agg` is auto-downloaded by tuirec on first use @@ -79,4 +79,4 @@ Copy-Item recording.gif ./docs/images/clet-help.gif -Force 3. **Viewport not scrolling**: Use PageDown/PageUp. CursorDown does NOT scroll — it cycles focus between links. 4. **Recording too long**: Reduce `wait:` values. The demo should be ~9s at keystroke-delay 80. 5. **GIF too large**: At 100×30, expect ~0.3-0.5 MB. Reduce `--cols` to 80 for a smaller file. -6. **Viewport starts at bottom**: Known TG bug (gui-cs/Terminal.Gui#5365). The workaround in HelpClet resets viewport on initial render. +6. **Viewport starts at bottom**: Known TG bug (tui-cs/Terminal.Gui#5365). The workaround in HelpClet resets viewport on initial render. diff --git a/scripts/CLET-PICK-FILE-GIF.md b/scripts/CLET-PICK-FILE-GIF.md index a56d8fe..a4e73f3 100644 --- a/scripts/CLET-PICK-FILE-GIF.md +++ b/scripts/CLET-PICK-FILE-GIF.md @@ -4,7 +4,7 @@ Produces `docs/images/clet-pick-file.gif` — an animated GIF demonstrating clet ## Prerequisites -- [tuirec](https://github.com/gui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/gui-cs/tuirec/cmd/tuirec@latest`) +- [tuirec](https://github.com/tui-cs/tuirec) v0.3.4+ on PATH (`go install github.com/tui-cs/tuirec/cmd/tuirec@latest`) - .NET 10 SDK (for building clet) - `agg` is auto-downloaded by tuirec on first use @@ -31,7 +31,7 @@ $binary = "./src/Clet/bin/Debug/net10.0/Clet.exe" $ks = 'wait:1500,Tab,Tab,Tab,wait:300,`r`,wait:250,`e`,wait:250,`a`,wait:600,Shift+Tab,wait:400,`r`,wait:400,Enter' # Use 80×20 for a compact look (closer to inline feel). -# True inline rendering requires tuirec support — see gui-cs/tuirec#49. +# True inline rendering requires tuirec support — see tui-cs/tuirec#49. tuirec record ` --binary $binary ` --args "pick-file" ` @@ -64,7 +64,7 @@ Copy-Item recording.gif ./docs/images/clet-pick-file.gif -Force - **Tab order**: The pick-file view has multiple focusable areas. Tab×3 reaches the filter field from the initial table focus. - **Filter field**: Typing in the filter field narrows the file list in real-time. - **Jump-select**: In the table, typing a character jumps to the first entry starting with that character. -- **Terminal size**: 80×20 for a compact look that's closer to inline rendering. True inline support depends on gui-cs/tuirec#49. +- **Terminal size**: 80×20 for a compact look that's closer to inline rendering. True inline support depends on tui-cs/tuirec#49. - **Drain**: Use `--drain 1500` to capture the command-line output after the app exits. ## Troubleshooting diff --git a/specs/clet-spec.md b/specs/clet-spec.md index 802bbb5..6205117 100644 --- a/specs/clet-spec.md +++ b/specs/clet-spec.md @@ -1,6 +1,6 @@ # `clet` Implementation Spec -**Status:** draft v0.5 · companion to the PR/FAQ in [issue #5155](https://github.com/gui-cs/Terminal.Gui/issues/5155) +**Status:** draft v0.5 · companion to the PR/FAQ in [issue #5155](https://github.com/tui-cs/Terminal.Gui/issues/5155) This is the implementation spec. It assumes the PR/FAQ is broadly accepted and covers what to build, where it lives, what changes in Terminal.Gui to support it, how it ships, and how it's tested. @@ -8,10 +8,10 @@ This is the implementation spec. It assumes the PR/FAQ is broadly accepted and c ### In scope (v1.0) -- New repo `gui-cs/clet` containing all clet code: abstractions, registry, JSON, built-in clets, CLI binary, release automation. -- Targeted changes to `gui-cs/Terminal.Gui` core (§3) that benefit TG generally and unblock clet specifically. +- New repo `tui-cs/clet` containing all clet code: abstractions, registry, JSON, built-in clets, CLI binary, release automation. +- Targeted changes to `tui-cs/Terminal.Gui` core (§3) that benefit TG generally and unblock clet specifically. - Fourteen input clets and one browser clet (`md`) statically registered in v1.0. -- Native installer channels: Homebrew (gui-cs tap), WinGet, .NET tool. NativeAOT for native channels. +- Native installer channels: Homebrew (tui-cs tap), WinGet, .NET tool. NativeAOT for native channels. - Independent SemVer; major version tied to `schemaVersion` changes per §4.3.1 (see [D-022](decisions.md)). - JSON output contract (schemaVersion 1). - Inline input rendering; alt-screen viewer rendering. @@ -31,13 +31,13 @@ This is the implementation spec. It assumes the PR/FAQ is broadly accepted and c Two repos. One assembly that matters (the CLI exe). One release cadence. ``` -gui-cs/Terminal.Gui gui-cs/clet +tui-cs/Terminal.Gui tui-cs/clet ├── Terminal.Gui/ ├── src/ │ (core; §3 tweaks land here, │ └── Clet/ │ no clet-specific types) │ Abstractions/ (IClet, ICletRegistry, ...) ├── Tests/ │ Registry/ │ (TG core tests only; │ Json/ (CletJsonContext, SchemaV1) -│ clet tests live in gui-cs/clet) │ Clets/Input/ (14 input clets) +│ clet tests live in tui-cs/clet) │ Clets/Input/ (14 input clets) └── .github/workflows/ │ Clets/Viewer/ (MarkdownClet) notify-clet-on-release.yml (NEW) │ Hosting/ (Program.cs, CLI parser) │ Help/ (overview.md) @@ -70,21 +70,21 @@ All of (3)+(4) is plain Terminal.Gui hosting against TG's public API. The clet i ### 2.1 Ownership -**TG core** (rendering, drivers, Views, keybindings) → `gui-cs/Terminal.Gui` maintainers. -**CLI host, registry, JSON envelope, packaging, clets** → `gui-cs/clet` maintainers. -**Cross-repo bugs** file in `gui-cs/clet` first; the clet maintainer reproduces, isolates, and escalates upstream if the root cause is in TG core. +**TG core** (rendering, drivers, Views, keybindings) → `tui-cs/Terminal.Gui` maintainers. +**CLI host, registry, JSON envelope, packaging, clets** → `tui-cs/clet` maintainers. +**Cross-repo bugs** file in `tui-cs/clet` first; the clet maintainer reproduces, isolates, and escalates upstream if the root cause is in TG core. ## 3. Terminal.Gui Changes Required All prerequisite TG changes have landed on `develop`: -- **Inline rendering** — shipping and exercised by `md`, the inline examples, and `gui-cs/ai`. +- **Inline rendering** — shipping and exercised by `md`, the inline examples, and `tui-cs/ai`. - **AOT compatibility** — tracked in TG core; remaining issues surface by building/running `clet`. - **`ConfigurationManager`** path-based loading — broadly used and tested. - **`Markdown` View** — vetted for the read-only, dismissable, themed shape clet needs. - **Terminal-driver inline-capable detection** — in place. -- **`Application.RunAsync(Toplevel, CancellationToken)`** ([#5157](https://github.com/gui-cs/Terminal.Gui/issues/5157)) — landed. Clet binds directly. -- **`FileDialog` typed result** ([#5158](https://github.com/gui-cs/Terminal.Gui/issues/5158)) — landed as `Dialog?>`. +- **`Application.RunAsync(Toplevel, CancellationToken)`** ([#5157](https://github.com/tui-cs/Terminal.Gui/issues/5157)) — landed. Clet binds directly. +- **`FileDialog` typed result** ([#5158](https://github.com/tui-cs/Terminal.Gui/issues/5158)) — landed as `Dialog?>`. clet builds against the TG version named by `` in `src/Clet/Clet.csproj`; the release workflow overrides it from the dispatch payload. See [D-020](decisions.md). @@ -96,14 +96,14 @@ On cancel, clet emits `{"schemaVersion":1,"status":"cancelled"}` and nothing els `FileDialog` inherits from `Dialog?>`. The `pick-file` and `pick-directory` clets bind to this directly. The §4.3.2 per-clet `value` shape table specifies the resulting JSON wire format (string for single-select, array of strings for `--multi`). -## 4. `gui-cs/clet` Repo +## 4. `tui-cs/clet` Repo This repo holds everything: abstractions, registry, JSON, built-in clets, the CLI binary, and release automation. One assembly is published; everything else is build-time only or test-only. ### 4.1 Project layout ``` -gui-cs/clet/ +tui-cs/clet/ ├── Clet.slnx ├── src/ │ └── Clet/ (single Exe; PublishAot=true; net10.0) @@ -174,7 +174,7 @@ All types are `internal` to the `Clet` assembly in v1.0. v2 may extract them to ```json { - "$id": "https://gui-cs.github.io/clet/schema/v1.json", + "$id": "https://tui-cs.github.io/clet/schema/v1.json", "type": "object", "required": ["schemaVersion", "status"], "properties": { @@ -279,7 +279,7 @@ clet --version **`--no-browse` (disable browser mode).** When `--no-browse` is passed to `md`, clicking local `.md` links shows the URL in the status bar instead of navigating. By default, `md` runs as a browser: following local links navigates to them with a back/forward history stack (Ctrl+Left / Ctrl+Right or ← → buttons in the status bar), and fragment anchors (`file.md#heading`) scroll to the matching heading. -**`--output ` / `-o ` (file output).** Writes a successful clet result (plain text or JSON) to the specified file instead of stdout. `OutputFormatter` creates the file with non-overwriting semantics; existing paths are refused rather than truncated, including paths that are symlinks. Non-success results are not written to the output file and are emitted through the normal stdout/stderr paths. This works around the Terminal.Gui limitation where stdout redirection (`$()`, `|`, `>`) swallows the TUI (see gui-cs/Terminal.Gui#5207). If the file cannot be written, an error is emitted to stderr and the process exits with code 2. See [D-028](decisions.md). +**`--output ` / `-o ` (file output).** Writes a successful clet result (plain text or JSON) to the specified file instead of stdout. `OutputFormatter` creates the file with non-overwriting semantics; existing paths are refused rather than truncated, including paths that are symlinks. Non-success results are not written to the output file and are emitted through the normal stdout/stderr paths. This works around the Terminal.Gui limitation where stdout redirection (`$()`, `|`, `>`) swallows the TUI (see tui-cs/Terminal.Gui#5207). If the file cannot be written, an error is emitted to stderr and the process exits with code 2. See [D-028](decisions.md). **Input-size caps.** `--initial` is capped at 64 K characters (code units) after alias resolution; unknown aliases remain usage errors rather than being reported as oversized-input validation failures. `clet md` stdin is capped at 8 M characters. On exceed for known aliases/content paths: exit 65, error code `input-too-large`, JSON envelope `{"schemaVersion":1,"status":"error","code":"input-too-large","message":"..."}`. These caps prevent OOM from untrusted piped input (see Appendix A). Per-clet options (`-- `) are not yet capped; tracked as a follow-up. @@ -318,7 +318,7 @@ Target binary size: ~8MB. Cold-start budget: <100ms on Apple Silicon, <100ms on ### 5.1 Trigger -`gui-cs/Terminal.Gui` and `gui-cs/Editor` fire `repository_dispatch` events to `gui-cs/clet` for main-branch package publishes (`tg-main-published` and `editor-main-published`). Develop-package dispatches do not publish clet builds. +`tui-cs/Terminal.Gui` and `tui-cs/Editor` fire `repository_dispatch` events to `tui-cs/clet` for main-branch package publishes (`tg-main-published` and `editor-main-published`). Develop-package dispatches do not publish clet builds. Additionally, the release workflow fires on pushes to clet's own main branch (changes in `src/` or `tests/`) and manual `workflow_dispatch`. @@ -330,7 +330,7 @@ The actual workflow is `.github/workflows/release.yml`. It builds AOT binaries f Before any publish step, every built binary runs a smoke matrix. The gate is process-level: it spawns the AOT'd binary, drives it from outside, and asserts on exit code + stdout JSON. -**Driver:** [`gui-cs/TUIcast`](https://github.com/gui-cs/TUIcast) in deterministic-script mode. TUIcast spawns the binary inside a PTY, writes keystrokes to the PTY fd, and captures an asciinema stream. Deterministic mode takes a comma-separated keystroke script (`"wait:500,ArrowDown,Enter"`). +**Driver:** [`tui-cs/TUIcast`](https://github.com/tui-cs/TUIcast) in deterministic-script mode. TUIcast spawns the binary inside a PTY, writes keystrokes to the PTY fd, and captures an asciinema stream. Deterministic mode takes a comma-separated keystroke script (`"wait:500,ArrowDown,Enter"`). **Cases:** @@ -353,9 +353,9 @@ After all matrix jobs and smoke tests pass. Channel determines which publish ste | Prerelease | push to `main`, main-branch TG/Editor dispatch, or manual dispatch while `` has `-rc` | prerelease | — | — | | Stable | push to `main`, main-branch TG/Editor dispatch, or manual dispatch while `` has no prerelease suffix | stable | build-from-source | manifest PR | -**.NET tool** (NuGet) — follows the [mdv](https://github.com/gui-cs/mdv) pattern: `true`, `clet`, `clet` on `src/Clet/Clet.csproj`. Install: `dotnet tool install -g clet`. See [D-019](decisions.md) (packaging) and [D-024](decisions.md) (package id). +**.NET tool** (NuGet) — follows the [mdv](https://github.com/tui-cs/mdv) pattern: `true`, `clet`, `clet` on `src/Clet/Clet.csproj`. Install: `dotnet tool install -g clet`. See [D-019](decisions.md) (packaging) and [D-024](decisions.md) (package id). -**Homebrew tap** (`gui-cs/homebrew-tap`) — release channel only. Build-from-source formula per [D-012](decisions.md). +**Homebrew tap** (`tui-cs/homebrew-tap`) — release channel only. Build-from-source formula per [D-012](decisions.md). **WinGet** (PR to `microsoft/winget-pkgs`) — release channel only. Unsigned binary with SmartScreen warning acceptable for early adopters per [D-012](decisions.md). @@ -379,7 +379,7 @@ clet maintains its own SemVer, independent of Terminal.Gui's version. Major bump Full testing strategy lives in [`tests/SPEC.md`](../tests/SPEC.md). Summary: - **Nine test layers**, each with a clear "what does this catch" purpose. Three harness families: in-process logic (no `Application.Init`), in-process UI (`IApplication` + `InputInjection` + `Driver.Contents` snapshots, frame-stepped), process-level (TUIcast over PTY). -- The **four-terminal manual matrix** ([#23](https://github.com/gui-cs/clet/issues/23)) is the v0.5 gate. +- The **four-terminal manual matrix** ([#23](https://github.com/tui-cs/clet/issues/23)) is the v0.5 gate. - The **JSON contract tests** are the schema-lock guard (`SchemaV1`). - The **smoke tests** are the release gate. @@ -389,13 +389,13 @@ Schedule follows TG releases, not a calendar. | Milestone | Tracking | Exit criteria | |-----------|----------|---------------| -| **v0.1 alpha** | [#2](https://github.com/gui-cs/clet/issues/2) | Repo bootstrapped; abstractions, registry, JSON in place; `select` clet working in unit + integration tests. No runnable binary — see v0.11. | -| **v0.11** | [#9](https://github.com/gui-cs/clet/issues/9) | Runnable binary. CLI host per §4.6/§4.7. `clet --help` / `--version` / `help ` / `list --json` / ` --json` work end-to-end. Process-level smoke harness (Process.Start-based; TUIcast keystroke harness deferred to v0.3 — [D-007](decisions.md)). | -| **v0.3 alpha** | [#3](https://github.com/gui-cs/clet/issues/3) | All 14 input clets functional. JSON schema drafted. AOT publish green. TUIcast keystroke harness wired up. | -| **v0.5 beta** | [#4](https://github.com/gui-cs/clet/issues/4) | Naming/schema/exit-codes locked; inline rendering verified on four-terminal matrix; `Markdown` View integration verified; threat model published (`docs/threat-model.md`); `dotnet tool install -g clet` works locally ([D-019](decisions.md), [D-024](decisions.md)); main-channel rc workflow proven. Release-tag trigger proof and Homebrew/WinGet draft manifests moved to v0.9 RC. | -| **v0.75 rc** | [#33](https://github.com/gui-cs/clet/issues/33) | Friends-and-family rc. >=5 external testers; >=3 Issues filed by non-maintainers; maintainer dogfooding for >=2 weeks; >=1 AI agent harness consuming `--json`; all P0 rc bugs resolved or deferred. | -| **v0.9 RC** | [#5](https://github.com/gui-cs/clet/issues/5) | All §6 test layers passing. Release workflow proven against a real TG release. Homebrew formula + WinGet manifest in working-draft form. One real release cycle exercised. Rollback runbook exercised once. | -| **v1.0 GA** | [#6](https://github.com/gui-cs/clet/issues/6) | Tied to TG v2 GA. Brew, WinGet, NuGet channels live. Documentation published. | +| **v0.1 alpha** | [#2](https://github.com/tui-cs/clet/issues/2) | Repo bootstrapped; abstractions, registry, JSON in place; `select` clet working in unit + integration tests. No runnable binary — see v0.11. | +| **v0.11** | [#9](https://github.com/tui-cs/clet/issues/9) | Runnable binary. CLI host per §4.6/§4.7. `clet --help` / `--version` / `help ` / `list --json` / ` --json` work end-to-end. Process-level smoke harness (Process.Start-based; TUIcast keystroke harness deferred to v0.3 — [D-007](decisions.md)). | +| **v0.3 alpha** | [#3](https://github.com/tui-cs/clet/issues/3) | All 14 input clets functional. JSON schema drafted. AOT publish green. TUIcast keystroke harness wired up. | +| **v0.5 beta** | [#4](https://github.com/tui-cs/clet/issues/4) | Naming/schema/exit-codes locked; inline rendering verified on four-terminal matrix; `Markdown` View integration verified; threat model published (`docs/threat-model.md`); `dotnet tool install -g clet` works locally ([D-019](decisions.md), [D-024](decisions.md)); main-channel rc workflow proven. Release-tag trigger proof and Homebrew/WinGet draft manifests moved to v0.9 RC. | +| **v0.75 rc** | [#33](https://github.com/tui-cs/clet/issues/33) | Friends-and-family rc. >=5 external testers; >=3 Issues filed by non-maintainers; maintainer dogfooding for >=2 weeks; >=1 AI agent harness consuming `--json`; all P0 rc bugs resolved or deferred. | +| **v0.9 RC** | [#5](https://github.com/tui-cs/clet/issues/5) | All §6 test layers passing. Release workflow proven against a real TG release. Homebrew formula + WinGet manifest in working-draft form. One real release cycle exercised. Rollback runbook exercised once. | +| **v1.0 GA** | [#6](https://github.com/tui-cs/clet/issues/6) | Tied to TG v2 GA. Brew, WinGet, NuGet channels live. Documentation published. | ## 8. Risks and Mitigations @@ -411,7 +411,7 @@ Schedule follows TG releases, not a calendar. ## 9. Open Questions 1. **Telemetry.** Not in v1.0 scope; revisit at v1.1 with a privacy review. -2. **Homebrew tap repo name.** `gui-cs/homebrew-tap` assumed; confirm it exists or create. +2. **Homebrew tap repo name.** `tui-cs/homebrew-tap` assumed; confirm it exists or create. 3. **Code signing certs.** Deferred post-1.0 per [D-012](decisions.md). Confirm ownership/renewal before signing is re-enabled. 4. ~~**`md` content source.**~~ Resolved ([D-015](decisions.md)). Both file arguments and stdin, with precedence: file args -> `--initial` -> stdin -> error. 5. **PR/FAQ update upstream.** Issue #5155's PR/FAQ still references `Terminal.Gui.Clets` as a separate assembly. Update the issue body to match this spec before v1.0. @@ -422,7 +422,7 @@ Schedule follows TG releases, not a calendar. Steps 1-10 are done (through v0.5). Remaining: 11. **Publish channels:** Homebrew (build-from-source), then WinGet, then NuGet tool push. -12. **v0.75 rc** — friends-and-family testing ([#33](https://github.com/gui-cs/clet/issues/33)). +12. **v0.75 rc** — friends-and-family testing ([#33](https://github.com/tui-cs/clet/issues/33)). 13. **v0.9 RC** — release workflow proven against real TG release; Homebrew/WinGet manifests in working-draft form; rollback runbook exercised. 14. **v1.0 GA.** @@ -473,6 +473,6 @@ Full document published at `docs/threat-model.md`. ## Appendix B: Cross-References -- PR/FAQ: [issue #5155](https://github.com/gui-cs/Terminal.Gui/issues/5155) +- PR/FAQ: [issue #5155](https://github.com/tui-cs/Terminal.Gui/issues/5155) - TG core docs: `docfx/docs/application.md`, `docfx/docs/View.md`, `docfx/docs/cancellable-work-pattern.md` - Contributor rules: `.claude/rules/`, `CLAUDE.md` diff --git a/specs/decisions.md b/specs/decisions.md index 0771601..a5a689f 100644 --- a/specs/decisions.md +++ b/specs/decisions.md @@ -52,7 +52,7 @@ Format: `## D-NNN: (status)`. Status is one of `Active`, `Supersed **Status.** Superseded by [D-021](#d-021-auto-discovered-clets-any-ivaluet-view-just-works-deferred-to-v2-active). The "revisit before v0.3 GA" trigger fired with the answer: don't bother in v1.x. The auto-discovery question is broader than just the source generator; D-021 captures the full design exploration and the deferral to v2. -**Pointers.** `src/Clet/Registry/BuiltInClets.cs`, `src/Clet.SourceGen/Placeholder.cs`. Bar-raise [#BR-11 in the bar-raise backlog issue](https://github.com/gui-cs/clet/issues/11) ticked. +**Pointers.** `src/Clet/Registry/BuiltInClets.cs`, `src/Clet.SourceGen/Placeholder.cs`. Bar-raise [#BR-11 in the bar-raise backlog issue](https://github.com/tui-cs/clet/issues/11) ticked. --- @@ -88,7 +88,7 @@ Format: `## D-NNN: (status)`. Status is one of `Active`, `Supersed **Status.** Active. TUIcast is not yet wired; the `[Fact(Skip=...)]` test and `tests/Clet.SmokeTests/scripts/select.txt` placeholder are in place. All 14 input clets have landed but the keystroke-driven smoke cases still await TUIcast integration. -**Pointers.** [Issue #9](https://github.com/gui-cs/clet/issues/9), `tests/Clet.SmokeTests/CletSmokeTests.cs` (the deliberately `[Fact(Skip=...)]` test). +**Pointers.** [Issue #9](https://github.com/tui-cs/clet/issues/9), `tests/Clet.SmokeTests/CletSmokeTests.cs` (the deliberately `[Fact(Skip=...)]` test). --- @@ -154,7 +154,7 @@ Revisit when download numbers show users hitting Gatekeeper/SmartScreen friction **Status.** Active. Only three secrets needed at v0.5: `CLET_DISPATCH_PAT`, `NUGET_API_KEY`, `HOMEBREW_TAP_TOKEN`. -**Pointers.** Spec §5.2 (build matrix signing steps), §5.4 (publish steps). `gui-cs/homebrew-tap` repo (must be created before v0.5). +**Pointers.** Spec §5.2 (build matrix signing steps), §5.4 (publish steps). `tui-cs/homebrew-tap` repo (must be created before v0.5). --- @@ -234,7 +234,7 @@ The file expansion logic (glob support, file-not-found warnings) is adapted from ## D-018: ASCII logo wired into `--help` banner and README hero section (Active) -**Context.** [Issue #12 (branding)](https://github.com/gui-cs/clet/issues/12) approved the three-line box-drawing logo and tagline "One binary. Every prompt. JSON out. Go home." and called for the logo to be wired into `clet --help` and the README hero section. +**Context.** [Issue #12 (branding)](https://github.com/tui-cs/clet/issues/12) approved the three-line box-drawing logo and tagline "One binary. Every prompt. JSON out. Go home." and called for the logo to be wired into `clet --help` and the README hero section. **Decision.** The ASCII logo is prepended to the Markdown-rendered `--help` output (embedded in `src/Clet/Help/overview.md`), before the tagline/description and usage block. The README `## Press Release` heading is preceded by a full hero section: hero image, code-block logo, tagline, install commands, comparison table, and usage examples (human + AI agent). Spec §4.7 updated to document the `--help` banner format. The logo is also the canonical visual identity for all documentation. @@ -246,7 +246,7 @@ The file expansion logic (glob support, file-not-found warnings) is adapted from ## D-019: Distribute clet as a single-project `dotnet tool` (mdv pattern) (Active) -**Context.** Spec §5.4 originally hand-waved at "the `Clet.Tool` project (which references `Clet` and packages the build output as a global tool)" — but no such project exists in the repo, and there is no need for one. The sibling [`gui-cs/mdv`](https://github.com/gui-cs/mdv) viewer ships as a single-csproj global tool: `true` + `mdv` + `Terminal.Gui.mdv` directly on the executable's csproj. Install command is `dotnet tool install -g Terminal.Gui.mdv`. clet should adopt the same pattern: a single csproj that produces both the AOT single-file binary (for Homebrew/WinGet) and a `dotnet tool` package (for the cross-platform `dotnet tool install` path). +**Context.** Spec §5.4 originally hand-waved at "the `Clet.Tool` project (which references `Clet` and packages the build output as a global tool)" — but no such project exists in the repo, and there is no need for one. The sibling [`tui-cs/mdv`](https://github.com/tui-cs/mdv) viewer ships as a single-csproj global tool: `true` + `mdv` + `Terminal.Gui.mdv` directly on the executable's csproj. Install command is `dotnet tool install -g Terminal.Gui.mdv`. clet should adopt the same pattern: a single csproj that produces both the AOT single-file binary (for Homebrew/WinGet) and a `dotnet tool` package (for the cross-platform `dotnet tool install` path). **Decision.** Add `PackAsTool`, `ToolCommandName=clet`, and a `PackageId` directly to `src/Clet/Clet.csproj`. Pack the README and LICENSE into the NuGet package via ``. No separate `Clet.Tool` project. The AOT binary continues to be produced by `dotnet publish -c Release` against the same csproj — `PackAsTool` only affects `dotnet pack` output, not `dotnet publish`. End users on any platform with the .NET SDK can install via `dotnet tool install -g ` and invoke `clet` from PATH. *(The original choice of `PackageId=Terminal.Gui.clet` to match the `Terminal.Gui.mdv` precedent has been superseded by [D-024](#d-024-package-id-is-bare-clet-active) — the bare `clet` id is now used.)* @@ -254,13 +254,13 @@ The file expansion logic (glob support, file-not-found warnings) is adapted from **How to apply:** §5.4 ".NET tool (NuGet)" describes this packaging in concrete terms (properties to set, exact `dotnet pack` / `dotnet tool install` commands). The current install hint is `dotnet tool install -g clet` (per D-024). v0.5 milestone exit criterion (§7) requires `dotnet pack` + local `dotnet tool install` to work end-to-end before the channels-live exit criteria for v1.0 GA. -**Pointers.** Spec §5.4, §7 v0.5 row, §10 step 10. README "Install" section. The `mdv.csproj` reference: . +**Pointers.** Spec §5.4, §7 v0.5 row, §10 step 10. README "Install" section. The `mdv.csproj` reference: . --- ## D-020: Continuous-release loop on TG develop + release; channel from version suffix (Active — point 4 superseded by D-022) -**Context.** Spec §5.1 originally fired clet's release workflow on a single trigger: `repository_dispatch type=tg-released` from a TG release tag. That left the §8 develop-pin risk wide open — clet had to hand-pin `Terminal.Gui Version="2.0.2-develop.NN"` and bump manually whenever TG develop changed. It also left clet silent during the long stretches between TG releases, even when develop carries shippable improvements. We want clet to track TG continuously (every develop NuGet publish drives a clet prerelease) **and** still produce stable artifacts on TG release tags (Homebrew, WinGet, NuGet "latest"). See [issue #30](https://github.com/gui-cs/clet/issues/30) for the kicked-off plan. +**Context.** Spec §5.1 originally fired clet's release workflow on a single trigger: `repository_dispatch type=tg-released` from a TG release tag. That left the §8 develop-pin risk wide open — clet had to hand-pin `Terminal.Gui Version="2.0.2-develop.NN"` and bump manually whenever TG develop changed. It also left clet silent during the long stretches between TG releases, even when develop carries shippable improvements. We want clet to track TG continuously (every develop NuGet publish drives a clet prerelease) **and** still produce stable artifacts on TG release tags (Homebrew, WinGet, NuGet "latest"). See [issue #30](https://github.com/tui-cs/clet/issues/30) for the kicked-off plan. **Decision.** @@ -274,7 +274,7 @@ The file expansion logic (glob support, file-not-found warnings) is adapted from **How to apply:** Spec §5.1, §5.4, §5.5, §5.6, §7 v0.5 row, and §8 risks all updated in the same PR. The §8 develop-pin risk row is **resolved**; a new "develop publish volume" row is added in its place. Failure handling distinguishes channel: release failures page, develop failures don't (next develop supersedes within hours; spam-paging on every flake would be untenable). -**Status.** Active. Pending TG-side work: a `notify-clet.yml` workflow on `gui-cs/Terminal.Gui` that fires both dispatches with a `CLET_DISPATCH_PAT` (tracked as a separate TG-side issue). +**Status.** Active. Pending TG-side work: a `notify-clet.yml` workflow on `tui-cs/Terminal.Gui` that fires both dispatches with a `CLET_DISPATCH_PAT` (tracked as a separate TG-side issue). **Pointers.** Spec §5.1, §5.4, §5.5, §5.6, §7, §8. `src/Clet/Clet.csproj` (`` + variable PackageReference). `.github/workflows/release.yml` (renamed from `release-on-tg.yml` per D-022). @@ -288,11 +288,11 @@ The file expansion logic (glob support, file-not-found warnings) is adapted from **Why:** 15 clets at ~50–150 lines each ≈ 1500 LOC of mostly-metadata is not the bottleneck. Cross-cutting concerns (`--title`, scheme, link safety, exit codes) already live above the per-clet layer; auto-discovery wouldn't change that. The leverage of full auto-discovery only kicks in if a long tail of new TG Views or third-party Views want shell exposure post-v1.0 — both are explicitly out of scope today (§1, plugin loading exclusion in Appendix A). And introducing a `[Shellable]` attribute on TG core softens the §2 "nothing in TG core knows about clets" decision; that's a TG-side opinion-shift we shouldn't ask for without the v2 third-party-clets driver behind it. -**How to apply:** Spec §11 is the canonical exploration. D-004 (source generator deferred) is **superseded by this entry** — D-004's "Pending — revisit before v0.3 GA" is now closed: the answer is "don't bother in v1.x." Bar-raise [#BR-11](https://github.com/gui-cs/clet/issues/11) ticked. v1.x refinements that pay down clet boilerplate without locking in a TG-side commitment (Options-declaration builder helper, generated §4.3.2 wire-format table, contract test for wire-format conformance) are listed in §11.5 and remain candidates for separate PRs. +**How to apply:** Spec §11 is the canonical exploration. D-004 (source generator deferred) is **superseded by this entry** — D-004's "Pending — revisit before v0.3 GA" is now closed: the answer is "don't bother in v1.x." Bar-raise [#BR-11](https://github.com/tui-cs/clet/issues/11) ticked. v1.x refinements that pay down clet boilerplate without locking in a TG-side commitment (Options-declaration builder helper, generated §4.3.2 wire-format table, contract test for wire-format conformance) are listed in §11.5 and remain candidates for separate PRs. **Status.** Active. Supersedes D-004. -**Pointers.** Spec §11 (full exploration), §11.5 (recommendation + v1.x refinements), §11.6 (open questions for v2). `src/Clet.SourceGen/` retained as placeholder. `src/Clet/Registry/BuiltInClets.cs` continues as hand-written. Bar-raise issue [#11](https://github.com/gui-cs/clet/issues/11) #BR-11. +**Pointers.** Spec §11 (full exploration), §11.5 (recommendation + v1.x refinements), §11.6 (open questions for v2). `src/Clet.SourceGen/` retained as placeholder. `src/Clet/Registry/BuiltInClets.cs` continues as hand-written. Bar-raise issue [#11](https://github.com/tui-cs/clet/issues/11) #BR-11. --- @@ -335,7 +335,7 @@ Both channels tag every build (needed for auto-increment). Both publish to NuGet ## D-024: Package id is bare `clet` (Active) -**Context.** [D-019](#d-019-distribute-clet-as-a-single-project-dotnet-tool-mdv-pattern-active) chose `PackageId=Terminal.Gui.clet` to mirror the [`gui-cs/mdv`](https://github.com/gui-cs/mdv) `Terminal.Gui.mdv` precedent and to keep the gui-cs origin obvious in NuGet search. We've since confirmed the bare `clet` id is unclaimed on nuget.org (verified via the flat-container API and the search index, both empty as of 2026-05-06), and the maintainer has scoped a NuGet API key to a single package id (`clet`) for tighter blast radius. The shorter id matches the tool command name (`dotnet tool install -g clet` is already what users type — and now what they search for too). +**Context.** [D-019](#d-019-distribute-clet-as-a-single-project-dotnet-tool-mdv-pattern-active) chose `PackageId=Terminal.Gui.clet` to mirror the [`tui-cs/mdv`](https://github.com/tui-cs/mdv) `Terminal.Gui.mdv` precedent and to keep the tui-cs origin obvious in NuGet search. We've since confirmed the bare `clet` id is unclaimed on nuget.org (verified via the flat-container API and the search index, both empty as of 2026-05-06), and the maintainer has scoped a NuGet API key to a single package id (`clet`) for tighter blast radius. The shorter id matches the tool command name (`dotnet tool install -g clet` is already what users type — and now what they search for too). **Decision.** Switch `` in `src/Clet/Clet.csproj` from `Terminal.Gui.clet` to `clet`. Install command becomes `dotnet tool install -g clet` (and `--prerelease` for the develop channel). Existing `Terminal.Gui.clet.*` versions on nuget.org are unlisted by the maintainer; the package id is freed but the historical versions remain restorable via explicit `--version` for anyone pinned to them (NuGet immutability). @@ -399,7 +399,7 @@ Both channels tag every build (needed for auto-increment). Both publish to NuGet ## D-028: `--output ` writes result to a file instead of stdout (Active) -**Context.** Terminal.Gui renders to stdout. Any form of stdout redirection (`$()`, `|`, `>`) hides the TUI — the user sees nothing (gui-cs/Terminal.Gui#5207). Until TG supports rendering to `/dev/tty` when stdout is redirected, clet needs a workaround to let scripts capture the result while keeping the TUI visible. +**Context.** Terminal.Gui renders to stdout. Any form of stdout redirection (`$()`, `|`, `>`) hides the TUI — the user sees nothing (tui-cs/Terminal.Gui#5207). Until TG supports rendering to `/dev/tty` when stdout is redirected, clet needs a workaround to let scripts capture the result while keeping the TUI visible. **Decision.** Add `--output ` / `-o ` as a built-in CLI flag. When set, `OutputFormatter` writes successful results (plain text or JSON) to the specified file path instead of stdout. The file is created with non-overwriting semantics; existing paths are refused rather than truncated. Non-success results are not written to the output file and are emitted through the normal stdout/stderr paths. stdout remains fully available for TUI rendering. If the file cannot be written, an error is emitted to stderr and the process exits with code 2 (usage error). @@ -456,7 +456,7 @@ This is clet's own defense. TG's cell model is treated as defense-in-depth, not ## D-032: Replace `range` clet with `linear-range` backed by Terminal.Gui's `LinearRange` (Active, supersedes D-011) -**Context.** The original `range` clet wrapped a hand-rolled `RangeView` (`NumericUpDown` × 2 + a `..` label) and emitted `{"low": , "high": }` per spec §4.3.2. It worked, but the UX was poor — two independent spinners with no visual sense of the range relationship — and it duplicated functionality TG shipped via [Terminal.Gui PR #5204](https://github.com/gui-cs/Terminal.Gui/pull/5204) (the `LinearRange` `IValue` refactor). +**Context.** The original `range` clet wrapped a hand-rolled `RangeView` (`NumericUpDown` × 2 + a `..` label) and emitted `{"low": , "high": }` per spec §4.3.2. It worked, but the UX was poor — two independent spinners with no visual sense of the range relationship — and it duplicated functionality TG shipped via [Terminal.Gui PR #5204](https://github.com/tui-cs/Terminal.Gui/pull/5204) (the `LinearRange` `IValue` refactor). **Decision.** Delete `RangeClet`, `RangeView`, and their tests. Add `LinearRangeClet` (alias `linear-range`) backed by the `LinearRange` view family, with three modes controlled by `--mode single|multi|range` (default `single`). Wire format changes from `{low, high}` to a mode-dependent JSON object: @@ -468,7 +468,7 @@ Additional options: `--orientation horizontal|vertical`, `--range-kind closed|le **Status.** Active. Supersedes [D-011](#d-011-range-is-integer-only-at-v03-active). -**Pointers.** `src/Clet/Clets/Input/LinearRangeClet.cs`, spec §4.3.2, README, [Terminal.Gui PR #5204](https://github.com/gui-cs/Terminal.Gui/pull/5204). +**Pointers.** `src/Clet/Clets/Input/LinearRangeClet.cs`, spec §4.3.2, README, [Terminal.Gui PR #5204](https://github.com/tui-cs/Terminal.Gui/pull/5204). --- diff --git a/specs/press-release.md b/specs/press-release.md index e349214..cbd55b5 100644 --- a/specs/press-release.md +++ b/specs/press-release.md @@ -28,8 +28,8 @@ For View authors, exposure is one line: implement `IValue` for input clets, o `clet` is available today via: ``` -brew install gui-cs/tap/clet # macOS, Linux -winget install gui-cs.clet # Windows 10/11 +brew install tui-cs/tap/clet # macOS, Linux +winget install tui-cs.clet # Windows 10/11 dotnet tool install -g clet # any platform with .NET SDK ``` @@ -106,7 +106,7 @@ Notable absence: `password`. We are deliberately not shipping a password clet in Whatever theme is configured in your TG `ConfigurationManager` (system or user) applies to every clet, input and viewer alike. `--theme ` overrides per-invocation. **Q: How is `clet` updated and versioned?** -The `clet` version always matches the Terminal.Gui version it's built against. When TG cuts a release on `main` (say, TG 2.5.0), GitHub Actions in `gui-cs/clet` rebuilds `clet 2.5.0` against the new TG, signs the artifacts, publishes the Homebrew bottle, submits the WinGet manifest, and pushes the .NET tool package. There is no separate `clet` release cadence to track. Users update through their installer's normal channel: `brew upgrade`, `winget upgrade`, or `dotnet tool update -g clet`. Two cadences would have been one cadence too many. +The `clet` version always matches the Terminal.Gui version it's built against. When TG cuts a release on `main` (say, TG 2.5.0), GitHub Actions in `tui-cs/clet` rebuilds `clet 2.5.0` against the new TG, signs the artifacts, publishes the Homebrew bottle, submits the WinGet manifest, and pushes the .NET tool package. There is no separate `clet` release cadence to track. Users update through their installer's normal channel: `brew upgrade`, `winget upgrade`, or `dotnet tool update -g clet`. Two cadences would have been one cadence too many. ### Engineering @@ -115,7 +115,7 @@ The `clet` version always matches the Terminal.Gui version it's built against. W **Yes, for `dotnet tool install -g clet`.** That channel exists for plugin authors and CI scenarios. **Q: NativeAOT, then?** -Yes for v1.0. Trade accepted: third-party clet *runtime loading* is deferred to v2 (you cannot `Assembly.LoadFrom` into an AOT'd process). The v1.0 clet set, including `md`, is statically linked. View authors with a clet they want shipped open a PR against `gui-cs/clet`. +Yes for v1.0. Trade accepted: third-party clet *runtime loading* is deferred to v2 (you cannot `Assembly.LoadFrom` into an AOT'd process). The v1.0 clet set, including `md`, is statically linked. View authors with a clet they want shipped open a PR against `tui-cs/clet`. **Q: Sync or async `IClet`?** Async. `Task> RunAsync(IApplication app, string? initial, CletRunOptions options, CancellationToken ct)` for input clets; the viewer counterpart returns `Task` (no `T`). @@ -136,19 +136,19 @@ Inputs from `--initial`, env vars, and stdin are untrusted. Terminal-escape sani Because `cmdlet` was taken, and the other plausible short forms led to places we did not want our brand to lead. `clet` was the shortest survivor of an unusually thorough naming review. We checked. **Q: What goes in the v0.5 milestone?** -Naming locked; JSON schema locked; exit-code table locked; inline rendering proven on macOS Terminal, iTerm2, Windows Terminal, GNOME Terminal; v1.0 input and viewer lists locked; `Markdown` View integration verified end-to-end including link safety; threat model published; Homebrew tap and WinGet manifest in working draft form; the gui-cs/clet release workflow proven against a real TG release cut. +Naming locked; JSON schema locked; exit-code table locked; inline rendering proven on macOS Terminal, iTerm2, Windows Terminal, GNOME Terminal; v1.0 input and viewer lists locked; `Markdown` View integration verified end-to-end including link safety; threat model published; Homebrew tap and WinGet manifest in working draft form; the tui-cs/clet release workflow proven against a real TG release cut. ### Strategic **Q: Why does Terminal.Gui own this rather than a separate project?** -The pitch ("every TG View is a CLI command") depends on the registry and the View ecosystem being the same ecosystem. Splitting it means fragmenting attention. `clet` ships as a single binary in its own repo (`gui-cs/clet`) so its native-installer ops stay out of TG's hair, while the View ecosystem it advertises is unchanged TG. In v1.0 the clet abstractions (`IClet`, `ICletRegistry`, `IViewerClet`) are internal to the binary; v2 may extract them into a published `Clet.Abstractions` NuGet once third-party plugin loading is in scope (today, NativeAOT precludes runtime `Assembly.LoadFrom` into the CLI). TG core changes only on the two narrow seams clet needs and any TG app benefits from (#5157, #5158). +The pitch ("every TG View is a CLI command") depends on the registry and the View ecosystem being the same ecosystem. Splitting it means fragmenting attention. `clet` ships as a single binary in its own repo (`tui-cs/clet`) so its native-installer ops stay out of TG's hair, while the View ecosystem it advertises is unchanged TG. In v1.0 the clet abstractions (`IClet`, `ICletRegistry`, `IViewerClet`) are internal to the binary; v2 may extract them into a published `Clet.Abstractions` NuGet once third-party plugin loading is in scope (today, NativeAOT precludes runtime `Assembly.LoadFrom` into the CLI). TG core changes only on the two narrow seams clet needs and any TG app benefits from (#5157, #5158). **Q: What does success look like 12 months after launch?** - 1k+ weekly active users (opt-in usage ping). - 500+ Homebrew installs and 500+ WinGet installs in the first 90 days. - 3+ AI-agent products integrating `clet list --json` for human-in-the-loop elicitation. - `clet md` displaces at least one of `glow`/`bat`/`mdcat` in measurable user workflows. -- At least one PR to `gui-cs/clet` adding a third-party-authored clet, accepted into v1.x. +- At least one PR to `tui-cs/clet` adding a third-party-authored clet, accepted into v1.x. - Zero breaking changes to `IValue` attributable to clet pressure. **Q: What kills this project?** diff --git a/src/Clet/Clet.csproj b/src/Clet/Clet.csproj index 7804ce4..f756283 100644 --- a/src/Clet/Clet.csproj +++ b/src/Clet/Clet.csproj @@ -22,8 +22,8 @@ Turns every Terminal.Gui View into a CLI command — typed inputs, a real file picker, a Markdown browser — with consistent JSON output, predictable exit codes, and full keyboard/mouse support. README.md LICENSE - https://github.com/gui-cs/clet - https://github.com/gui-cs/clet + https://github.com/tui-cs/clet + https://github.com/tui-cs/clet git terminal-gui;tui;cli;prompt;json;agent;select;file-picker;markdown diff --git a/src/Clet/Clets/Input/LinearRangeClet.cs b/src/Clet/Clets/Input/LinearRangeClet.cs index 066356c..72a6b25 100644 --- a/src/Clet/Clets/Input/LinearRangeClet.cs +++ b/src/Clet/Clets/Input/LinearRangeClet.cs @@ -1,4 +1,4 @@ -// Drop-in for gui-cs/clet at: src/Clet/Clets/Input/LinearRangeClet.cs +// Drop-in for tui-cs/clet at: src/Clet/Clets/Input/LinearRangeClet.cs // // Targets the LinearRange family that landed in Terminal.Gui via #5204: // - LinearSelector : LinearRangeViewBase IValue diff --git a/src/Clet/Clets/Viewer/ConfigClet.cs b/src/Clet/Clets/Viewer/ConfigClet.cs index 48062d2..a19f8df 100644 --- a/src/Clet/Clets/Viewer/ConfigClet.cs +++ b/src/Clet/Clets/Viewer/ConfigClet.cs @@ -418,11 +418,11 @@ private static void ResetConfigToDefaults () // Terminal.Gui's ConfigurationManager loads this automatically. // // Edit and save (Ctrl+S) to apply changes live. - // See: https://gui-cs.github.io/Terminal.Gui/docs/config.html - // Schema: https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json + // See: https://tui-cs.github.io/Terminal.Gui/docs/config.html + // Schema: https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json // ═══════════════════════════════════════════════════════════════════════ - "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", + "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", // ─── General Settings ───────────────────────────────────────────────── diff --git a/src/Clet/Clets/Viewer/EditorClet.cs b/src/Clet/Clets/Viewer/EditorClet.cs index d4fca9f..2da3ff8 100644 --- a/src/Clet/Clets/Viewer/EditorClet.cs +++ b/src/Clet/Clets/Viewer/EditorClet.cs @@ -1077,7 +1077,7 @@ void ShowAbout () Terminal.Gui {VersionInfo.GetTerminalGuiVersion ()} Terminal.Gui.Editor {editorVersion} - https://github.com/gui-cs/clet + https://github.com/tui-cs/clet """ }; diff --git a/src/Clet/Help/help.md b/src/Clet/Help/help.md index a80b336..05f7a90 100644 --- a/src/Clet/Help/help.md +++ b/src/Clet/Help/help.md @@ -24,6 +24,6 @@ clet select help --cat ## Reporting Problems -Found a bug or have a suggestion? [File an issue on GitHub](https://github.com/gui-cs/clet/issues/new). +Found a bug or have a suggestion? [File an issue on GitHub](https://github.com/tui-cs/clet/issues/new). Include `clet --version` output, your terminal and OS, and what you ran vs. what happened. diff --git a/src/Clet/Help/overview.md b/src/Clet/Help/overview.md index 48a5ba0..a7be2ea 100644 --- a/src/Clet/Help/overview.md +++ b/src/Clet/Help/overview.md @@ -52,4 +52,4 @@ clet --version [Help on help](clet:help:help) -{{VERSION}} - [clet on GitHub](https://github.com/gui-cs/clet) - By [@tig](https://github.com/tig) +{{VERSION}} - [clet on GitHub](https://github.com/tui-cs/clet) - By [@tig](https://github.com/tig) diff --git a/tests/Clet.IntegrationTests/ConfigCletIntegrationTests.cs b/tests/Clet.IntegrationTests/ConfigCletIntegrationTests.cs index 27644bb..ff793e9 100644 --- a/tests/Clet.IntegrationTests/ConfigCletIntegrationTests.cs +++ b/tests/Clet.IntegrationTests/ConfigCletIntegrationTests.cs @@ -35,7 +35,7 @@ public async Task RunAsync_WithBadThemeInConfig_DoesNotThrow () await File.WriteAllTextAsync (configPath, """ { - "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", + "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Theme": "Andersx" } """, TestContext.Current.CancellationToken); @@ -63,7 +63,7 @@ public async Task RunAsync_WithBadTheme_StopAfterFirstIteration_ReturnsOk () await File.WriteAllTextAsync (configPath, """ { - "$schema": "https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", + "$schema": "https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json", "Theme": "Andersx" } """, TestContext.Current.CancellationToken); diff --git a/tests/Clet.UITests/Goldens/config.ans b/tests/Clet.UITests/Goldens/config.ans index 8a043dd..6826452 100644 --- a/tests/Clet.UITests/Goldens/config.ans +++ b/tests/Clet.UITests/Goldens/config.ans @@ -6,11 +6,11 @@ 6  // Terminal.Gui's ConfigurationManager loads this automatically. ░ 7  // ░ 8  // Edit and save (Ctrl+S) to apply changes live. ░ - 9  // See: ]8;;https://gui-cs.github.io/Terminal.Gui/docs/config.html\https://gui-cs.github.io/Terminal.Gui/docs/config.html]8;;\ ░ - 10  // Schema: ]8;;https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json\https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json]8;;\ ░ + 9  // See: ]8;;https://tui-cs.github.io/Terminal.Gui/docs/config.html\https://tui-cs.github.io/Terminal.Gui/docs/config.html]8;;\ ░ + 10  // Schema: ]8;;https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json\https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json]8;;\ ░ 11  // ═══════════════════════════════════════════════════════════════════════ ░ 12 ░ - 13  "$schema": "]8;;https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json\https://gui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json]8;;\", ░ + 13  "$schema": "]8;;https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json\https://tui-cs.github.io/Terminal.Gui/schemas/tui-config-schema.json]8;;\", ░ 14 ░ 15  // ─── General Settings ───────────────────────────────────────────────── ░ 16 ░ diff --git a/tests/SPEC.md b/tests/SPEC.md index 5dcd8ae..3b82c38 100644 --- a/tests/SPEC.md +++ b/tests/SPEC.md @@ -2,7 +2,7 @@ Companion to [`specs/clet-spec.md`](../specs/clet-spec.md). This doc lives next to the test projects so it stays in sync when test layout or harness shape changes. The main spec defers to this one for everything in `tests/`. -Nine test layers, each with a clear "what does this catch" purpose. All test code lives in `tests//`. `Markdown` View rendering quality is tested in TG core, not here ([gui-cs/Terminal.Gui#5156](https://github.com/gui-cs/Terminal.Gui/issues/5156)). +Nine test layers, each with a clear "what does this catch" purpose. All test code lives in `tests//`. `Markdown` View rendering quality is tested in TG core, not here ([tui-cs/Terminal.Gui#5156](https://github.com/tui-cs/Terminal.Gui/issues/5156)). ## 1. When each layer runs (tier matrix) @@ -62,7 +62,7 @@ The legitimate worry that in-process injection drifts from AOT behavior is addre **What this catches:** Races and ordering bugs in `ConfigurationManager` (CM) state — a process-global singleton with one-time `[ConfigurationProperty]` discovery. CM tests that run in a parallel assembly can observe different discovery outcomes depending on which collection enables CM first. -**Why a separate project:** `DisableParallelization = true` on a collection only stops intra-/cross-collection concurrency *within* one assembly — it doesn't prevent a *different* parallel collection in the same assembly from enabling CM before the configuration tests run. The only robust isolation (used by Terminal.Gui itself and the sibling `gui-cs/Editor` repo) is a separate assembly with `parallelizeAssembly: false` and `parallelizeTestCollections: false` in `xunit.runner.json`. +**Why a separate project:** `DisableParallelization = true` on a collection only stops intra-/cross-collection concurrency *within* one assembly — it doesn't prevent a *different* parallel collection in the same assembly from enabling CM before the configuration tests run. The only robust isolation (used by Terminal.Gui itself and the sibling `tui-cs/Editor` repo) is a separate assembly with `parallelizeAssembly: false` and `parallelizeTestCollections: false` in `xunit.runner.json`. **Cases:** - `EditorSettings`: ManagedKeys completeness, CM discovery, Save round-trips (JSONC comments, existing keys, default template, key updates), CM Load/Apply restores values. @@ -119,7 +119,7 @@ The legitimate worry that in-process injection drifts from AOT behavior is addre **Parallelization:** Disabled at the assembly level. Process-level cases share the test-copied `clet` output and must not race multiple child processes over the same output artifacts. A module initializer sets `DisableRealDriverIO=1` and `Console.In = TextReader.Null` in the smoke-test host, and `CletProcess` passes `DisableRealDriverIO` to spawned `clet` children. Child stdin is still explicitly redirected only for smoke cases that pass `stdin`. -**Cases:** Identical to the release-pipeline smoke matrix in [`specs/clet-spec.md` §5.3](../specs/clet-spec.md#53-smoke-test-gate-p0-release-fails-closed) (every clet boots, returns valid JSON, exits with the correct code). Run on every PR to `gui-cs/clet`, every TG-triggered release build, and nightly against the latest TG develop branch. +**Cases:** Identical to the release-pipeline smoke matrix in [`specs/clet-spec.md` §5.3](../specs/clet-spec.md#53-smoke-test-gate-p0-release-fails-closed) (every clet boots, returns valid JSON, exits with the correct code). Run on every PR to `tui-cs/clet`, every TG-triggered release build, and nightly against the latest TG develop branch. **Tooling:** TUIcast in deterministic-script mode (same driver as §5.3 in the main spec). The xUnit fixture shells out to TUIcast with a per-clet keystroke script, captures the resulting JSON from the spawned `clet` process's stdout, and asserts on exit code + envelope shape. Using the same driver as the release gate means a green CI run is byte-equivalent evidence that the release gate will be green; we do not maintain two parallel smoke harnesses. @@ -155,17 +155,17 @@ The legitimate worry that in-process injection drifts from AOT behavior is addre | Mouse click | ☐ | ☐ | ☐ | ☐ | | Inline restore | ☐ | ☐ | ☐ | ☐ | -Run before every minor release (v1.0, v1.1, ...). Captured in a release checklist issue ([#23](https://github.com/gui-cs/clet/issues/23) tracks the first pass for v0.5). v0.5 milestone gate. +Run before every minor release (v1.0, v1.1, ...). Captured in a release checklist issue ([#23](https://github.com/tui-cs/clet/issues/23) tracks the first pass for v0.5). v0.5 milestone gate. ### 2.7 AOT publish tests -**What this catches:** Trim warnings, runtime AOT failures, regressions in AOT-compatibility of TG core. With no separate AOT audit (the original §3 entry was dropped because TG core already tracks AOT work), these tests are the primary discovery mechanism for AOT issues; failures here are filed as issues against `gui-cs/Terminal.Gui` with a minimal repro. +**What this catches:** Trim warnings, runtime AOT failures, regressions in AOT-compatibility of TG core. With no separate AOT audit (the original §3 entry was dropped because TG core already tracks AOT work), these tests are the primary discovery mechanism for AOT issues; failures here are filed as issues against `tui-cs/Terminal.Gui` with a minimal repro. **Cases:** -- CI publishes the AOT binary on every PR to `gui-cs/clet` and on the nightly TG-develop run. +- CI publishes the AOT binary on every PR to `tui-cs/clet` and on the nightly TG-develop run. - Zero trim warnings tolerated; warnings fail the build. - Smoke tests (§2.4) run against the AOT binary, not just the JIT'd debug build. -- AOT failures discovered during `gui-cs/clet` builds are filed against `gui-cs/Terminal.Gui` with a minimal repro. +- AOT failures discovered during `tui-cs/clet` builds are filed against `tui-cs/Terminal.Gui` with a minimal repro. ### 2.8 Performance tests (`Clet.PerfTests`)