Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/scripts/critical-dependencies.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,14 @@ async function checkTerminalGui(github, core, owner, repo, project) {
return;
}
const { data: releases } = await github.rest.repos.listReleases({
owner: 'gui-cs', repo: 'Terminal.Gui', per_page: 30,
owner: 'tui-cs', repo: 'Terminal.Gui', per_page: 30,
Comment thread
harder marked this conversation as resolved.
});
const upstream = releases.find(release => release.tag_name.toLowerCase().includes(latest.version.toLowerCase()));
await createOnce(github, core, owner, repo, `Terminal.Gui develop update: ${latest.version}`, `
Scout currently references **${match[1]}**; NuGet has **${latest.version}** on the develop channel.

- [NuGet package and version history](https://www.nuget.org/packages/Terminal.Gui/${latest.version})
- [Upstream changes](${upstream ? upstream.html_url : 'https://github.com/gui-cs/Terminal.Gui/releases'})
- [Upstream changes](${upstream ? upstream.html_url : 'https://github.com/tui-cs/Terminal.Gui/releases'})
- Check whether Dependabot opened an update PR. Its version PR may target a stable release instead of the develop channel.
- Compare APIs used by Scout, especially UI thread dispatch, shutdown, layout, input, and progress callbacks.
- Run unit tests, Windows x64 and ARM64 AOT publish, and mock smoke; record any live COM/TUI checks that require a Windows host.
Expand Down
12 changes: 10 additions & 2 deletions .github/scripts/critical-dependencies.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const monitor = require('./critical-dependencies.js');
test('critical releases create one assigned issue each and stay quiet on later runs', async () => {
const originalFetch = global.fetch;
const issues = [];
const releaseQueries = [];
let labelExists = false;
global.fetch = async () => ({
ok: true,
Expand All @@ -26,12 +27,15 @@ test('critical releases create one assigned issue each and stay quiet on later r
},
},
repos: {
listReleases: async ({ repo }) => ({ data: repo === 'Terminal.Gui'
listReleases: async ({ owner, repo }) => {
releaseQueries.push({ owner, repo });
return { data: repo === 'Terminal.Gui'
? [{ tag_name: 'v2.5.1-develop.45', html_url: 'https://example.invalid/terminal', body: 'Fix progress callbacks' }]
: [
{ tag_name: 'v1.29.0', html_url: 'https://example.invalid/stable', body: 'Source changes', draft: false, prerelease: false },
{ tag_name: 'v1.30.0-preview', html_url: 'https://example.invalid/preview', body: 'COM updates', draft: false, prerelease: true },
] }),
] };
},
},
},
};
Expand All @@ -43,6 +47,10 @@ test('critical releases create one assigned issue each and stay quiet on later r
projectText: '<PackageReference Include="Terminal.Gui" Version="2.5.1-develop.44" />',
};
await monitor(args);
assert.deepEqual(releaseQueries, [
{ owner: 'tui-cs', repo: 'Terminal.Gui' },
{ owner: 'microsoft', repo: 'winget-cli' },
]);
assert.equal(issues.length, 3);
assert.ok(issues.every(issue => issue.assignees[0] === 'harder' && issue.labels[0] === 'critical-dependency'));
assert.match(issues[0].body, /progress callbacks/);
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ and restores both portable and MSIX Identity graphs in locked mode.

## Code style

Mostly follow standard C# / .NET conventions. The project loosely mirrors [Terminal.Gui's style](https://github.com/gui-cs/Terminal.Gui/blob/develop/.claude/rules/formatting.md) — notable points:
Mostly follow standard C# / .NET conventions. The project loosely mirrors [Terminal.Gui's style](https://github.com/tui-cs/Terminal.Gui/blob/develop/.claude/rules/formatting.md) — notable points:

- Space before parens: `Method ()`, `array [i]`, `if (...)`.
- Braces on next line (Allman style).
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,9 @@ COM enables richer package details, installer previews and version lists, live p

## Inspiration and credits

[Scott Hanselman's **winget-tui**](https://github.com/shanselman/winget-tui), built with Rust and Ratatui, inspired this project and deserves credit for showing how approachable WinGet can be in a terminal. Scout began as a C# exploration of what [Terminal.Gui](https://github.com/gui-cs/Terminal.Gui) could do with that kind of experience. It has since developed into an independent package manager with its own workflows, design, and release builds. No source code was copied from the inspiration project.
[Scott Hanselman's **winget-tui**](https://github.com/shanselman/winget-tui), built with Rust and Ratatui, inspired this project and deserves credit for showing how approachable WinGet can be in a terminal. Scout began as a C# exploration of what [Terminal.Gui](https://github.com/tui-cs/Terminal.Gui) could do with that kind of experience. It has since developed into an independent package manager with its own workflows, design, and release builds. No source code was copied from the inspiration project.

Scout for WinGet is [MIT licensed](LICENSE). WinGet is maintained by [Microsoft](https://github.com/microsoft/winget-cli); Terminal.Gui is maintained by its [contributors](https://github.com/gui-cs/Terminal.Gui).
Scout for WinGet is [MIT licensed](LICENSE). WinGet is maintained by [Microsoft](https://github.com/microsoft/winget-cli); Terminal.Gui is maintained by its [contributors](https://github.com/tui-cs/Terminal.Gui).

## Development

Expand Down
2 changes: 1 addition & 1 deletion WinGetScout.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<AssemblyName>wingetscout</AssemblyName>
<Product>Scout for WinGet</Product>
<Title>Scout for WinGet</Title>
<Version>0.2.2</Version>
<Version>1.0.0</Version>
<Description>Scout for WinGet is a terminal app for finding, installing, and updating Windows packages.</Description>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
Expand Down
2 changes: 1 addition & 1 deletion packaging/WINGET-SUBMISSION.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The installer manifest has `InstallerType: zip`, `NestedInstallerType: portable`
2. Download that artifact from the successful release workflow run. The files are under `manifests/h/Harder/WinGetScout/<version>/`. To regenerate directly from the published ZIPs and validate in one command on Windows, run:

```powershell
$version = '0.2.2' # replace with the published release version
$version = '1.0.0' # replace with the published release version
pwsh ./packaging/prepare-winget-submission.ps1 -Version $version
```

Expand Down
2 changes: 1 addition & 1 deletion site/docs.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
<section id="updates"><p class="section-kicker">05 / STAY CURRENT</p><h2>Scheduled update checks</h2><p>On the Upgrades tab, press <code>C</code> to check now or set a daily local time. Scout creates a current-user Windows Task Scheduler task. The first successful check establishes a baseline; later checks can notify you about new or changed unpinned upgrades or a failed check.</p><div class="callout"><strong>Checks never install updates automatically.</strong> Turn off the schedule in the same dialog to remove its task. Keep the extracted folder at the same path so the task can find Scout.</div><p>Scout keeps package sets, recent runs, update-check results, and schedule settings under <code>%LOCALAPPDATA%\WinGetScout</code>.</p></section>
<section id="backends"><p class="section-kicker">06 / UNDER THE HOOD</p><h2>Backends and capabilities</h2><p>The complete portable ZIP uses the structured WinGet COM API where it can activate. If COM is unavailable, Scout falls back to the <code>winget</code> CLI and shows the active backend in its header. The standalone EXE download uses the CLI because it lacks the COM companion files.</p><p>Both backends support core search, install, upgrade, uninstall, pins, saved sets, history, and scheduled checks. COM can provide richer details, installer previews, version lists, live progress, and supported verify or repair actions. Some information depends on what the active backend exposes.</p></section>
<section id="troubleshooting"><p class="section-kicker">07 / HELP</p><h2>Troubleshooting</h2><div class="faq"><h3>WinGet is missing</h3><p>Run <code>winget --version</code>. If the command is unavailable, install or update Microsoft App Installer, then open a new terminal.</p><h3>Windows warns about an unsigned download</h3><p>Confirm the file came from the project's GitHub Release and compare its SHA-256 hash with the matching <code>SHA256SUMS</code> file. See the signing guide for the current status.</p><h3>COM is unavailable</h3><p>Make sure you extracted the whole ZIP, then check the active backend shown in Scout. CLI fallback still supports the core workflows. See <a href="https://github.com/harder/wingetscout/blob/main/com-activation.md">COM activation details</a>.</p><h3>How do I get help or report a bug?</h3><p>Press <code>?</code> in Scout or open a <a href="https://github.com/harder/wingetscout/issues">GitHub issue</a>.</p></div></section>
<section id="more"><p class="section-kicker">08 / MORE</p><h2>More resources</h2><p>Read the <a href="https://github.com/harder/wingetscout#readme">README</a> for contributor and build instructions, the <a href="https://github.com/harder/wingetscout/blob/main/feature-gaps.md">known limitations</a>, and the <a href="https://github.com/harder/wingetscout/releases">release notes</a>.</p><p>Scout was inspired by <a href="https://github.com/shanselman/winget-tui">Scott Hanselman's winget-tui</a> and is built with <a href="https://github.com/gui-cs/Terminal.Gui">Terminal.Gui</a>. It is an independent MIT-licensed project.</p></section>
<section id="more"><p class="section-kicker">08 / MORE</p><h2>More resources</h2><p>Read the <a href="https://github.com/harder/wingetscout#readme">README</a> for contributor and build instructions, the <a href="https://github.com/harder/wingetscout/blob/main/feature-gaps.md">known limitations</a>, and the <a href="https://github.com/harder/wingetscout/releases">release notes</a>.</p><p>Scout was inspired by <a href="https://github.com/shanselman/winget-tui">Scott Hanselman's winget-tui</a> and is built with <a href="https://github.com/tui-cs/Terminal.Gui">Terminal.Gui</a>. It is an independent MIT-licensed project. Meet <a href="./#maker">Kevin and the other tools behind Scout</a>.</p></section>
</div>
</div>
</main>
Expand Down
15 changes: 15 additions & 0 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,21 @@ <h1 id="hero-title">Find the package.<br><span>Know before you install.</span></
</section>

<section class="install-section" id="install" aria-labelledby="install-title"><div class="wrap install-panel"><div><p class="section-kicker">READY WHEN YOU ARE</p><h2 id="install-title">Unzip. Open. Scout.</h2><p>Download the portable ZIP for your PC, extract the complete folder, and run <code>wingetscout.exe</code>. No .NET runtime or installer is required.</p><div class="hero-actions"><a class="button button-primary" href="https://github.com/harder/wingetscout/releases/latest">Get the latest release <span aria-hidden="true">↗</span></a><a class="button button-secondary" href="docs.html#install">Installation steps</a></div><p class="install-footnote">The WinGet community package is being prepared. Its <code>winget install</code> command will be available after that submission is accepted.</p></div><div class="install-steps"><div><b>01</b><span><strong>Choose your ZIP</strong><small>Windows x64 or arm64</small></span></div><div><b>02</b><span><strong>Keep the folder together</strong><small>Companion files enable the COM backend</small></span></div><div><b>03</b><span><strong>Launch Scout</strong><small>Open it from Windows Terminal or PowerShell</small></span></div></div></div></section>

<section class="maker-section" id="maker" aria-labelledby="maker-title">
<div class="wrap maker-layout">
<div class="maker-intro">
<p class="section-kicker">BEHIND SCOUT</p>
<h2 id="maker-title">Made for people who live in the terminal.</h2>
<p>Scout for WinGet is made by <strong>Kevin Harder</strong>, a software engineer who enjoys making practical open source tools feel a little easier to use.</p>
<div class="maker-links"><a href="https://kevinharder.com/">Meet Kevin <span aria-hidden="true">↗</span><small>kevinharder.com</small></a><a href="https://harder.dev/">Explore Harder Labs <span aria-hidden="true">↗</span><small>harder.dev</small></a></div>
</div>
<div class="maker-projects">
<article class="maker-project maker-skillview"><span class="maker-label">MORE FROM KEVIN</span><h3>SkillView</h3><p>A GitHub CLI extension that helps you discover, inspect, install, and maintain agent skills without leaving the terminal.</p><div class="maker-project-links"><a href="https://skillview.dev/">Explore SkillView <span aria-hidden="true">↗</span></a><a href="https://github.com/harder/gh-skillview">GitHub <span aria-hidden="true">↗</span></a></div></article>
<article class="maker-project maker-terminal"><span class="maker-label">BUILT WITH</span><h3>Terminal.Gui</h3><p>Scout's interface is built with this .NET terminal UI toolkit. Kevin is a core contributor to the project.</p><a href="https://github.com/tui-cs/Terminal.Gui">Explore Terminal.Gui <span aria-hidden="true">↗</span></a></article>
</div>
</div>
</section>
</main>

<footer class="site-footer"><div class="wrap footer-inner"><div><a class="brand footer-brand" href="./"><img src="media/scout-dog.svg" width="71" height="48" alt="" aria-hidden="true"><span class="brand-copy"><strong>Scout for WinGet</strong><small>WinGet Scout</small></span></a><p>A friendlier way to explore Windows packages.</p></div><div class="footer-links"><a href="docs.html">Documentation</a><a href="https://github.com/harder/wingetscout/releases">Releases</a><a href="https://github.com/harder/wingetscout">Source code</a><a href="https://github.com/harder/wingetscout/issues">Feedback</a></div></div><div class="wrap footer-bottom"><span>MIT licensed · Built with Terminal.Gui · Powered by WinGet</span><span>© 2026 Scout for WinGet contributors</span></div></footer>
Expand Down
Loading
Loading