Token导航 LogoToken导航

Agent Skill · 研究检索

javascript-excellence(JavaScript excellence 搜索)

用于辅助 Java 项目开发、面向对象设计、Spring 生态、Maven 或 Gradle 依赖和后端工程实践。它适合让 Agent 分析类结构、设计接口、整理服务分层、生成测试或检查常见代码坏味道。使用时需要结合项目已有架构、包结构和依赖版本,不应只按通用教程改代码;涉及数据库、事务、并发或框架配置时,应先确认运行环境和回归测试范围。

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

总安装 288周安装 12GitHub Stars 公开资料未说明下载 96核验 2026-05-01

安装说明

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

安装方式

通过对话安装

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

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

命令行安装

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

skills.shnpx skills
npx skills add https://github.com/tejovanthn/rasikalife --skill javascript-excellence

这个 Skill 是做什么的

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

追求 JavaScript 代码卓越品质,涵盖性能与可维护性优化。适用于高并发或资源敏感型应用场景。javascript-excellence 属于研究检索类 Skill,可作为该场景下的辅助能力补充。使用时应结合 Profiler 工具定位具体瓶颈点。建议定期复盘重构以保持代码健康度。

安装方式:从开源项目安装,支持自定义优化规则。

来源仓库内路径:skills/javascript-excellence

上手步骤

4 步
  1. 1

    确认自己的宿主工具

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

  2. 2

    拿到安装命令

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

  3. 3

    安装后重启宿主

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

  4. 4

    按最小权限试用

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

常见问题

6 条

javascript-excellence 怎么安装?

在终端执行 npx skills add https://github.com/tejovanthn/rasikalife --skill javascript-excellence。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

javascript-excellence 支持哪些 AI 工具?

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

javascript-excellence 需要什么权限?

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

javascript-excellence 是免费的吗?

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

javascript-excellence 用的人多吗?

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

javascript-excellence 安全吗?

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

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

值得选的地方

  • 同时适配 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调用外部服务未明确有提醒
javascript-excellence

JavaScript excellence 搜索 · 本页

288—需要联网未明确通过

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

SKILL.md 原文

JavaScript Excellence

This skill embodies DHH's coding philosophy adapted for JavaScript and TypeScript - emphasizing clarity, simplicity, and expressiveness.

Core Principles

  1. Clarity over Cleverness: Code should be obvious, not clever
  2. Simplicity over Complexity: The simplest solution is usually the best
  3. Expressiveness: Code should read like prose
  4. DRY (Don't Repeat Yourself): Eliminate duplication ruthlessly
  5. Convention over Configuration: Sensible defaults, customize when needed
  6. No Premature Abstraction: Wait until patterns emerge

Language Best Practices

Use Modern JavaScript Features

✅ Do use modern syntax:

// Destructuring
const { name, email } = user;

// Spread operators
const newUser = { ...user, verified: true };

// Optional chaining
const street = user?.address?.street;

// Nullish coalescing
const name = user.name ?? "Anonymous";

// Template literals
const greeting = `Hello, ${name}!`;

❌ Don't write old-style code:

// Don't
var name = user.name ? user.name : "Anonymous";
var newUser = Object.assign({}, user, { verified: true });

Prefer Const and Let

✅ Do use const by default:

const users = await getUsers();
const total = users.length;

❌ Don't use var:

var users = await getUsers();  // No!

Use Meaningful Names

✅ Do use descriptive names:

async function sendWelcomeEmail(user: User) {
  const emailContent = buildWelcomeEmail(user);
  await emailService.send(emailContent);
}

❌ Don't use cryptic abbreviations:

async function sndWlcmEml(u: User) {  // What?
  const ec = bldWlcmEml(u);
  await es.snd(ec);
}

TypeScript Best Practices

Use Type Inference

✅ Do let TypeScript infer:

const users = await db.user.findMany();  // Type is inferred
const count = users.length;               // Type is inferred

function double(n: number) {
  return n * 2;  // Return type inferred as number
}

❌ Don't over-specify:

const users: User[] = await db.user.findMany();  // Redundant
const count: number = users.length;               // Redundant

function double(n: number): number {  // Return type unnecessary
  return n * 2;
}

Use Discriminated Unions for State

✅ Do model states explicitly:

type LoadingState<T> =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: T }
  | { status: "error"; error: Error };

