Skip to content

Add loop-window-control extension - #31266

Open
zwjtano wants to merge 1 commit into
raycast:mainfrom
zwjtano:ext/loop-window-control
Open

zwjtano wants to merge 1 commit into
raycast:mainfrom
zwjtano:ext/loop-window-control

Conversation

@zwjtano

@zwjtano zwjtano commented Sep 18, 2026 •

Copy link
Copy Markdown

Description

Integrates the Loop macOS window manager with Raycast through its native URL scheme. Search 71 window actions, assign Raycast hotkeys to nine common actions, and run named Loop layouts, cycles, and stashes using existing Loop configuration.

Requires Loop 1.4.2 or later and Accessibility permission for Loop. No additional CLI, server, API key, or account is needed. The extension validates the application bundle, closes Raycast to restore focus, and delivers URLs using argument-based execFile calls. The HUD says 'Sent to Loop' because the upstream interface does not acknowledge execution.

Includes installation diagnostics, configurable app path and focus delay, English setup/troubleshooting documentation, an original icon, and an npm lockfile. Raycast author: zwjacl. No upstream implementation or artwork is copied.

The earlier Loop submission #26751 was closed, and its author stated they had stopped working on it. This is an independent implementation.

Validation

  • npm run build: passed with Raycast API 2.4.1 and TypeScript checks.
  • npm run lint: passed manifest, lockfile, icon, ESLint, and Prettier checks.
  • npm test: 7 tests passed, covering URL encoding, invalid input, installation errors, focus/delivery order, and process failures.
  • All 71 action identifiers checked against Loop 1.4.2 source.
  • Native installation detection and loop://list/actions verified against local Loop 1.4.2; Loop generated its action-list file.
  • Opened the development extension in Raycast and verified the action list rendered.

Full manual verification of distribution-build window resizing, multi-display behavior, and named keybind execution remains outstanding. No screencast is attached yet.

Checklist

  • I read the extension guidelines
  • I read the documentation about publishing
  • I ran npm run build and tested this distribution build in Raycast — build passed; full distribution UI verification remains outstanding as noted above.
  • I checked that files in the assets folder are used by the extension itself
  • I checked that README assets are outside metadata — README has no media assets.

@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Sep 18, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@zwjtano
zwjtano marked this pull request as ready for review September 18, 2026 14:47
@greptile-apps

greptile-apps Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

The PR is not safe to merge until it uses a released-compatible Raycast API and satisfies the screenshot and generated-type requirements.

Findings

  1. P1 API version blocks installs ▶
  2. P2 Add screenshots for view commands ▶
  3. P2 Use generated Raycast types ▶
  4. P2 Reject unsupported Loop versions ▶
Fix with agent prompt
### Issue 1
extensions/loop-window-control/package.json:158
`@raycast/api` 2.4.1 is newer than released Raycast clients can run. The same version recently made another extension uninstallable, and this code only uses APIs available in 2.2.1. Pin the manifest and lockfile to a released-compatible version.

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!

### Issue 2
extensions/loop-window-control/package.json:21
The repository requires every extension with a view command to add a `metadata/` folder with Raycast-styled screenshots. This manifest adds two view commands, but this extension has no screenshots. Add the required Store images before merging.

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!

### Issue 3
extensions/loop-window-control/src/lib/loop.ts:13-16
The repository says not to copy preference or command argument types by hand because Raycast generates them from the manifest. `LoopPreferences` duplicates both preferences, and `run-keybind.ts` also copies the `name` argument shape. Use the generated types so manifest changes cannot leave source types stale.

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!

### Issue 4
extensions/loop-window-control/src/lib/transport.ts:59-63
`inspectInstallation` reads `CFBundleShortVersionString` but never checks the documented 1.4.2 minimum. An older Loop build that declares the URL scheme passes setup and receives catalog actions it may not support. Compare the version and show the update error before closing Raycast.

---

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

Summary

Adds a macOS Raycast extension that controls Loop through its native URL scheme. Users can search 71 window actions, assign hotkeys to nine common actions, run named Loop keybinds, and check installation setup.

  • Validates Loop’s app bundle and URL scheme before sending commands.
  • Closes Raycast, waits for focus restoration, then sends encoded URLs with open.
  • Adds setup guidance, configurable preferences, tests, documentation, and extension packaging.

Reviews (1) · Last reviewed commit: "Add Loop Window Control extension"

