Add designlang extension#27449
Conversation
Open-source extension that runs designlang against any URL — extracting DTCG tokens, Tailwind config, CSS variables, Figma variables, and a single agent-native DESIGN.md. Three commands: Extract Design From URL, Score Website Design, Copy CLI Command For URL. Source: https://github.com/Manavarya09/design-extract Web: https://designlang.app
|
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 10-15 business days. Once the PR is approved and merged, the extension will be available on our Store. |
Greptile SummaryThis PR adds a new Confidence Score: 4/5Not safe to merge until the required One P1 finding (missing metadata folder, a hard Raycast store requirement for view commands) caps the score at 4. The two P2s (manual Arguments type, preference title case) are minor style issues that don't affect runtime behavior. extensions/designlang/package.json — view-type commands require a metadata/ folder with screenshots before store submission Important Files Changed
Prompt To Fix All With AIThis is a comment left during a code review.
Path: extensions/designlang/package.json
Line: 11-23
Comment:
**Missing `metadata/` folder with screenshots**
Both `extract` and `score` are `mode: "view"` commands. Per the Raycast store guidelines, every extension with view-type commands must ship a `metadata/` folder containing Raycast-styled screenshots (1600×1000 PNG). Without this folder the extension will be rejected during store review.
**Rule Used:** What: Extensions with view-type commands must incl... ([source](https://app.greptile.com/review/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))
How can I resolve this? If you propose a fix, please make it concise.
---
This is a comment left during a code review.
Path: extensions/designlang/src/copy-cli.tsx
Line: 3
Comment:
**Manual Arguments type — use the auto-generated interface**
`{ arguments: { url?: string } }` is hand-written. Argument interfaces for `LaunchProps` are auto-generated in `raycast-env.d.ts` when the extension builds; use `Arguments.CopyCli` so the type stays in sync with `package.json` automatically.
```suggestion
export default async function Command(props: LaunchProps<Arguments.CopyCli>) {
```
**Rule Used:** What: Don't manually define `Preferences` for `get... ([source](https://app.greptile.com/review/custom-context?memory=d93fc9fb-a45d-4479-a6a4-b1b4af98ebc8))
How can I resolve this? If you propose a fix, please make it concise.
---
This is a comment left during a code review.
Path: extensions/designlang/package.json
Line: 43
Comment:
**Preference title should be Title Case**
`"Output directory"` should follow Title Case to match the convention for user-facing Raycast preference labels.
```suggestion
"title": "Output Directory",
```
**Rule Used:** What: Use title case for titles in `package.json`.... ([source](https://app.greptile.com/review/custom-context?memory=a44fb089-4d03-4b60-a4ff-03431cdf0eb4))
How can I resolve this? If you propose a fix, please make it concise.Reviews (2): Last reviewed commit: "Address Greptile review feedback" | Re-trigger Greptile |
| @@ -0,0 +1,12 @@ | |||
| import { Clipboard, LaunchProps, showHUD, showToast, Toast } from "@raycast/api"; | |||
|
|
|||
| export default async function Command(props: LaunchProps<{ arguments: { url?: string } }>) { | |||
There was a problem hiding this comment.
URL argument not declared — command always fails
props.arguments?.url is accessed here, but the copy-cli command has no arguments entry in package.json. Raycast only populates props.arguments for arguments explicitly declared in the manifest, so props.arguments?.url will always be undefined, the guard on line 5 will always fire, and the command will always toast "No URL provided" — it can never actually copy anything.
Add an arguments block to the copy-cli command in package.json:
{
"name": "copy-cli",
"title": "Copy CLI Command For URL",
"description": "Copy `npx designlang <url>` to your clipboard.",
"mode": "no-view",
"arguments": [
{
"name": "url",
"placeholder": "https://stripe.com",
"type": "text",
"required": true
}
]
}Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/designlang/src/copy-cli.tsx
Line: 3
Comment:
**URL argument not declared — command always fails**
`props.arguments?.url` is accessed here, but the `copy-cli` command has no `arguments` entry in `package.json`. Raycast only populates `props.arguments` for arguments explicitly declared in the manifest, so `props.arguments?.url` will always be `undefined`, the guard on line 5 will always fire, and the command will always toast "No URL provided" — it can never actually copy anything.
Add an `arguments` block to the `copy-cli` command in `package.json`:
```json
{
"name": "copy-cli",
"title": "Copy CLI Command For URL",
"description": "Copy `npx designlang <url>` to your clipboard.",
"mode": "no-view",
"arguments": [
{
"name": "url",
"placeholder": "https://stripe.com",
"type": "text",
"required": true
}
]
}
```
How can I resolve this? If you propose a fix, please make it concise.- Add arguments block to copy-cli command (was reading props.arguments?.url with no manifest declaration, command would always fail) - Remove unused @raycast/utils dependency - Use auto-generated Preferences.Extract type instead of manual Prefs alias - Title-case the extension title (designlang → Designlang) - Add CHANGELOG.md per Raycast store requirements
|
Thanks for the thorough review @greptile-apps! All four findings addressed in the latest commit:
Re: the |
Mirrors the fixes pushed to the PR branch: - arguments block on copy-cli - drop @raycast/utils - Preferences.Extract instead of manual Prefs - Designlang title-case - CHANGELOG.md
| "commands": [ | ||
| { | ||
| "name": "extract", | ||
| "title": "Extract Design From URL", | ||
| "description": "Run designlang on a URL and open the output folder.", | ||
| "mode": "view" | ||
| }, | ||
| { | ||
| "name": "score", | ||
| "title": "Score Website Design", | ||
| "description": "Rate a site's design-system quality (7 categories, A–F).", | ||
| "mode": "view" | ||
| }, |
There was a problem hiding this comment.
Missing
metadata/ folder with screenshots
Both extract and score are mode: "view" commands. Per the Raycast store guidelines, every extension with view-type commands must ship a metadata/ folder containing Raycast-styled screenshots (1600×1000 PNG). Without this folder the extension will be rejected during store review.
Rule Used: What: Extensions with view-type commands must incl... (source)
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/designlang/package.json
Line: 11-23
Comment:
**Missing `metadata/` folder with screenshots**
Both `extract` and `score` are `mode: "view"` commands. Per the Raycast store guidelines, every extension with view-type commands must ship a `metadata/` folder containing Raycast-styled screenshots (1600×1000 PNG). Without this folder the extension will be rejected during store review.
**Rule Used:** What: Extensions with view-type commands must incl... ([source](https://app.greptile.com/review/custom-context?memory=87059ac1-c601-487f-9f1c-bce8a3cb6209))
How can I resolve this? If you propose a fix, please make it concise.
Description
Adds
designlang— an open-source CLI that reverse-engineers any website into a complete design system. The Raycast extension exposes the three most-used surfaces:npx designlang <url>to clipboard.Why people will use this
designlang has 1.6k GitHub stars and 5K+ npm downloads. It outputs:
DESIGN.md(8-section, YAML front matter, open spec)For Raycast users who design or build UIs, this is "extract Stripe's design system in a single keystroke."
Implementation notes
outputDir) — defaults to~/designlang-output.extractandscoreareviewcommands that show progress + result inline.copy-cliis ano-viewcommand (just copies to clipboard).npx designlangunder the hood — no system dependency beyond Node +npx(already required by Raycast for many extensions).Screenshots
I'll add demo GIFs after a maintainer reviews the structure — happy to follow whatever format you prefer (1600×1000 PNGs in
metadata/per CONTRIBUTING.md, animated GIFs, or both).Source
Happy to iterate on the README, command names, or preferences shape — first time contributing here so flag anything off-pattern.