Token导航 LogoToken导航

Agent Skill · 研究检索

route-scaffolder(路线脚手架)

route-scaffolder 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

route-scaffolder 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 68,015。

总安装 238周安装 10GitHub Stars 公开资料未说明下载 83核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:route-scaffolder(路线脚手架)
来源仓库:https://github.com/code-visionary/react-router-skills
仓库路径:skills/route-scaffolder
安装命令:
npx skills add https://github.com/code-visionary/react-router-skills --skill route-scaffolder
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/code-visionary/react-router-skills --skill route-scaffolder

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

route-scaffolder 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词快速定位候选结果时使用。它适用于路由脚手架研究、React Router 开发或解决方案筛选等场景,可辅助 Agent 完成信息收集任务。

通过 npx skills add 命令从指定 GitHub 仓库安装,具体用法需结合原始 README 进一步确认。安装前建议确认权限范围和维护状态,注意可能触发联网或文件读写操作,避免影响系统安全。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/route-scaffolder

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/code-visionary/react-router-skills --skill rou…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

route-scaffolder 怎么安装?

在终端执行 npx skills add https://github.com/code-visionary/react-router-skills --skill route-scaffol…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

route-scaffolder 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

route-scaffolder 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

route-scaffolder 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

route-scaffolder 用的人多吗?

公开数据是累计安装 238 次,近一周安装 10 次,下载 83 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

route-scaffolder 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
route-scaffolder

路线脚手架 · 本页

238—需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Route Scaffolder

Quickly scaffold complete CRUD (Create, Read, Update, Delete) routes for React Router v7 applications following best practices and conventions.

Quick Reference

Basic Route Structure

app/routes/
├── users/
│   ├── route.tsx           # Layout (optional)
│   ├── _index/            # List route
│   │   ├── route.tsx
│   │   └── loader.ts
│   ├── $userId/           # Details route
│   │   ├── route.tsx
│   │   └── loader.ts
│   ├── new/               # Create route
│   │   ├── route.tsx
│   │   └── action.ts
│   └── $userId.edit/      # Edit route
│       ├── route.tsx
│       ├── loader.ts
│       └── action.ts

Route Configuration

// app/routes.ts
import { type RouteConfig, route, layout, index } from "@react-router/dev/routes";

export default [
  layout("routes/users/route.tsx", [
    index("routes/users/_index/route.tsx"),
    route("new", "routes/users/new/route.tsx"),
    route(":userId", "routes/users/$userId/route.tsx"),
    route(":userId/edit", "routes/users/$userId.edit/route.tsx"),
  ]),
] satisfies RouteConfig;

When to Use This Skill

  • Creating new entity CRUD operations
  • Scaffolding admin interfaces
  • Building data management pages
  • Setting up resource routes
  • Establishing consistent route patterns

CRUD Route Patterns

1. List Route (Index)

Purpose: Display all items, with search/filter/pagination

File: routes/users/_index/route.tsx

import type { LoaderFunctionArgs } from "react-router";
import { useLoaderData, Link } from "react-router";

// Loader
export async function loader({ request }: LoaderFunctionArgs) {
  const url = new URL(request.url);
  const search = url.searchParams.get("q") || "";
  const page = Number(url.searchParams.get("page")) || 1;

  const users = await fetchUsers({ search, page });

  return { users, search, page };
}

