Skip to content
Open
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
6 changes: 0 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,6 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Verify Raycast CLI
run: node scripts/verify-raycast-cli.js

- name: Test
run: npm test

Expand Down Expand Up @@ -104,9 +101,6 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Verify Raycast CLI
run: node scripts/verify-raycast-cli.js

- name: Test
run: npm test

Expand Down
6 changes: 2 additions & 4 deletions QuickShell.Raycast/.gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
node_modules/
.raycast-swift-build/
dist/
bin/
*.log
setup-release.iss
setup-x64.iss
setup-arm64.iss

assets/QuickShell.Suggest.exe
12 changes: 10 additions & 2 deletions QuickShell.Raycast/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# Quick Shell Changelog
# Quick Shell Workspaces Changelog

## [macOS Tier A] - {PR_MERGE_DATE}
## [Command suggestions] - 2026-08-27

- Rename the Store listing to Quick Shell Workspaces and the command to Open Workspace (package id remains `quickshell`)
- Package Windows `QuickShell.Suggest.exe` into Raycast assets for richer command suggestions
- Manual Add Workspace shows suggestions in the dropdown without auto-applying them
- Keep leftover suggestions selectable; fall back to local folder heuristics on macOS or when Suggest is unavailable
- Improve discovered-repo workspace seeding and suggestion reliability

## [macOS Tier A] - 2026-07-22

- Add macOS to Raycast platforms: Terminal.app / iTerm2 launch, Mac companions, discover roots, import/export dialogs
- Multi-launch tabs on Mac (Terminal.app / iTerm2) when the preference is enabled; Windows Terminal tab grouping unchanged on Windows
Expand Down
24 changes: 17 additions & 7 deletions QuickShell.Raycast/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
# Quick Shell Raycast
# Quick Shell Workspaces

Raycast-native workspace launcher for Quick Shell on **Windows** and **macOS**.

## Why Quick Shell?

Quick Shell provides a unique feature set tailored for cross-platform developers and complex project setups:

- **Cross-Platform Support**: Quick Shell offers first-class support for both Windows and macOS, including Windows Terminal and WSL natively.
- **Advanced Git Integration**: Quick Shell goes beyond standard directory opening by offering git repository discovery and "Git Branch Gates" (blocking launches if a target branch has uncommitted changes).
- **Companion Apps**: Launch secondary servers, scripts, or apps right alongside your primary workspace terminals.
- **Workspace Trust & Portability**: Export and import workspaces as JSON with robust validation and security metadata, making it easy to share setups across machines.
- **Comprehensive Launch Management**: Manage entire multi-app project workspaces with multi-command tabs, diagnostics, and launch gates rather than just local terminal profiles or single directory paths.

## Commands

- **Quick Shell** — search, launch, create, discover git repos, edit, favorite, duplicate, import/export, undo/redo, preferences
- **Open Workspace** — search, launch, create, discover git repos, edit, favorite, duplicate, import/export, undo/redo, preferences

**Extension preferences** (Raycast → Extensions → Quick Shell): default terminal app, default profile, show recents, multi-command tabs, block dirty branch switch.
**Extension preferences** (Raycast → Extensions → Quick Shell Workspaces): default terminal app, default profile, show recents, multi-command tabs, block dirty branch switch.

Root search: the command is titled **Quick Shell**; its subtitle shows your 3 most recent workspaces. Register it as a fallback command so root-search text seeds the list via `fallbackText`. Open the command and use Actions (Ctrl+K) for Recent / Import / Export. Use **Add to Root Search** on a workspace to create a Quicklink.
Root search: the command is titled **Open Workspace**; its subtitle shows your 3 most recent workspaces. Register it as a fallback command so root-search text seeds the list via `fallbackText`. Open the command and use Actions (Ctrl+K) for Recent / Import / Export. Use **Add to Root Search** on a workspace to create a Quicklink.

Create, Discover, and Edit are Actions / pushed views inside Quick Shell (not separate root commands).
Create, Discover, and Edit are Actions / pushed views inside Open Workspace (not separate root commands).

## Requirements

Expand Down Expand Up @@ -62,9 +72,9 @@ npm run dev

Run `npm run build` before submitting Store changes. Do not add a `version` field to `package.json`; Store versioning uses `CHANGELOG.md`.

On Windows, `npm run build`, `npm run publish` (runs `ensure-suggest-asset.js` before the Raycast publish CLI), `npm run dev` (if the asset is missing), `scripts/deploy-all.ps1`, and `scripts/build-raycast-extension.ps1` all publish `QuickShell.Suggest.exe` into Raycast `assets/` (gitignored; generated at build/publish time). The CLI needs the .NET 10 Desktop Runtime. macOS continues to use local folder heuristics.
The Windows suggestion CLI (`QuickShell.Suggest.exe`) is not bundled in this Store build; `fetchSuggestionPills` falls back to local folder heuristics when `assets/QuickShell.Suggest.exe` is absent, which it always is here. macOS also uses local heuristics.

**Distribution:** publish via the [Raycast Store](https://www.raycast.com/store) only. GitHub Releases and WinGet do not ship Raycast sideload packages. `scripts/build-raycast-extension.ps1` is for local/dev packaging.
**Distribution:** publish via the [Raycast Store](https://www.raycast.com/store) only.

## Store checklist

Expand Down
Binary file removed QuickShell.Raycast/assets/command-create.png
Binary file not shown.
Binary file removed QuickShell.Raycast/assets/command-edit.png
Binary file not shown.
Binary file removed QuickShell.Raycast/assets/command-settings.png
Binary file not shown.
12 changes: 4 additions & 8 deletions QuickShell.Raycast/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://www.raycast.com/schemas/extension.json",
"name": "quickshell",
"title": "Quick Shell",
"title": "Quick Shell Workspaces",
"description": "Open saved project folders in Terminal, Windows Terminal, and other shells",
"icon": "extension-icon.png",
"author": "tonythethompson",
Expand Down Expand Up @@ -99,12 +99,12 @@
}
],
"engines": {
"node": ">=20"
"node": ">=22.22.2"
},
"commands": [
{
"name": "open-workspace",
"title": "Quick Shell",
"title": "Open Workspace",
"description": "Search, open, create, and manage saved workspaces (qs)",
"icon": "command-open.png",
"keywords": [
Expand Down Expand Up @@ -154,16 +154,12 @@
"vitest": "^3.0.8"
},
"scripts": {
"predev": "node scripts/sync-workspace-trust-features.js && node scripts/verify-raycast-cli.js && node scripts/ensure-suggest-asset.js --if-missing",
"prebuild": "node scripts/sync-workspace-trust-features.js && node scripts/verify-raycast-cli.js && node scripts/ensure-suggest-asset.js",
"prelint": "node scripts/sync-workspace-trust-features.js && node scripts/verify-raycast-cli.js",
"pretest": "node scripts/sync-workspace-trust-features.js",
"build": "ray build",
"dev": "ray develop",
"lint": "ray lint",
"test": "vitest run",
"test:watch": "vitest",
"publish": "node scripts/ensure-suggest-asset.js && npx @raycast/api@latest publish"
"publish": "npx @raycast/api@latest publish"
Comment thread
tonythethompson marked this conversation as resolved.
},
"allowScripts": {
"esbuild@0.28.1": true
Expand Down
49 changes: 0 additions & 49 deletions QuickShell.Raycast/scripts/ensure-suggest-asset.js

This file was deleted.

22 changes: 0 additions & 22 deletions QuickShell.Raycast/scripts/generate-icons.sh

This file was deleted.

30 changes: 0 additions & 30 deletions QuickShell.Raycast/scripts/sync-workspace-trust-features.js

This file was deleted.

58 changes: 0 additions & 58 deletions QuickShell.Raycast/scripts/verify-raycast-cli.js

This file was deleted.

39 changes: 0 additions & 39 deletions QuickShell.Raycast/setup-template.iss

This file was deleted.

9 changes: 4 additions & 5 deletions QuickShell.Raycast/src/__tests__/companion-form.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
COMPANION_CHOICE_TITLE_NONE,
COMPANION_PRESET_CUSTOM,
COMPANION_PRESET_NONE,
COMPANION_PRESETS,
getCompanionPresets,
inferCompanionPresetFromPath,
listCompanionFormChoices,
normalizeCompanionPresetForForm,
Expand All @@ -31,10 +31,9 @@ afterEach(() => {

describe("companion-catalog", () => {
it("lists presets with stable ids and default arguments", () => {
expect(COMPANION_PRESETS.length).toBeGreaterThan(5);
expect(COMPANION_PRESETS.every((preset) => preset.id && preset.title && preset.candidatePaths.length > 0)).toBe(
true,
);
const presets = getCompanionPresets();
expect(presets.length).toBeGreaterThan(5);
expect(presets.every((preset) => preset.id && preset.title && preset.candidatePaths.length > 0)).toBe(true);
expect(resolveCompanionPreset("missing-preset")).toBeNull();
});

Expand Down
16 changes: 10 additions & 6 deletions QuickShell.Raycast/src/__tests__/security.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join, resolve } from "node:path";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
Expand Down Expand Up @@ -441,14 +441,18 @@ describe("workspace trust kill switch (disabled)", () => {
});

it("matches the shared JSON default", () => {
const shared = JSON.parse(
readFileSync(resolve(__dirname, "../../../shared/workspace-trust-features.json"), "utf8"),
) as { enabled: boolean };
const local = JSON.parse(readFileSync(resolve(__dirname, "../lib/workspace-trust-features.json"), "utf8")) as {
enabled: boolean;
};
expect(local.enabled).toBe(shared.enabled);
expect(WORKSPACE_TRUST_DEFAULT_ENABLED).toBe(shared.enabled);
const sharedPath = resolve(__dirname, "../../../shared/workspace-trust-features.json");
if (existsSync(sharedPath)) {
const shared = JSON.parse(readFileSync(sharedPath, "utf8")) as { enabled: boolean };
expect(local.enabled).toBe(shared.enabled);
expect(WORKSPACE_TRUST_DEFAULT_ENABLED).toBe(shared.enabled);
return;
}
// Store PR layout has no QuickShell shared/ tree; assert the committed local default.
expect(WORKSPACE_TRUST_DEFAULT_ENABLED).toBe(local.enabled);
});

it("coerceTrustedWhileDisabled rewrites untrusted rows", () => {
Expand Down
Loading
Loading