function render(state: LoadingState<User>) {
  switch (state.status) {
    case "idle":
      return <div>Not started</div>;
    case "loading":
      return <div>Loading...</div>;
    case "success":
      return <div>{state.data.name}</div>;  // data is available!
    case "error":
      return <div>Error: {state.error.message}</div>;
  }
}

❌ Don't use boolean flags:

type LoadingState<T> = {
  isLoading: boolean;
  isError: boolean;
  data?: T;
  error?: Error;
};
// Can have invalid states like isLoading=true and isError=true

Keep Types Simple

✅ Do use simple types:

type User = {
  id: string;
  name: string;
  email: string;
};

type CreateUserInput = Pick<User, "name" | "email">;

❌ Don't over-engineer types:

type DeepPartial<T> = T extends object
  ? { [P in keyof T]?: DeepPartial<T[P]> }
  : T;

type RecursiveRequired<T> = {
  [P in keyof T]-?: RecursiveRequired<T[P]>;
};
// Unless you really need this complexity!

Function Patterns

Keep Functions Small and Focused

✅ Do write focused functions:

async function createUser(data: CreateUserInput) {
  const hashedPassword = await hashPassword(data.password);
  const user = await db.user.create({
    data: { ...data, password: hashedPassword }
  });
  await sendWelcomeEmail(user);
  return user;
}

async function hashPassword(password: string) {
  return bcrypt.hash(password, 10);
}

async function sendWelcomeEmail(user: User) {
  // Email logic here
}

❌ Don't write giant functions:

async function createUser(data: CreateUserInput) {
  // 200 lines of mixed concerns
  // password hashing
  // validation
  // database access
  // email sending
  // logging
  // etc.
}

Use Early Returns

✅ Do use guard clauses:

function processPayment(amount: number, user: User) {
  if (amount <= 0) {
    throw new Error("Invalid amount");
  }

  if (!user.paymentMethod) {
    throw new Error("No payment method");
  }

  if (user.balance < amount) {
    throw new Error("Insufficient balance");
  }

  // Happy path at the end
  return chargePayment(user, amount);
}

❌ Don't nest deeply:

function processPayment(amount: number, user: User) {
  if (amount > 0) {
    if (user.paymentMethod) {
      if (user.balance >= amount) {
        return chargePayment(user, amount);
      } else {
        throw new Error("Insufficient balance");
      }
    } else {
      throw new Error("No payment method");
    }
  } else {
    throw new Error("Invalid amount");
  }
}

Use Async/Await Consistently

✅ Do use async/await:

async function loadUserData(userId: string) {
  const user = await db.user.findUnique({ where: { id: userId } });
  const posts = await db.post.findMany({ where: { userId } });
  return { user, posts };
}

❌ Don't mix promises and async/await:

async function loadUserData(userId: string) {
  const user = await db.user.findUnique({ where: { id: userId } });
  return db.post.findMany({ where: { userId } }).then(posts => {
    return { user, posts };
  });
}

Object and Array Patterns

Use Destructuring

✅ Do destructure:

function createPost({ title, content, authorId }: CreatePostInput) {
  return db.post.create({
    data: { title, content, authorId }
  });
}

const { name, email } = user;
const [first, second, ...rest] = items;

Use Array Methods

✅ Do use functional array methods:

const activeUsers = users.filter(u => u.active);
const userNames = users.map(u => u.name);
const totalScore = scores.reduce((sum, score) => sum + score, 0);
const hasAdmin = users.some(u => u.role === "admin");

❌ Don't use for loops unnecessarily:

const activeUsers = [];
for (let i = 0; i < users.length; i++) {
  if (users[i].active) {
    activeUsers.push(users[i]);
  }
}

Use Object Methods

✅ Do use Object methods:

const keys = Object.keys(user);
const values = Object.values(user);
const entries = Object.entries(user);

const merged = Object.assign({}, defaults, overrides);
// Or better:
const merged = { ...defaults, ...overrides };

Error Handling

Use Try-Catch for Async

✅ Do handle errors:

async function getUser(id: string) {
  try {
    return await db.user.findUnique({ where: { id } });
  } catch (error) {
    logger.error("Failed to fetch user", { error, id });
    throw new Error("User not found");
  }
}

Create Custom Errors

✅ Do use custom error classes:

class NotFoundError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "NotFoundError";
  }
}

class ValidationError extends Error {
  constructor(message: string, public fields: string[]) {
    super(message);
    this.name = "ValidationError";
  }
}