"fix-lint": "ray lint --fix"
},
"dependencies": {
"@raycast/api": "^2.4.1"

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.

P1 @raycast/api 2.4.1 is newer than released Raycast clients can run. The same version recently made another extension uninstallable, and this code only uses APIs available in 2.2.1. Pin the manifest and lockfile to a released-compatible version.

Knowledge Base Used: Roll Back Secret Browser Commands API Version

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/loop-window-control/package.json
Line: 158

Comment:
`@raycast/api` 2.4.1 is newer than released Raycast clients can run. The same version recently made another extension uninstallable, and this code only uses APIs available in 2.2.1. Pin the manifest and lockfile to a released-compatible version.

**Knowledge Base Used:** [Roll Back Secret Browser Commands API Version](https://app.greptile.com/raycast/-/custom-context/knowledge-base/raycast/extensions/-/reverts/rollback_31151-20260915-api-version-too-new-4b15289.md)

---

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!

"name": "window-actions",
"title": "Window Actions",
"description": "Search and run Loop window actions",
"mode": "view",

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.

P2 The repository requires every extension with a view command to add a metadata/ folder with Raycast-styled screenshots. This manifest adds two view commands, but this extension has no screenshots. Add the required Store images before merging.

Rule Used: What: Extensions with view-type commands must include a metadata/ folder containing Raycast-styled screenshots. Why: Professional metadata images ensure extensions appear polished and consistent in the Raycast store. Good: ``` my-extension/ ├── m... (source)

Knowledge Base Used: Extension metadata and visual assets

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/loop-window-control/package.json
Line: 21

Comment:
The repository requires every extension with a view command to add a `metadata/` folder with Raycast-styled screenshots. This manifest adds two view commands, but this extension has no screenshots. Add the required Store images before merging.

**Rule Used:** What: Extensions with view-type commands must include a `metadata/` folder containing Raycast-styled screenshots.  Why: Professional metadata images ensure extensions appear polished and consistent in the Raycast store.  Good: ``` my-extension/ ├── m... ([source](https://app.greptile.com/raycast/-/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))

**Knowledge Base Used:** [Extension metadata and visual assets](https://app.greptile.com/raycast/-/custom-context/knowledge-base/raycast/extensions/-/docs/extension-metadata-and-assets.md)

---

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!

Comment on lines +13 to +16
export interface LoopPreferences {
appPath?: string;
focusDelay?: string;
}

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.

P2 The repository says not to copy preference or command argument types by hand because Raycast generates them from the manifest. LoopPreferences duplicates both preferences, and run-keybind.ts also copies the name argument shape. Use the generated types so manifest changes cannot leave source types stale.

Rule Used: What: Don't manually define Preferences for getPreferenceValues() or commends Argument interfaces; they're auto-generated in raycast-env.d.ts when the extension runs. Why: Manual definitions can become out of sync with your actual configurat... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/loop-window-control/src/lib/loop.ts
Line: 13-16

Comment:
The repository says not to copy preference or command argument types by hand because Raycast generates them from the manifest. `LoopPreferences` duplicates both preferences, and `run-keybind.ts` also copies the `name` argument shape. Use the generated types so manifest changes cannot leave source types stale.

**Rule Used:** What: Don't manually define `Preferences` for `getPreferenceValues()` or commends `Argument` interfaces; they're auto-generated in `raycast-env.d.ts` when the extension runs.  Why: Manual definitions can become out of sync with your actual configurat... ([source](https://app.greptile.com/raycast/-/custom-context?memory=d93fc9fb-a45d-4479-a6a4-b1b4af98ebc8))

---

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!

Comment on lines +59 to +63
if (info.CFBundleIdentifier?.toLowerCase() !== BUNDLE_ID.toLowerCase())
throw new Error("The selected application is not Loop. Check the application path.");
if (!info.CFBundleURLTypes?.some((type) => type.CFBundleURLSchemes?.includes("loop")))
throw new Error("This version does not declare the loop:// URL scheme. Update Loop.");
return { appPath, version: info.CFBundleShortVersionString || "Unknown" };

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.

P2 inspectInstallation reads CFBundleShortVersionString but never checks the documented 1.4.2 minimum. An older Loop build that declares the URL scheme passes setup and receives catalog actions it may not support. Compare the version and show the update error before closing Raycast.

Knowledge Base Used: Extension command implementation patterns

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/loop-window-control/src/lib/transport.ts
Line: 59-63

Comment:
`inspectInstallation` reads `CFBundleShortVersionString` but never checks the documented 1.4.2 minimum. An older Loop build that declares the URL scheme passes setup and receives catalog actions it may not support. Compare the version and show the update error before closing Raycast.

**Knowledge Base Used:** [Extension command implementation patterns](https://app.greptile.com/raycast/-/custom-context/knowledge-base/raycast/extensions/-/docs/extension-command-implementation.md)

---

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

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants