Skip to content

feat: add Raycast extension development skill#25

Merged
enuno merged 1 commit intomainfrom
feature/raycast-skill
Jan 27, 2026
Merged

feat: add Raycast extension development skill#25
enuno merged 1 commit intomainfrom
feature/raycast-skill

Conversation

@enuno
Copy link
Owner

@enuno enuno commented Jan 27, 2026

User description

Summary

🤖 Generated with Nori

  • Created comprehensive Raycast skill for extension development
  • Extracted 99 pages from official Raycast documentation using skill-seekers
  • Generated config file at configs/raycast.json with 8 categories and 400 max pages
  • Produced SKILL.md (118 lines) with 5 code examples and 12 reference files
  • Quality score: 23/25 (92%) ✅ PASSED

Documentation Coverage

API Reference (31 pages):

  • Environment, Clipboard, Storage, Keyboard
  • OAuth, Preferences, Window Management
  • Cache, Browser, Command

UI Components (17 pages):

  • List, ActionPanel, Form, Detail, Grid
  • Colors, Icons, Navigation
  • Alert, Toast, HUD

Additional Sections:

  • Getting started (2 pages)
  • Extension development (6 pages)
  • Utilities (8 pages)
  • Examples and teams (2 pages)
  • Best practices (2 pages)

Test Plan

  • Config JSON validates successfully (jq empty configs/raycast.json)
  • Source accessibility verified (HTTP/2 200)
  • Disk space adequate (234GB available)
  • SKILL.md structure validated (7 sections, 118 lines)
  • Quality score calculated: 23/25 (92%)
  • Examples present: 5 code examples
  • Activation triggers: 5 clear conditions
  • Reference files: 12 categorized files

Output Location

INTEGRATION/incoming/raycast/

Share Nori with your team: https://www.npmjs.com/package/nori-ai


PR Type

Enhancement


Description

  • Add comprehensive Raycast extension development skill with 99 pages

  • Extract documentation covering API reference, UI components, utilities

  • Generate configuration file with 8 categories and 400 max pages

  • Create SKILL.md with 5 code examples and 12 reference files


Diagram Walkthrough

flowchart LR
  A["Raycast Documentation"] -->|Extract 99 pages| B["skill-seekers"]
  B -->|Generate| C["configs/raycast.json"]
  B -->|Generate| D["SKILL.md"]
  B -->|Generate| E["Reference Files"]
  E -->|8 categories| F["API, UI, Utilities, etc."]
  C -->|Configuration| G["Raycast Skill"]
  D -->|Documentation| G
  F -->|Content| G
Loading

File Walkthrough

Relevant files
Documentation
13 files
extension_development.md
Extension development manifest and publishing guide           
+479/-0 
utilities.md
AI, system utilities, and React hooks documentation           
+733/-0 
getting_started.md
First extension creation and utils installation guide       
+200/-0 
best_practices.md
Lifecycle, security, and extension best practices               
+116/-0 
examples.md
Command templates and extension boilerplate examples         
+115/-0 
SKILL.md
Raycast skill overview with quick reference patterns         
+118/-0 
index.md
Documentation index with category and page counts               
+39/-0   
teams.md
Team collaboration and private extension guide                     
+17/-0   
llms.md
LLM-formatted documentation file reference                             
+3/-0     
api.md
Complete API reference documentation file                               
+3/-0     
llms-full.md
Full LLM-formatted documentation archive                                 
+3/-0     
other.md
Additional documentation sections and guides                         
+3/-0     
ui_components.md
UI components API reference and examples                                 
+2988/-0
Configuration changes
1 files
raycast.json
Raycast documentation scraper configuration file                 
+111/-0 

Create comprehensive Raycast skill for extension development using
skill-seekers with custom config. Extracted 99 pages from official
documentation covering:

- Getting started and extension development basics
- API reference (31 pages) - environment, clipboard, storage, etc.
- UI components (17 pages) - List, ActionPanel, Form, Detail, Grid
- Utilities (8 pages) - AI, feedback, keyboard shortcuts
- Teams and examples
- Best practices

Generated SKILL.md (118 lines) with 5 code examples and 12 reference
files organized by category. Quality score: 23/25 (92%).

