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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ _nupkg/
_winget-pkgs/
_winget-pr/
_winget-test/
winget-out/

# Shared Claude hooks/settings; ignore the rest of the tree.
.claude/*
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ The Store package is **Command Palette only**. For PowerToys Run, see [PowerToys

### Option 2: WinGet

Two packages, same extension, different extras:
Same extension, choose bundled (CmdPal + Run) or CmdPal only:

| Package | What you get |
| --- | --- |
Expand All @@ -292,7 +292,7 @@ Two packages, same extension, different extras:
# Bundled (CmdPal + Run)
winget install tonythethompson.QuickShell

# CmdPal only
# CmdPal only (Store-equivalent)
winget install tonythethompson.QuickShellforCmdPal
```

Expand Down
7 changes: 7 additions & 0 deletions cmdpal-gallery/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ Ready-to-submit package for [microsoft/CmdPal-Extensions](https://github.com/mic

Publishing to the Microsoft Store registers the extension with Command Palette, but **does not** add it to the in-app Extension Gallery. That requires a separate PR to `microsoft/CmdPal-Extensions`.

## Install sources

- Store: `9PC8S6LNRT3R`
- WinGet: `tonythethompson.QuickShellforCmdPal` (CmdPal only; not the bundled Run package)

## Submit / update

Listing already lives at `extensions/tonythethompson/quickshell/` upstream. To refresh logo, screenshots, or metadata:
Expand All @@ -21,6 +26,8 @@ Listing already lives at `extensions/tonythethompson/quickshell/` upstream. To r

Manual path: fork https://github.com/microsoft/CmdPal-Extensions, replace `extensions/tonythethompson/quickshell/`, open a PR titled `Update tonythethompson.quickshell gallery listing`.

WinGet version bumps do not need a gallery PR; the listing only stores the package ID.

## Gallery title note

The gallery entry uses **Quick Shell** in Command Palette. The Store listing title **Quick Shell for CmdPal** is set in Partner Center, not in the MSIX manifest (CmdPal reads package display name from the manifest).
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
},
{
"type": "winget",
"id": "tonythethompson.QuickShell"
"id": "tonythethompson.QuickShellforCmdPal"
}
]
}
15 changes: 15 additions & 0 deletions docs/assets/css/main.scss
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,21 @@ kbd {
}
}

.install-snippet {
margin: 0 0 0.5rem;
max-width: 36rem;
text-align: left;
font-size: 0.82rem;
padding: 0.9rem 1.1rem;
}

.install-snippet-note {
margin: 0 0 1.5rem;
color: $text-muted;
font-size: 0.85rem;
max-width: 36rem;
}

// ── Sponsor ─────────────────────────────────────────────

.sponsor-row {
Expand Down
8 changes: 8 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,19 @@ description: Quick Shell opens saved project folders from PowerToys Command Pale

<div class="button-row">
<a class="button button-primary" href="https://apps.microsoft.com/detail/9PC8S6LNRT3R" target="_blank" rel="noopener">Microsoft Store</a>
<a class="button button-secondary" href="{{ '/install/' | relative_url }}#winget-command-line">WinGet</a>
<a class="button button-secondary" href="{{ '/install/' | relative_url }}">Get Started</a>
<a class="button button-secondary" href="{{ '/getting-started/' | relative_url }}">Learn More</a>
<a class="button button-secondary" href="https://github.com/tonythethompson/QuickShell/releases">View Releases</a>
</div>

<pre class="install-snippet" aria-label="WinGet install commands"><code>winget install tonythethompson.QuickShell
winget install tonythethompson.QuickShellforCmdPal</code></pre>
Comment on lines +23 to +24

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Snippet implies both commands should be run

Both WinGet commands appear in a single <pre> block with no visual separator or comment, so a user scanning quickly may run both — installing the extension twice via two separate packages that share the same AppId. The note below the snippet explains they are alternatives, but the snippet itself presents them as a sequence. Adding a comment line (e.g. # -- or --) between them, or splitting into two labelled blocks, would make the mutual-exclusivity clear at a glance.

Prompt To Fix With AI
This is a comment left during a code review.
Path: docs/index.md
Line: 23-24

Comment:
**Snippet implies both commands should be run**

Both WinGet commands appear in a single `<pre>` block with no visual separator or comment, so a user scanning quickly may run both — installing the extension twice via two separate packages that share the same `AppId`. The note below the snippet explains they are alternatives, but the snippet itself presents them as a sequence. Adding a comment line (e.g. `# -- or --`) between them, or splitting into two labelled blocks, would make the mutual-exclusivity clear at a glance.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Cursor Fix in Claude Code Fix in Codex

<p class="install-snippet-note">
Bundled (Command Palette + PowerToys Run), or CmdPal only (Store-equivalent).
<a href="{{ '/install/' | relative_url }}#winget-command-line">More install options</a>
</p>

<div class="sponsor-row">
<span class="sponsor-label">Support development</span>
<a class="button button-sponsor button-github-sponsor" href="https://github.com/sponsors/tonythethompson" target="_blank" rel="noopener">&#9829; GitHub Sponsors</a>
Expand Down
9 changes: 6 additions & 3 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,18 @@ Or search **Quick Shell for CmdPal** in the Store app (listing title). After ins
</div>

### WinGet (Command Line)
{: #winget-command-line}

Both Command Palette packages are live on WinGet. Prefer the bundled ID if you also want PowerToys Run (`qs`).

```powershell
# Command Palette + PowerToys Run
# Command Palette + PowerToys Run (recommended for most users)
winget install tonythethompson.QuickShell

# Command Palette only (Store-equivalent)
# Command Palette only (same scope as Microsoft Store)
winget install tonythethompson.QuickShellforCmdPal

# PowerToys Run only
# PowerToys Run only (awaits initial package listing)
winget install tonythethompson.QuickShellforRun
```

Expand Down
2 changes: 1 addition & 1 deletion docs/release-packages.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ winget install tonythethompson.QuickShellforCmdPal
winget install tonythethompson.QuickShellforRun
```

Initial manifests for `QuickShellforCmdPal` and `QuickShellforRun` must be created in [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs) before CI can auto-submit updates for those IDs. Until then, release CI updates **`tonythethompson.QuickShell`** (bundled) and soft-skips the missing packages. The release workflow submits updates when `WINGET_PAT` is configured.
`tonythethompson.QuickShell` (bundled) and `tonythethompson.QuickShellforCmdPal` are published in [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs); release CI submits version bumps for both when `WINGET_PAT` is configured. `tonythethompson.QuickShellforRun` awaits its initial package merge before CI can auto-update that ID.

The former `tonythethompson.QuickShellforRaycast` WinGet package is retired (no further CI updates). Prefer the Raycast Store.

Expand Down
79 changes: 53 additions & 26 deletions scripts/submit-cmdpal-gallery.ps1
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
# Submit or update Quick Shell in the Command Palette Extension Gallery.
# Requires: gh auth login, fork of microsoft/CmdPal-Extensions
#
# Always creates a fresh branch from upstream main and a normal push (no force).
param(
[switch]$DryRun,
[string]$Branch = 'update-tonythethompson-quickshell'
[string]$Branch = '',
[string]$Title = 'Update tonythethompson.quickshell gallery listing',
[string]$Body = ''
)

$ErrorActionPreference = 'Stop'
Expand All @@ -15,8 +19,12 @@ if (-not (Test-Path $source)) {
throw "Missing gallery source at $source"
}

if ([string]::IsNullOrWhiteSpace($Branch)) {
$Branch = 'update-tonythethompson-quickshell-' + (Get-Date -Format 'yyyyMMdd-HHmmss')
}

if ($DryRun) {
Write-Host "Would sync fork $upstream, copy $source, and open PR on branch $Branch"
Write-Host "Would sync fork $upstream, copy $source, push branch $Branch (no force), and open a PR"
exit 0
}

Expand All @@ -41,36 +49,55 @@ if (-not $forkExists) {
}

Write-Host "Using fork: $forkRepo"
# Sync the fork's default branch from upstream (not a branch force-push).
gh repo sync $forkRepo --source $upstream --force 2>$null
gh repo clone $forkRepo $workDir -- --depth=1
Push-Location $workDir
Comment on lines +52 to 55
git checkout -b $Branch
$dest = Join-Path $workDir 'extensions\tonythethompson\quickshell'
New-Item -ItemType Directory -Force -Path $dest | Out-Null
# Replace listing contents so renamed/removed screenshots do not linger.
Get-ChildItem -Force $dest | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Copy-Item -Recurse -Force (Join-Path $source '*') $dest
git add -A extensions/tonythethompson/quickshell
git status --short
git commit -m "Update tonythethompson.quickshell gallery listing"
git push -u origin $Branch --force-with-lease
$bodyFile = Join-Path $env:TEMP 'cmdpal-gallery-pr-body.md'
@'
try {
git checkout -b $Branch
$dest = Join-Path $workDir 'extensions\tonythethompson\quickshell'
New-Item -ItemType Directory -Force -Path $dest | Out-Null
# Replace listing contents so renamed/removed screenshots do not linger.
Get-ChildItem -Force $dest | Remove-Item -Recurse -Force
Copy-Item -Recurse -Force (Join-Path $source '*') $dest
Comment on lines +60 to +62

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

-ErrorAction SilentlyContinue can defeat the stated purpose of the cleanup.

The comment says this replace-before-copy step exists so "renamed/removed screenshots do not linger", but a failed Remove-Item (e.g. a locked/read-only file) is silently ignored, so the stale file would linger and get merged with the freshly copied content — the opposite of the intent.

🧰 Tools
🪛 PSScriptAnalyzer (1.25.0)

[warning] Missing BOM encoding for non-ASCII encoded file 'submit-cmdpal-gallery.ps1'

(PSUseBOMForUnicodeEncodedFile)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/submit-cmdpal-gallery.ps1` around lines 60 - 62, Update the cleanup
command in the replacement flow around Get-ChildItem and Remove-Item so removal
failures are not silently ignored; remove or replace ErrorAction
SilentlyContinue with failure behavior that stops the operation before Copy-Item
runs, ensuring stale files cannot remain.

git add -A extensions/tonythethompson/quickshell
git status --short

if (-not (git status --porcelain)) {
throw 'No gallery listing changes to commit.'
}

git commit -m $Title
git push -u origin $Branch
if ($LASTEXITCODE -ne 0) {
throw "git push failed for branch $Branch (refusing to force-push)."
}

if ([string]::IsNullOrWhiteSpace($Body)) {
$Body = @"
## Summary
Updates the **Quick Shell** Command Palette Extension Gallery listing.

- New product logo (`icon.png`, Store AppTile)
- Screenshots refreshed for current workspace UI (list, create, settings, detail)
- Description/tags aligned with current product language
- Install sources unchanged: Microsoft Store `9PC8S6LNRT3R`, WinGet `tonythethompson.QuickShell`
Describe only what this PR changes (for example logo, screenshots, copy, or install sources). Do not reuse stale bullets from a prior submission.

## Test plan
- [ ] CI schema validation passes
- [ ] Store product ID resolves
- [ ] Icon under 100 KB; screenshots under 1 MB each
- [ ] Tags ≤ 5
'@ | Set-Content -Path $bodyFile -Encoding utf8
$prUrl = gh pr create --repo $upstream --head "${login}:$Branch" --title 'Update tonythethompson.quickshell gallery listing' --body-file $bodyFile
Remove-Item $bodyFile -Force -ErrorAction SilentlyContinue
Pop-Location
Write-Host "PR opened: $prUrl"
- [ ] Store / WinGet install source IDs resolve
- [ ] Icon under 100 KB; screenshots under 1 MB each (when media changed)
- [ ] Tags: at most 5
"@
Comment on lines +77 to +88

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Non-ASCII plus missing BOM risks garbled PR-body text.

Static analysis flags this file as missing a BOM for its non-ASCII content; the on Line 87 is that content. On Windows PowerShell 5.1 (non-Core), a script file without a BOM is read using the system codepage, so this literal can render as mojibake in the generated PR body. Saving with a UTF-8 BOM, or just using <=, sidesteps the issue.

🧰 Tools
🪛 PSScriptAnalyzer (1.25.0)

[warning] Missing BOM encoding for non-ASCII encoded file 'submit-cmdpal-gallery.ps1'

(PSUseBOMForUnicodeEncodedFile)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/submit-cmdpal-gallery.ps1` around lines 77 - 88, Update the
PowerShell here-string assigned to $Body to avoid the non-ASCII ≤ character by
expressing the same constraint with ASCII characters, or save the script with an
explicit UTF-8 BOM; ensure the generated PR body remains readable in Windows
PowerShell 5.1.

Source: Linters/SAST tools

}
Comment thread
greptile-apps[bot] marked this conversation as resolved.

$bodyFile = Join-Path $env:TEMP 'cmdpal-gallery-pr-body.md'
Set-Content -Path $bodyFile -Value $Body -Encoding utf8
Comment on lines +91 to +92

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Use a per-invocation PR body file.

Line 91 uses the fixed path cmdpal-gallery-pr-body.md. Concurrent runs can overwrite or delete each other’s body between Lines 92 and 98. gh pr create can then receive the wrong PR body or fail.

Generate a unique temporary path and remove it in a nested finally block.

Proposed fix
-    $bodyFile = Join-Path $env:TEMP 'cmdpal-gallery-pr-body.md'
+    $bodyFile = [System.IO.Path]::GetTempFileName()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$bodyFile = Join-Path $env:TEMP 'cmdpal-gallery-pr-body.md'
Set-Content -Path $bodyFile -Value $Body -Encoding utf8
$bodyFile = [System.IO.Path]::GetTempFileName()
Set-Content -Path $bodyFile -Value $Body -Encoding utf8
🧰 Tools
🪛 PSScriptAnalyzer (1.25.0)

[warning] Missing BOM encoding for non-ASCII encoded file 'submit-cmdpal-gallery.ps1'

(PSUseBOMForUnicodeEncodedFile)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/submit-cmdpal-gallery.ps1` around lines 91 - 92, Update the temporary
PR body file setup in the submission flow to generate a unique per-invocation
path instead of the fixed cmdpal-gallery-pr-body.md name, then wrap the gh pr
create usage in a nested finally block that removes that specific file after
completion or failure.

$prUrl = gh pr create --repo $upstream --head "${login}:$Branch" --title $Title --body-file $bodyFile
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($prUrl)) {
Remove-Item $bodyFile -Force -ErrorAction SilentlyContinue
throw 'gh pr create failed; no PR was opened.'
}
Remove-Item $bodyFile -Force -ErrorAction SilentlyContinue
Write-Host "PR opened: $prUrl"
Comment thread
tonythethompson marked this conversation as resolved.
}
finally {
Pop-Location
}
14 changes: 7 additions & 7 deletions winget/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ Both installers register the same Command Palette extension (shared Inno `AppId`

Template manifests for the repo copy. Release CI runs `wingetcreate update` against both IDs after each GitHub Release.

## First-time setup for `tonythethompson.QuickShellforCmdPal`
## Package status

`wingetcreate update` only works after the package exists in [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs). Before the first release that ships `QuickShellforCmdPal-Setup-*.exe`:
| Package ID | Status |
| --- | --- |
| `tonythethompson.QuickShell` | Published; CI submits version bumps |
| `tonythethompson.QuickShellforCmdPal` | Published (initial `0.2.3.0`); CI submits version bumps |
| `tonythethompson.QuickShellforRun` | Awaits initial package merge before CI can `wingetcreate update` |

1. Cut a GitHub Release that includes the CmdPal-only installers.
2. Update SHA256 values in `tonythethompson.QuickShellforCmdPal.installer.yaml`.
3. Open a PR to winget-pkgs with the three manifest files (or run `wingetcreate new` / `wingetcreate submit`).

Subsequent releases are updated automatically by `.github/workflows/release-extension.yml`.
`wingetcreate update` only works after the package exists in [microsoft/winget-pkgs](https://github.com/microsoft/winget-pkgs). Subsequent releases for published IDs are submitted by `.github/workflows/release-extension.yml`.
Loading