// Usage
if (!user) {
  throw new NotFoundError("User not found");
}

Code Organization

Group Related Code

✅ Do organize by feature:

src/
  features/
    auth/
      login.ts
      signup.ts
      session.ts
    posts/
      create.ts
      list.ts
      edit.ts

❌ Don't organize by type:

src/
  controllers/
    authController.ts
    postController.ts
  services/
    authService.ts
    postService.ts
  models/
    user.ts
    post.ts

Extract Reusable Logic

✅ Do extract when patterns emerge:

// After seeing this pattern 3+ times
function requireAuth<T>(
  handler: (userId: string, input: T) => Promise<Response>
) {
  return async (input: T) => {
    const userId = await getUserId();
    if (!userId) {
      throw redirect("/login");
    }
    return handler(userId, input);
  };
}

// Use it
export const loader = requireAuth(async (userId, { params }) => {
  // userId is guaranteed to exist
});

❌ Don't abstract too early:

// Don't create "BaseController" after one use
class BaseController {
  // Generic abstraction nobody asked for
}

Comments and Documentation

Write Self-Documenting Code

✅ Do write clear code:

function calculateTotalPrice(items: CartItem[]) {
  const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  const tax = subtotal * TAX_RATE;
  return subtotal + tax;
}

❌ Don't comment obvious code:

// Calculate total price
function calc(items: CartItem[]) {
  // Sum all items
  const s = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  // Calculate tax
  const t = s * TAX_RATE;
  // Return total
  return s + t;
}

Comment the "Why", Not the "What"

✅ Do explain reasoning:

// We disable scroll lock on mobile because iOS Safari has issues
// with position:fixed when the keyboard is open. See issue #123
if (isMobile) {
  disableScrollLock();
}

❌ Don't state the obvious:

// Check if mobile
if (isMobile) {
  // Disable scroll lock
  disableScrollLock();
}

Testing Patterns

Write Readable Tests

✅ Do write clear tests:

test("creates user with hashed password", async () => {
  const input = { email: "test@example.com", password: "secret123" };

  const user = await createUser(input);

  expect(user.email).toBe(input.email);
  expect(user.password).not.toBe(input.password);
  expect(await verifyPassword(input.password, user.password)).toBe(true);
});

Test Behavior, Not Implementation

✅ Do test outcomes:

test("returns 404 when post not found", async () => {
  const response = await app.request("/posts/invalid-id");
  expect(response.status).toBe(404);
});

❌ Don't test internals:

test("calls database with correct query", async () => {
  const spy = vi.spyOn(db, "query");
  await getPost("123");
  expect(spy).toHaveBeenCalledWith({ id: "123" });
});

Anti-Patterns to Avoid

1. Callback Hell

❌ Don't nest callbacks:

getUser(userId, (error, user) => {
  if (error) return handleError(error);
  getPosts(user.id, (error, posts) => {
    if (error) return handleError(error);
    // ...more nesting
  });
});

✅ Do use async/await:

const user = await getUser(userId);
const posts = await getPosts(user.id);

2. Mutation Everywhere

❌ Don't mutate unnecessarily:

function addItem(cart: Cart, item: Item) {
  cart.items.push(item);  // Mutates input
  return cart;
}

✅ Do prefer immutability:

function addItem(cart: Cart, item: Item) {
  return {
    ...cart,
    items: [...cart.items, item]
  };
}

3. God Objects

❌ Don't create giant classes:

class UserManager {
  createUser() {}
  updateUser() {}
  deleteUser() {}
  authenticateUser() {}
  sendEmail() {}
  generateReport() {}
  // 50 more methods...
}

✅ Do use focused modules:

// user.ts
export function createUser() {}
export function updateUser() {}

// auth.ts
export function authenticate() {}

// email.ts
export function sendEmail() {}

Remember

DHH's philosophy in JavaScript:

  • Write code that reads naturally
  • Prefer simplicity over cleverness
  • Eliminate duplication
  • Keep functions small and focused
  • Use the language's features effectively
  • Don't abstract too early
  • Make invalid states unrepresentable
  • Test behavior, not implementation

Your code should be a joy to read and maintain.

平台分布

Codex

34.6%
按下载量换算33

Claude

28.71%
按下载量换算28

Cursor

19.29%
按下载量换算19

Gemini CLI

9.46%
按下载量换算9

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

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

安装前确认

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

继续浏览同类 Skills