// Component
export default function UsersList() {
  const { users, search } = useLoaderData<typeof loader>();

  return (
    <div>
      <div className="header">
        <h1>Users</h1>
        <Link to="/users/new">Create User</Link>
      </div>

      <input
        type="search"
        name="q"
        defaultValue={search}
        placeholder="Search users..."
      />

      <table>
        <thead>
          <tr>
            <th>Name</th>
            <th>Email</th>
            <th>Actions</th>
          </tr>
        </thead>
        <tbody>
          {users.map(user => (
            <tr key={user.id}>
              <td>{user.name}</td>
              <td>{user.email}</td>
              <td>
                <Link to={`/users/${user.id}`}>View</Link>
                <Link to={`/users/${user.id}/edit`}>Edit</Link>
              </td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

2. Create Route

Purpose: Form to create new item

File: routes/users/new/route.tsx

import type { ActionFunctionArgs } from "react-router";
import { Form, redirect, useActionData } from "react-router";
import { z } from "zod";

// Validation schema
const createUserSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
});

// Action
export async function action({ request }: ActionFunctionArgs) {
  const formData = await request.formData();

  const result = createUserSchema.safeParse({
    name: formData.get("name"),
    email: formData.get("email"),
  });

  if (!result.success) {
    return {
      errors: result.error.flatten().fieldErrors,
    };
  }

  const user = await createUser(result.data);

  return redirect(`/users/${user.id}`);
}

// Component
export default function CreateUser() {
  const actionData = useActionData<typeof action>();

  return (
    <div>
      <h1>Create User</h1>

      <Form method="post">
        <div>
          <label htmlFor="name">Name</label>
          <input type="text" id="name" name="name" required />
          {actionData?.errors?.name && (
            <span className="error">{actionData.errors.name[0]}</span>
          )}
        </div>

        <div>
          <label htmlFor="email">Email</label>
          <input type="email" id="email" name="email" required />
          {actionData?.errors?.email && (
            <span className="error">{actionData.errors.email[0]}</span>
          )}
        </div>

        <button type="submit">Create User</button>
      </Form>
    </div>
  );
}

3. Details Route

Purpose: Display single item details

File: routes/users/$userId/route.tsx

import type { LoaderFunctionArgs } from "react-router";
import { useLoaderData, Link } from "react-router";

// Loader
export async function loader({ params }: LoaderFunctionArgs) {
  const user = await fetchUser(params.userId);

  if (!user) {
    throw new Response("Not Found", { status: 404 });
  }

  return { user };
}

// Component
export default function UserDetails() {
  const { user } = useLoaderData<typeof loader>();

  return (
    <div>
      <div className="header">
        <h1>{user.name}</h1>
        <div>
          <Link to="edit">Edit</Link>
          <Link to="/users">Back to List</Link>
        </div>
      </div>

      <dl>
        <dt>Email</dt>
        <dd>{user.email}</dd>

        <dt>Created</dt>
        <dd>{new Date(user.createdAt).toLocaleDateString()}</dd>
      </dl>
    </div>
  );
}

4. Edit Route

Purpose: Form to update existing item

File: routes/users/$userId.edit/route.tsx

import type { LoaderFunctionArgs, ActionFunctionArgs } from "react-router";
import { useLoaderData, Form, redirect, useActionData } from "react-router";
import { z } from "zod";

// Validation schema
const updateUserSchema = z.object({
  name: z.string().min(2),
  email: z.string().email(),
});

// Loader - get current data
export async function loader({ params }: LoaderFunctionArgs) {
  const user = await fetchUser(params.userId);

  if (!user) {
    throw new Response("Not Found", { status: 404 });
  }

  return { user };
}

// Action - handle update
export async function action({ request, params }: ActionFunctionArgs) {
  const formData = await request.formData();

  const result = updateUserSchema.safeParse({
    name: formData.get("name"),
    email: formData.get("email"),
  });

  if (!result.success) {
    return {
      errors: result.error.flatten().fieldErrors,
    };
  }

  await updateUser(params.userId, result.data);

  return redirect(`/users/${params.userId}`);
}

// Component
export default function EditUser() {
  const { user } = useLoaderData<typeof loader>();
  const actionData = useActionData<typeof action>();

  return (
    <div>
      <h1>Edit User</h1>

      <Form method="post">
        <div>
          <label htmlFor="name">Name</label>
          <input
            type="text"
            id="name"
            name="name"
            defaultValue={user.name}
            required
          />
          {actionData?.errors?.name && (
            <span className="error">{actionData.errors.name[0]}</span>
          )}
        </div>

        <div>
          <label htmlFor="email">Email</label>
          <input
            type="email"
            id="email"
            name="email"
            defaultValue={user.email}
            required
          />
          {actionData?.errors?.email && (
            <span className="error">{actionData.errors.email[0]}</span>
          )}
        </div>

        <button type="submit">Save Changes</button>
      </Form>
    </div>
  );
}

5. Delete Action (Optional)

Add delete functionality to details or edit routes:

export async function action({ request, params }: ActionFunctionArgs) {
  const formData = await request.formData();
  const intent = formData.get("intent");

  if (intent === "delete") {
    await deleteUser(params.userId);
    return redirect("/users");
  }

  // Handle other actions...
}

// In component
<Form method="post">
  <input type="hidden" name="intent" value="delete" />
  <button type="submit">Delete User</button>
</Form>

Layout Routes

Use layout routes to share UI across child routes:

// routes/users/route.tsx
import { Outlet } from "react-router";

export default function UsersLayout() {
  return (
    <div className="users-layout">
      <nav>
        <Link to="/users">Users</Link>
        {/* Other navigation */}
      </nav>

      <main>
        <Outlet /> {/* Child routes render here */}
      </main>
    </div>
  );
}

Advanced Patterns

1. Nested Resources

// app/routes.ts
export default [
  layout("routes/users/route.tsx", [
    index("routes/users/_index/route.tsx"),
    route(":userId", "routes/users/$userId/route.tsx", [
      // Nested posts under user
      route("posts", "routes/users/$userId/posts/route.tsx"),
      route("posts/:postId", "routes/users/$userId/posts/$postId/route.tsx"),
    ]),
  ]),
] satisfies RouteConfig;

2. Search/Filter Routes

export async function loader({ request }: LoaderFunctionArgs) {
  const url = new URL(request.url);

  // Parse query params
  const filters = {
    search: url.searchParams.get("q") || "",
    status: url.searchParams.get("status") || "all",
    page: Number(url.searchParams.get("page")) || 1,
    sort: url.searchParams.get("sort") || "name",
  };

  const users = await fetchUsers(filters);

  return { users, filters };
}

3. Bulk Actions

export async function action({ request }: ActionFunctionArgs) {
  const formData = await request.formData();
  const intent = formData.get("intent");

  if (intent === "bulk-delete") {
    const ids = formData.getAll("ids");
    await deleteUsers(ids);
    return { success: true };
  }

  // Other intents...
}

// In component
<Form method="post">
  <input type="hidden" name="intent" value="bulk-delete" />
  {users.map(user => (
    <label key={user.id}>
      <input type="checkbox" name="ids" value={user.id} />
      {user.name}
    </label>
  ))}
  <button type="submit">Delete Selected</button>
</Form>

Scaffolding Checklist

When creating complete CRUD routes:

  • Create list route (_index)
  • Create details route ($id)
  • Create create route (new)
  • Create edit route ($id.edit)
  • Add delete functionality (optional)
  • Register routes in app/routes.ts
  • Add navigation links
  • Implement validation with Zod
  • Add error handling
  • Add loading states
  • Test all routes

Best Practices

  • Use consistent naming conventions
  • Follow React Router file conventions
  • Validate all form inputs with Zod
  • Handle errors with error boundaries
  • Use TypeScript for type safety
  • Add loading states with useNavigation
  • Implement optimistic UI where appropriate
  • Use intent-based actions for multiple operations
  • Add breadcrumbs for deep navigation
  • Include pagination for large lists

Anti-Patterns

Things to avoid:

  • ❌ Inconsistent route naming
  • ❌ Missing validation in actions
  • ❌ Not handling 404 errors
  • ❌ Fetching data in components (use loaders)
  • ❌ Mutating data in loaders
  • ❌ Not using TypeScript types
  • ❌ Forgetting to register routes
  • ❌ Overly complex route nesting

References

平台分布

Codex

34.09%
按下载量换算28

Claude

31.66%
按下载量换算26

Cursor

17.7%
按下载量换算15

Gemini CLI

8.21%
按下载量换算7

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills