RepoPilotOpen in app →

gerardog/gsudo

Sudo for Windows

Healthy

Healthy across the board

Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit today
  • 7 active contributors
  • MIT licensed
Show 3 more →
  • CI configured
  • Tests present
  • Concentrated ownership — top contributor handles 67% of recent commits

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/gerardog/gsudo)](https://repopilot.app/r/gerardog/gsudo)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/gerardog/gsudo on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: gerardog/gsudo

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/gerardog/gsudo shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

GO — Healthy across the board

  • Last commit today
  • 7 active contributors
  • MIT licensed
  • CI configured
  • Tests present
  • ⚠ Concentrated ownership — top contributor handles 67% of recent commits

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live gerardog/gsudo repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/gerardog/gsudo.

What it runs against: a local clone of gerardog/gsudo — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in gerardog/gsudo | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>gerardog/gsudo</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of gerardog/gsudo. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/gerardog/gsudo.git
#   cd gsudo
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of gerardog/gsudo and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "gerardog/gsudo(\\.git)?\\b" \\
  && ok "origin remote is gerardog/gsudo" \\
  || miss "origin remote is not gerardog/gsudo (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "src" \\
  && ok "src" \\
  || miss "missing critical file: src"
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f "build/01-build.ps1" \\
  && ok "build/01-build.ps1" \\
  || miss "missing critical file: build/01-build.ps1"
test -f ".github/workflows/ci.yml" \\
  && ok ".github/workflows/ci.yml" \\
  || miss "missing critical file: .github/workflows/ci.yml"
test -f "docs/docs/how-it-works.md" \\
  && ok "docs/docs/how-it-works.md" \\
  || miss "missing critical file: docs/docs/how-it-works.md"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/gerardog/gsudo"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

gsudo is a Windows implementation of Unix/Linux sudo that elevates commands with a single UAC popup and runs them in the current console window. Written in C# with PowerShell/Batch scripting, it detects your shell environment (CMD, PowerShell, WSL, Git-Bash, Cygwin, NuShell, etc.) and executes elevated commands natively within that shell, supporting output piping, exit codes, and optional credentials caching to minimize UAC prompts. Monorepo-style structure: core C# application logic likely in src/ (inferred from C# as 411K LOC but not visible in top 60), PowerShell module in root, build orchestration via 6 numbered PowerShell scripts (/build/01-build.ps1 through 06-release-Nuget.ps1), distribution packages for Chocolatey/NuGet/Scoop in /build/Chocolatey/, /build/Nuget/, /build/Scoop/, and documentation site in /docs/ using Docusaurus.

👥Who it's for

Windows power users, sysadmins, and developers who want Unix-like sudo workflow without leaving their current shell or spawning new windows. Developers building cross-platform automation scripts that need privilege escalation on Windows.

🌱Maturity & risk

Actively maintained and production-ready. The repo shows significant GitHub/Chocolatey download counts, has a mature CI/CD pipeline (.github/workflows contains ci.yml, release.yml, winget-solo.yml), comprehensive documentation via Docusaurus in /docs, and multiple distribution channels (Chocolatey, NuGet, Scoop, Winget). Recent work on .NET 7 support and multi-shell detection suggests ongoing active development.

Single-maintainer project (gerardog is primary) creates sustainability risk. No visible test directory in the top 60 files, suggesting limited test coverage visibility (though CI pipeline exists at .github/workflows/ci.yml). UAC/privilege escalation code is security-critical and any bugs could expose privilege boundaries. Build pipeline complexity (6 PowerShell scripts in /build/) requires careful coordination.

Active areas of work

Recent work includes .NET 7 migration (visible in /docs/blog/2022-08-21-dotnet7), multi-shell support expansion (detects Yori, Take Command, BusyBox, NuShell), and distribution expansion (Winget pipeline at .github/workflows/winget-solo.yml). CI pipeline at .github/workflows/ci.yml runs on commits.

🚀Get running

Clone and build using the provided PowerShell scripts: git clone https://github.com/gerardog/gsudo.git && cd gsudo && .\build\00-prerequisites.ps1 && .\build\01-build.ps1 (requires Windows and PowerShell). Subsequent build/test cycles use 01-build.ps1 and 02-test.ps1.

Daily commands: No traditional npm start / dotnet run. Instead: (1) cd to repo root, (2) Run powershell -ExecutionPolicy Bypass -File .\build\01-build.ps1 to compile, (3) Built binaries typically land in a bin/ or out/ directory (inferred), (4) Test with .\build\02-test.ps1. For local testing of gsudo itself after build: gsudo cmd or gsudo powershell from elevated prompt.

🗺️Map of the codebase

  • src — Root source directory containing the core C# implementation of gsudo's elevation logic and process communication; all contributors must understand the architecture here
  • README.md — Primary user-facing documentation explaining gsudo's purpose, installation, and usage patterns; essential for understanding product scope and user expectations
  • build/01-build.ps1 — Main build script orchestrating compilation, testing, and packaging; contributors working on releases or local builds must understand this workflow
  • .github/workflows/ci.yml — CI/CD pipeline defining automated testing, signing, and release processes; critical for understanding merge requirements and deployment gates
  • docs/docs/how-it-works.md — Technical documentation explaining gsudo's security model, IPC mechanism, and elevation strategy; required reading for understanding security implications
  • SECURITY.md — Security policy and vulnerability disclosure process; essential for all contributors, especially those handling elevation or credential caching

🧩Components & responsibilities

  • gsudo.exe (Main Executable) (C#, Windows API, Named Pipes IPC) — Entry point that parses CLI arguments, detects elevation needs, invokes UAC, and spawns elevated child process
    • Failure mode: If UAC is cancelled or elevation fails, tool exits with error code; if IPC fails, child process output may be lost
  • Credentials Cache (C# Collections, DateTime TTL tracking) — In-memory token cache with TTL-based expiration; allows subsequent commands to skip UAC prompt within cache window
    • Failure mode: Expired tokens cause re-elevation; cache not shared across sessions means separate elevation needed in new terminal
  • Shell Integration Layer (PowerShell modules, shell aliases, environment variables) — Hooks into PowerShell, CMD, bash, MSYS2, WSL to intercept user input and transparently invoke gsudo elevation
    • Failure mode: If shell integration fails, user must manually prepend gsudo to each command
  • Build & Release Pipeline (PowerShell scripts, GitHub Actions, MSBuild, signtool.exe) — Orchestrates compilation, signing, testing, and distribution to Chocolatey, NuGet, Scoop, and GitHub
    • Failure mode: Build failures prevent release; signing failures block installation on modern Windows; failed tests prevent merge
  • Documentation Site (Docusaurus 3, React, Markdown, GitHub Pages) — Docusaurus-based static site serving user guides, API docs, security policies, and troubleshooting
    • Failure mode: Documentation

🛠️How to make changes

Add a new command-line option or flag

  1. Implement the flag parsing logic in the C# source code (src)
  2. Document the new option with examples in the usage documentation (docs/docs/usage/usage.md)
  3. Add test cases to the test suite via build script (build/02-test.ps1)
  4. Update README if the feature is user-facing (README.md)

Add support for a new shell (e.g., bash, zsh)

  1. Create new shell-specific logic in the C# elevation engine (src)
  2. Add shell-specific usage guide under docs/docs/usage/ (docs/docs/usage)
  3. Create sample script demonstrating the new shell integration (sample-scripts)
  4. Test with build/02-test.ps1 and verify in CI via .github/workflows/ci.yml (.github/workflows/ci.yml)

Release a new version to package managers

  1. Bump version in build/Chocolatey/gsudo.nuspec.template (build/Chocolatey/gsudo/tools/chocolateyinstall.ps1)
  2. Run build/03-sign.ps1 to sign binaries (build/03-sign.ps1)
  3. Execute build/05-release-Chocolatey.ps1 and build/06-release-Nuget.ps1 (build/05-release-Chocolatey.ps1)
  4. Verify release workflow in .github/workflows/release.yml executes successfully (.github/workflows/release.yml)

🔧Why these technologies

  • C# / .NET Framework — Provides direct access to Windows APIs (UAC, elevation tokens, process creation) and can compile to native executables compatible with all Windows versions
  • PowerShell scripting — Used for build automation, installer creation, and release workflows; native to Windows and allows tight integration with MSI/Chocolatey/NuGet ecosystems
  • Docusaurus + React — Modern static site generator for documentation; enables versioning, search, and responsive design without server dependencies
  • GitHub Actions — Native CI/CD for GitHub repos; enables automated signing, testing, and multi-package-manager releases without external services

⚖️Trade-offs already made

  • In-process credentials caching vs. external credential store

    • Why: Simpler implementation and avoids dependency on Windows Credential Manager or Vault services
    • Consequence: Credentials are only cached within the same PowerShell/CMD session; more secure but requires re-elevation across new terminals
  • Single binary (gsudo.exe) vs. separate server/client architecture

    • Why: Easier installation, no background services, simpler user experience
    • Consequence: Each invocation must negotiate UAC; cannot truly 'hold' elevated context persistently across unrelated processes
  • UAC elevation prompt per command vs. proxy sudo behavior

    • Why: Faithful to Windows security model and UAC intent; transparent to user about elevation events
    • Consequence: Users see more UAC prompts than Unix sudo users; mitigated by credentials caching

🚫Non-goals (don't propose these)

  • Does not provide persistent elevation context across independent shell sessions
  • Does not bypass or suppress Windows UAC prompts (only consolidates them via caching)
  • Does not run on non-Windows platforms (Windows-only tool)

🪤Traps & gotchas

PowerShell ExecutionPolicy: Build scripts require ExecutionPolicy Bypass or signed certificates; prerequisites.ps1 likely handles this. UAC context state: gsudo relies on Windows UAC/token elevation; running in non-elevated context will always show UAC popup (this is by design, but affects testing). Shell detection fragility: Each shell (WSL, Git-Bash, Cygwin, NuShell) has different environment variables and path structures; changes to shell detection need multi-shell testing. Credentials cache security: Cache mode stores elevated context state; misconfiguration could leak privileges (see cache mode docs). .NET version pinning: Recent .NET 7 migration means older .NET Framework compatibility may be dropping; check build/01-build.ps1 for target framework.

🏗️Architecture

💡Concepts to learn

  • lukesampson/scoop — Package manager used to distribute gsudo on Windows; gsudo is packaged here at /build/Scoop/gsudo.json
  • chocolatey/choco — Primary distribution channel for gsudo on Windows; Chocolatey package definition at /build/Chocolatey/gsudo.nuspec.template
  • sudo-project/sudo — Original Unix sudo project that gsudo emulates in behavior and UX; provides the conceptual foundation and command syntax
  • microsoft/terminal — Windows Terminal is the modern shell host where gsudo runs; many gsudo features (no new window, same console) depend on Terminal's capabilities
  • PowerShell/PowerShell — One of the primary shells gsudo supports and integrates with; PS module at root level requires understanding PS semantics

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add missing documentation for WSL integration and interop

The file structure shows docs/docs/usage/wsl.md exists, but given that gsudo is a Windows elevation tool with WSL support, this documentation likely needs expansion on elevation patterns when calling Windows binaries from WSL and vice versa. This is a critical use-case for Windows developers using WSL that currently lacks concrete examples.

  • [ ] Review docs/docs/usage/wsl.md for gaps in WSL↔Windows elevation patterns
  • [ ] Add section covering: calling gsudo from WSL bash to elevate Windows commands
  • [ ] Add section covering: calling WSL from elevated Windows PowerShell/CMD with proper context passing
  • [ ] Add practical examples for npm/cargo/pip package installation scenarios that require elevation
  • [ ] Add troubleshooting section for common WSL+gsudo permission/token issues
  • [ ] Link from docs/docs/usage/usage.md to WSL-specific patterns

Create comprehensive integration tests for PowerShell module in build pipeline

The repo has build/02-test.ps1 and build/Chocolatey/gsudo/tools/chocolateyinstall.ps1, indicating PowerShell script testing exists, but there's no visible CI workflow specifically testing the PowerShell module installation, profile integration, and alias setup across different PowerShell versions (5.1, 7.x on Windows). This is critical since many users install via Chocolatey which runs these scripts.

  • [ ] Review .github/workflows/ci.yml to identify current test coverage gaps for PowerShell integration
  • [ ] Add test matrix in ci.yml for: PowerShell 5.1 (Windows default) and PowerShell 7.x
  • [ ] Create tests validating: sudo alias registration, profile injection, module import success
  • [ ] Test elevation in different contexts: local user, system, domain-joined machines
  • [ ] Add regression tests for build/Chocolatey/gsudo/tools/chocolateyinstall.ps1 script execution
  • [ ] Document expected behavior in docs/docs/usage/powershell.md based on test results

Add security audit documentation and security.md enhancement

SECURITY.md exists but is minimal. Given that gsudo handles elevation and privilege escalation (security-critical), the security docs should detail the threat model, credential caching security (docs/docs/credentials-cache.md exists), and known limitations. This helps users make informed decisions about gsudo usage.

  • [ ] Expand SECURITY.md with explicit threat model (what gsudo protects/doesn't protect against)
  • [ ] Document credential cache security properties: expiration, token storage location, encryption details
  • [ ] Add section on token theft risks when using credentials-cache across network shares
  • [ ] Reference how gsudo compares to Windows UAC elevation in docs/docs/gsudo-vs-sudo.md
  • [ ] Add security considerations for each installation method (Chocolatey, NuGet, Scoop, manual)
  • [ ] Include section on verifying gsudo binary authenticity (code signing details from build/03-sign.ps1)

🌿Good first issues

  • Add integration tests for the NuShell shell detector (mentioned in README as supported but likely under-tested); create a test script at build/tests/shell-nushell.ps1 that verifies gsudo correctly detects and integrates with NuShell environments
  • Expand /docs/ Docusaurus site with a troubleshooting section documenting common UAC/elevation failures on different Windows versions (Windows 10 vs 11 UAC behavior differs); add a new /docs/docs/troubleshooting.md file
  • Add PowerShell module tests: create build/tests/module-integration.ps1 validating the gsudo { } ScriptBlock syntax (mentioned in README but no visible module test coverage); test parameter passing and return values

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 814c5d8 — Merge pull request #426 from gerardog/dependabot/npm_and_yarn/fast-uri-3.1.2 (gerardog)
  • e6e26ad — chore(deps): bump fast-uri from 3.1.0 to 3.1.2 (dependabot[bot])
  • f0e1590 — Merge pull request #424 from gerardog/copilot/update-invoke-gsudo-help (gerardog)
  • aa2681f — Expand InputObject description: mention argument/pipeline usage and add pipe example (Copilot)
  • 1965a96 — Merge pull request #422 from gerardog/copilot/major-semver-change-fixes (gerardog)
  • 826ea12 — Add missing InputObject and Credential parameter help to Invoke-gsudo.ps1 (Copilot)
  • c2a2c17 — Initial plan (Copilot)
  • 713a458 — fix comment in PS_EchoQuotedPathWithSpacesTest (code review feedback) (Copilot)
  • f5afba9 — fix(issue#408): escape double-quotes correctly for PowerShell 7.3+ in -Command arg (Copilot)
  • dc5fa2d — Merge pull request #397 from gerardog/fix/scoop.pathprecedence (gerardog)

🔒Security observations

The gsudo codebase demonstrates a reasonable security posture with an existing security policy and vulnerability reporting framework. Key strengths include active CI/CD workflows, Dependabot configuration, and documentation on security considerations. Primary concerns are: (1) incomplete SECURITY.md file preventing proper vulnerability disclosure, (2) use of cutting-edge (React 19, Docusaurus 3.10) dependencies with potentially undiscovered vulnerabilities, and (3) standard web application risks in the documentation site regarding content sanitization. The core gsudo Windows application itself was not analyzable from the provided file structure (appears to be C# based on .csproj files), but no obvious misconfigurations were found in build, CI/CD, or deployment configurations. Recommend completing the security policy and implementing continuous dependency scanning and updates.

  • Medium · Incomplete Security Policy — SECURITY.md. The SECURITY.md file appears truncated. The vulnerability reporting instructions are incomplete (ends with 'Please do the following: -'), which could confuse users attempting to report security issues and may result in unreported vulnerabilities. Fix: Complete the vulnerability reporting section with clear instructions including: contact email, disclosure timeline, PGP key if applicable, and preferred communication method.
  • Low · React Version at Upper Bound — docs/package.json - dependencies.react. React dependency is pinned to ^19.2.5, which is a very recent major version. React 19 may have undiscovered vulnerabilities, and widespread ecosystem compatibility issues may not yet be apparent. Fix: Monitor React 19 security advisories closely. Consider testing thoroughly in staging before deploying to production. Have a rollback plan ready.
  • Low · Docusaurus at Upper Bound — docs/package.json - dependencies (@docusaurus/core, etc.). All Docusaurus dependencies are pinned to ^3.10.1 (latest 3.x). While this ensures feature parity across plugins, it may expose the documentation site to newly discovered vulnerabilities in the latest version. Fix: Regularly update dependencies and monitor security advisories. Consider using automated dependency updates with testing (e.g., Dependabot is already configured in .github/dependabot.yml - ensure it's actively maintained).
  • Low · Missing npm Lockfile Visibility — docs/package.json. The provided package.json uses caret (^) version constraints which allow minor/patch updates. Without visibility of package-lock.json or yarn.lock, exact transitive dependencies cannot be verified for vulnerabilities. Fix: Ensure package-lock.json or yarn.lock is committed to version control and regularly scanned with 'npm audit' or 'yarn audit'. Consider using GitHub's dependency scanning features.
  • Low · Documentation Site XSS Risk - MDX Processing — docs/docs/ - MDX files and components. The documentation uses @mdx-js/react for content rendering. While Docusaurus provides good defaults, MDX files could potentially be vulnerable to XSS if user-generated content is rendered without proper sanitization. Fix: Ensure all dynamic content in MDX files is properly escaped. Use Docusaurus's built-in security features. Avoid using dangerouslySetInnerHTML. Validate and sanitize any user-submitted content before rendering.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · gerardog/gsudo — RepoPilot