Config file: configs/raycast.json
- base_url: https://developers.raycast.com/
- 13 start_urls covering main documentation sections
- 8 categories for logical organization
- 400 max_pages for comprehensive coverage
- 0.5s rate limiting

Output location: INTEGRATION/incoming/raycast/
🤖 Generated with [Nori](https://nori.ai)

Co-Authored-By: Nori <contact@tilework.tech>
@github-actions
Copy link

🔍 PR Validation Report

Status: ✅ All Checks Passed

Changes Summary

Type Count
Commands 0
Agents 0
Skills 0
Documentation 13
Workflows 0

This is an automated validation. Issues are advisory and do not block merging.
Full logs available in workflow artifacts

@gemini-code-assist
Copy link

Summary of Changes

Hello @enuno, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a new, automatically generated skill designed to assist developers with Raycast extension development. It consolidates a vast amount of official documentation into an easily accessible format, complete with code examples and structured references. The primary goal is to streamline the development process for Raycast extensions by providing a centralized and comprehensive knowledge base.

Highlights

  • New Raycast Extension Development Skill: A comprehensive skill for Raycast extension development has been added, providing extensive documentation and examples.
  • Automated Documentation Extraction: The skill was generated by extracting 99 pages from the official Raycast documentation, ensuring up-to-date and accurate information.
  • Configuration and Structure: A new configuration file, configs/raycast.json, was created, and a SKILL.md file was generated, detailing usage, code examples, and reference files.
  • Quality Assurance: The generated skill passed a quality score check with 92%, indicating high reliability and completeness.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@qodo-code-review
Copy link

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Secret exposure guidance

Description: The getAccessToken example renders the access token into UI output (markdown={</code>Access
token: ${token}<code>}
), which can normalize or encourage secret disclosure in extensions
(e.g., tokens appearing on-screen, in screenshots, logs, or AI context) and should be
replaced with a redacted/safer pattern.
utilities.md [720-731]

Referred Code
Example 2 (tsx):
```tsx
import { Detail } from "@raycast/api";
import { authorize } from "./oauth";

function AuthorizedComponent() {
  const { token } = getAccessToken();
  return <Detail markdown={`Access token: ${token}`} />;
}

export default withAccessToken({ authorize })(AuthorizedComponent);

</details></details></td></tr>
<tr><td colspan='2'><strong>Ticket Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary>🎫 <strong>No ticket provided </strong></summary>


- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
<tr><td colspan='2'><strong>Codebase Duplication Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary><strong>Codebase context is not defined </strong></summary>


Follow the <a href='https://qodo-merge-docs.qodo.ai/core-abilities/rag_context_enrichment/'>guide</a> to enable codebase context checks.

</details></td></tr>
<tr><td colspan='2'><strong>Custom Compliance</strong></td></tr>
<tr><td rowspan=5>🟢</td><td>
<details><summary><strong>Generic: Comprehensive Audit Trails</strong></summary><br>

**Objective:** To create a detailed and reliable record of critical system actions for security analysis <br>and compliance.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Meaningful Naming and Self-Documenting Code</strong></summary><br>

**Objective:** Ensure all identifiers clearly express their purpose and intent, making code <br>self-documenting<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Robust Error Handling and Edge Case Management</strong></summary><br>

**Objective:** Ensure comprehensive error handling that provides meaningful context and graceful <br>degradation<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Secure Error Handling</strong></summary><br>

**Objective:** To prevent the leakage of sensitive system information through error messages while <br>providing sufficient detail for internal debugging.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Secure Logging Practices</strong></summary><br>

**Objective:** To ensure logs are useful for debugging and auditing without exposing sensitive <br>information like PII, PHI, or cardholder data.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td rowspan=1>🔴</td>
<td><details>
<summary><strong>Generic: Security-First Input Validation and Data Handling</strong></summary><br>

**Objective:** Ensure all data inputs are validated, sanitized, and handled securely to prevent <br>vulnerabilities<br>

**Status:** <br><a href='https://github.com/enuno/claude-command-and-control/pull/25/files#diff-2d9d4f20b76b3ba6adc94914374ec69ddc7bfc8fdafd8768fc1730fea7d3bd9fR720-R731'><strong>Token exposure example</strong></a>: The documentation includes an example that renders an access token in a user-facing <code>Detail</code> <br>view (<code>Access token: ${token}</code>), which encourages insecure handling/exposure of sensitive <br>credentials.<br>
<details open><summary>Referred Code</summary>

```markdown
Example 2 (tsx):
```tsx
import { Detail } from "@raycast/api";
import { authorize } from "./oauth";

function AuthorizedComponent() {
  const { token } = getAccessToken();
  return <Detail markdown={`Access token: ${token}`} />;
}

export default withAccessToken({ authorize })(AuthorizedComponent);

</details>

> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>

<tr><td align="center" colspan="2">

<!-- placeholder --> <!-- /compliance --update_compliance=true -->

</td></tr></tbody></table>
<details><summary>Compliance status legend</summary>
🟢 - Fully Compliant<br>
🟡 - Partial Compliant<br>
🔴 - Not Compliant<br>
⚪ - Requires Further Human Verification<br>
🏷️ - Compliance label<br>
</details>

@qodo-code-review
Copy link

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
Avoid committing generated documentation into Git

Avoid committing large volumes of scraped documentation into the repository.
Instead, fetch this content from its source at runtime or during a build step to
prevent repository bloat and outdated information.

Examples:

INTEGRATION/incoming/raycast/references/ui_components.md [1-2989]
# Raycast - Ui Components

**Pages:** 17

---

## Grid

**URL:** llms-txt#grid


 ... (clipped 2978 lines)
INTEGRATION/incoming/raycast/references/api.md [1-3]
version https://git-lfs.github.com/spec/v1
oid sha256:54baf38e4f3fbafefe76d7a75aa86b5b369730c13059a906421b04b21c3691b6
size 311531

Solution Walkthrough:

Before:

// Repository structure with generated files
/INTEGRATION/incoming/raycast/
├── SKILL.md
├── configs/
│   └── raycast.json
└── references/
    ├── api.md (Git LFS pointer)
    ├── ui_components.md
    ├── extension_development.md
    ├── utilities.md
    ├── ... (many more generated markdown files)

After:

// Repository structure without generated files
/INTEGRATION/incoming/raycast/
├── scripts/
│   └── fetch_documentation.js // Script to fetch docs at build/runtime
└── configs/
    └── raycast.json // Configuration for the fetch script

// The 'references' directory and its content are not committed.
// They are generated dynamically and added to a .gitignore'd build folder
// or fetched on-demand by the application.

Suggestion importance[1-10]: 10

__

Why: The suggestion correctly identifies a major architectural flaw in committing large, generated documentation files, which bloats the repository and creates maintenance issues.

High
General
Refactor data fetching logic for clarity

Refactor the data fetching logic in the code example to be more explicit and
robust by removing the complex useEffect and calling loadNextPage directly from
within onLoadMore and a new useEffect that handles search text changes.

INTEGRATION/incoming/raycast/references/ui_components.md [399-423]

-const onLoadMore = useCallback(() => {
-  setState((previous) => ({ ...previous, nextPage: previous.nextPage + 1 }));
-}, []);
+const onLoadMore = useCallback(async () => {
+  cancelRef.current?.abort();
+  cancelRef.current = new AbortController();
+  const nextPage = state.nextPage + 1;
+  setState((previous) => ({ ...previous, nextPage }));
+  await loadNextPage(state.searchText, nextPage, cancelRef.current.signal);
+}, [loadNextPage, state.searchText, state.nextPage]);
 
 const onSearchTextChange = useCallback(
   (searchText: string) => {
-    if (searchText === state.searchText) return;
     setState((previous) => ({
       ...previous,
       data: [],
       nextPage: 0,
+      hasMore: true,
       searchText,
     }));
   },
-  [state.searchText]
+  []
 );
 
 useEffect(() => {
   cancelRef.current?.abort();
   cancelRef.current = new AbortController();
-  loadNextPage(state.searchText, state.nextPage, cancelRef.current?.signal);
+  loadNextPage(state.searchText, 0, cancelRef.current.signal);
   return () => {
     cancelRef.current?.abort();
   };
-}, [loadNextPage, state.searchText, state.nextPage]);
+}, [loadNextPage, state.searchText]);

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a complex data fetching pattern in a code example and proposes a more robust and explicit alternative, improving the quality and educational value of the documentation.

Medium
Possible issue
Correct async return type and method

Correct the async function's return type to be a Promise and use find() instead
of filter() to align with the function's intended behavior of returning a single
application.

INTEGRATION/incoming/raycast/references/utilities.md [361-365]

 // it is a lot more reliable to get an app by its bundle ID than its path
-async function findApplication(bundleId: string): Application | undefined {
+async function findApplication(bundleId: string): Promise<Application | undefined> {
   const installedApplications = await getApplications();
-  return installedApplications.filter((application) => application.bundleId == bundleId);
+  return installedApplications.find((application) => application.bundleId === bundleId);
 }
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion corrects two significant errors in the documentation's example code, ensuring the provided findApplication function is both syntactically correct and logically sound.

Medium
Fix broken markdown in table

Fix invalid markdown for the dark theme icon example in the "Command properties"
table by removing the angle brackets from icon@dark.png.

INTEGRATION/incoming/raycast/references/extension_development.md [60]

-| icon                                          | <p>An optional reference to an icon file in the assets folder. Use png format with a size of at least 512 x 512 pixels. To support light and dark theme, add two icons, one with <code>@dark</code> as suffix, e.g. <code>icon.png</code> and <code><icon@dark.png></code>.</p><p>If no icon is specified, the extension icon will be used.</p>                                                                                          |
+| icon                                          | <p>An optional reference to an icon file in the assets folder. Use png format with a size of at least 512 x 512 pixels. To support light and dark theme, add two icons, one with <code>@dark</code> as suffix, e.g. <code>icon.png</code> and <code>icon@dark.png</code>.</p><p>If no icon is specified, the extension icon will be used.</p>                                                                                          |
  • Apply / Chat
Suggestion importance[1-10]: 4

__

Why: The suggestion correctly identifies and fixes invalid markdown syntax (<code><icon@dark.png></code>) within a table, which would cause rendering issues in the documentation.

Low
  • More

@enuno enuno merged commit 9170e90 into main Jan 27, 2026
4 checks passed
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a new Raycast skill, complete with extensive documentation extracted from the official Raycast developer docs. The overall structure is good, but I've found several issues in the generated Markdown files that need attention. My review includes feedback on invalid code examples, malformed Markdown syntax (especially with tabs), grammatical errors, and inconsistencies in document structure. One high-severity issue is a missing command in the extension publishing guide, which could block users. Addressing these points will significantly improve the quality and usability of the new skill's documentation.

Comment on lines +352 to +355
If someone contributes to your extension, or you make edits directly on GitHub, running `npm run publish` will fail until you run

in your git repository. This will merge the contributions with your code, asking you to fix the conflicts if any.
{% endhint %}

Choose a reason for hiding this comment

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

high

This part of the documentation is missing a command. It states that npm run publish will fail until a certain command is run, but the command itself is missing from the text. Based on other parts of the documentation (e.g., line 381), the missing command is likely npx @raycast/api@latest pull-contributions. Please add the command to make the instructions clear.

Comment on lines +59 to +62
"default": {
"macOS": "foo",
"Windows": "bar"
}

Choose a reason for hiding this comment

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

medium

This JSON code example is invalid because it's missing the enclosing curly braces {}. To be a valid JSON object, the content should be wrapped in {}.

Suggested change
"default": {
"macOS": "foo",
"Windows": "bar"
}
{
"default": {
"macOS": "foo",
"Windows": "bar"
}
}

Comment on lines +20 to +26
{% tabs %}
{% tab title="View Command" %}

{% tab title="No-View Command" %}

{% endtab %}
{% endtabs %}

Choose a reason for hiding this comment

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

medium

This tabs block appears to be malformed or incomplete. The View Command tab is empty, and the No-View Command tab is nested within it, which is likely not the intended structure. The content for these tabs seems to be missing and should be added to make the documentation useful.

See the [API Reference](https://developers.raycast.com/api-reference/menu-bar-commands) for more information about customization.
{% endhint %}

A example of a no-view command which shows a simple [HUD](https://developers.raycast.com/api-reference/feedback/hud).

Choose a reason for hiding this comment

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

medium

There is a grammatical error here. "A example" should be "An example".

Suggested change
A example of a no-view command which shows a simple [HUD](https://developers.raycast.com/api-reference/feedback/hud).
An example of a no-view command which shows a simple [HUD](https://developers.raycast.com/api-reference/feedback/hud).

| title<mark style="color:red;">\*</mark> | The display name of the command, shown to the user in the Store, Preferences, and in Raycast's root search. |
| subtitle | The optional subtitle of the command in the root search. Usually, this is the service or domain that your command is associated with. You can dynamically update this property using [`updateCommandMetadata`](https://developers.raycast.com/api-reference/command#updatecommandmetadata). |
| description<mark style="color:red;">\*</mark> | It helps users understand what the command does. It will be displayed in the Store and in Preferences. |
| icon | <p>An optional reference to an icon file in the assets folder. Use png format with a size of at least 512 x 512 pixels. To support light and dark theme, add two icons, one with <code>@dark</code> as suffix, e.g. <code>icon.png</code> and <code><icon@dark.png></code>.</p><p>If no icon is specified, the extension icon will be used.</p> |

Choose a reason for hiding this comment

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

medium

The use of angle brackets within the <code> tag (<icon@dark.png>) is incorrect and will likely cause rendering issues, as they can be interpreted as HTML tags. The angle brackets should be removed.

Suggested change
| icon | <p>An optional reference to an icon file in the assets folder. Use png format with a size of at least 512 x 512 pixels. To support light and dark theme, add two icons, one with <code>@dark</code> as suffix, e.g. <code>icon.png</code> and <code><icon@dark.png></code>.</p><p>If no icon is specified, the extension icon will be used.</p> |
| icon | <p>An optional reference to an icon file in the assets folder. Use png format with a size of at least 512 x 512 pixels. To support light and dark theme, add two icons, one with <code>@dark</code> as suffix, e.g. <code>icon.png</code> and <code>icon@dark.png</code>.</p><p>If no icon is specified, the extension icon will be used.</p> |


* Fixed an issue where setting `timeout` to `0` in `runAppleScript` would not work.

* Add a new [\`executeSQL](https://developers.raycast.com/utilities/functions/executesql) function.

Choose a reason for hiding this comment

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

medium

There's a Markdown syntax error here. The backtick in [\executeSQL]` is escaped, which will prevent the link from rendering correctly. The backslash should be removed.

Suggested change
* Add a new [\`executeSQL](https://developers.raycast.com/utilities/functions/executesql) function.
* Add a new [`executeSQL`](https://developers.raycast.com/utilities/functions/executesql) function.


## Categories

### Api

Choose a reason for hiding this comment

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

medium

For consistency and correctness, the acronym "API" should be in uppercase.

Suggested change
### Api
### API

**File:** `teams.md`
**Pages:** 1

### Ui Components

Choose a reason for hiding this comment

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

medium

For consistency and correctness, the acronym "UI" should be in uppercase.

Suggested change
### Ui Components
### UI Components

Comment on lines +275 to +281
{% tabs %}
{% tab title="Find Application" %}

{% tab title="List Installed Applications" %}

{% endtab %}
{% endtabs %}

Choose a reason for hiding this comment

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

medium

This tabs block is malformed. The List Installed Applications tab is nested inside the Find Application tab, and both are empty. This appears to be a content generation error and should be corrected to reflect the intended structure and content.

onWillExecute?: (args: Parameters<T>) => void;
failureToastOptions?: Partial<Pick<Toast.Options, "title" | "primaryAction" | "message">>;
}
): AsyncState<String> & {

Choose a reason for hiding this comment

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

medium

In TypeScript, it's a best practice to use the primitive type string instead of the object wrapper type String. The use of String here should be corrected to string for type correctness.

Suggested change
): AsyncState<String> & {
): AsyncState<string> & {

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant