Token导航 LogoToken导航

Agent Skill · 开发规范

jsdoc-best-practices(jsdoc 最佳实践)

jsdoc-best-practices 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

jsdoc-best-practices 是开发规范类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证为 MIT,第三方扫描已通过,按安装量在开发规范类的 1,265 个 Skill 里排第 585。

总安装 816周安装 34GitHub Stars 1下载 272核验 2026-05-01

安装说明

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

安装方式

通过对话安装

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

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

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/codyswanngt/lisa --skill jsdoc-best-practices

这个 Skill 是做什么的

开发规范类 Skill 用来统一代码风格、目录结构和评审口径,产出多为检查清单或改写建议。

用于处理 GitHub 仓库、Issue、Pull Request 等协作信息。适合围绕代码变更和协作事项进行整理分析。可辅助理解项目状态和开发流程。jsdoc-best-practices 属于开发规范类 Skill,可作为该场景下的辅助能力补充。建议先确认权限范围和维护状态再投入使用。

注意避免过度依赖自动化处理敏感协作内容。

来源仓库内路径:skills/jsdoc-best-practices

上手步骤

4 步
  1. 1

    确认自己的宿主工具

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

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/codyswanngt/lisa --skill jsdoc-best-practices;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

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

  4. 4

    按最小权限试用

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

常见问题

6 条

jsdoc-best-practices 怎么安装?

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

jsdoc-best-practices 支持哪些 AI 工具?

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

jsdoc-best-practices 需要什么权限?

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

jsdoc-best-practices 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

jsdoc-best-practices 用的人多吗?

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

jsdoc-best-practices 安全吗?

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

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

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发规范类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

开发规范类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
vercel-react-best-practices

Vercel React 最佳实践 · Codex、Claude

8,490,72025,918操作浏览器MIT通过
web-design-guidelines

网页设计指南 · Codex、Claude

6,686,01625,885需要联网MIT有提醒
remotion-best-practices

Remotion 最佳实践 · Codex、Claude

6,505,6323,027操作浏览器MIT有提醒
supabase-postgres-best-practices

Supabase Postgres 最佳实践 · Codex、Claude

3,175,5232,030需要联网MIT通过
next-best-practices

Next.js 最佳实践 · Codex、Claude

1,848,240841操作浏览器MIT通过
jsdoc-best-practices

jsdoc 最佳实践 · 本页

8161需要联网MIT通过

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

SKILL.md 原文

JSDoc Best Practices

Overview

This skill defines the JSDoc documentation standards for this project. The core principle is that documentation should explain "why", not just "what". Code already shows what it does—good documentation explains the reasoning, context, and non-obvious details that help developers understand and maintain the code.

Core Philosophy: Why Over What

The Problem with "What" Documentation

// Bad: Just restates the code
/**
 * Gets the user by ID
 * @param id - The ID
 * @returns The user
 */
function getUserById(id: string): User { ... }

This documentation adds no value—the function name already tells us it gets a user by ID.

The Solution: Document "Why"

// Good: Explains context, constraints, and non-obvious behavior
/**
 * Retrieves a user by their unique identifier
 * @param id - The user's UUID (not the legacy numeric ID)
 * @returns The user if found, null if not found or soft-deleted
 * @remarks Used by DataLoader for batching - maintains input order
 */
function getUserById(id: string): User | null { ... }

This documentation adds value by explaining:

  • What kind of ID (UUID vs legacy)
  • What happens when not found
  • Why this specific implementation exists (DataLoader batching)

ESLint Enforcement

The project enforces JSDoc through eslint-plugin-jsdoc with these rules:

Required Documentation

RuleSettingWhat It Enforces
jsdoc/require-jsdocerrorJSDoc on function declarations, interfaces, type aliases, and PascalCase arrow functions
jsdoc/require-param-descriptionerrorAll @param tags must have descriptions
jsdoc/require-returns-descriptionerrorAll @returns tags must have descriptions
jsdoc/require-property-descriptionerrorAll @property tags must have descriptions

Allowed Tags

RuleSettingEffect
jsdoc/check-tag-namesdefinedTags: ["remarks"]Allows @remarks for "why" documentation
jsdoc/no-typesoffTypeScript types in JSDoc are optional
jsdoc/require-param-typeoffTypes come from TypeScript, not JSDoc
jsdoc/require-returns-typeoffTypes come from TypeScript, not JSDoc

What Requires Documentation

Per jsdoc/require-jsdoc configuration:

{
  require: {
    FunctionDeclaration: true,      // function foo() {}
    MethodDefinition: false,        // class methods (optional)
    ClassDeclaration: false,        // classes (optional but recommended)
    ArrowFunctionExpression: false, // const foo = () => {} (optional)
    FunctionExpression: false,      // const foo = function() {} (optional)
  },
  contexts: [
    "TSInterfaceDeclaration",       // interface Foo {}
    "TSTypeAliasDeclaration",       // type Foo = ...
    // PascalCase arrow functions (React components, factories):
    "VariableDeclaration[declarations.0.init.type='ArrowFunctionExpression']:has([id.name=/^[A-Z]/])"
  ]
}

Documentation Patterns

File Preambles

Every file should have a preamble comment at the top:

/**
 * @file complexity.plugin.ts
 * @description Apollo Server plugin for query complexity analysis and limiting
 * @module graphql
 */
TagPurpose
@fileThe filename (for navigation and search)
@descriptionWhat this file provides
@moduleThe feature module this belongs to

Service Documentation

/**
 * Service for managing user accounts
 * @description Provides CRUD operations for user entities
 * @remarks
 * - All methods are idempotent
 * - Throws NotFoundException for missing resources
 * - Uses DataLoader batching for bulk operations
 */
@Injectable()
export class UserService { ... }

Method Documentation

/**
 * Batch loads entities by IDs (for DataLoader)
 * @param ids - Array of entity IDs to load
 * @returns Promise resolving to array of entities in same order as input
 * @remarks Used by DataLoader for batching - maintains input order
 */
async findByIds(ids: readonly string[]): Promise<Entity[]> { ... }

Interface Documentation

/**
 * Interface for authentication services
 * @description Defines the contract for both Cognito and Local auth implementations.
 * This interface ensures both AuthService (production) and LocalAuthService
 * (local development) provide the same public API for authentication operations.
 */
export interface IAuthService {
  /**
   * Initiates the sign-in flow by sending an OTP to the user
   * @param input - The sign-in input containing the user identifier (phone/email)
   * @returns A promise resolving to the sign-in result with session and challenge info
   */
  signIn(input: SignInInput): Promise<SignInResult>;
}

Type/Constant Documentation

/**
 * Default complexity configuration
 * @description Tune these values based on your server capacity
 */
const COMPLEXITY_CONFIG = {
  /** Maximum allowed query complexity */
  maxComplexity: 100,
  /** Default complexity for fields without explicit complexity */
  defaultComplexity: 1,
} as const;

The @remarks Tag

Use @remarks to document the "why" and important context:

When to Use @remarks

Use CaseExample
Design decisions@remarks Uses closure pattern to cache between Lambda invocations
Usage constraints@remarks Call getLoaders() once per GraphQL request in context factory
Non-obvious behavior@remarks Maintains input order for DataLoader compatibility
Important caveats@remarks All methods are idempotent - safe to retry
Integration details@remarks Connects on module initialization, disconnects on destruction

@remarks Format

Use bullet points for multiple remarks:

/**
 * Apollo Server plugin that calculates and limits query complexity
 * @description Prevents expensive queries from overwhelming the server
 * @remarks
 * - Uses field extensions estimator for custom complexity values
 * - Falls back to simple estimator with default complexity of 1
 * - Rejects queries that exceed the configured maximum complexity
 */

Use inline for single remarks:

/**
 * Creates all DataLoader instances for a single request
 * @returns Object containing all typed DataLoaders
 * @remarks Called in GraphQL context factory - creates fresh instances per request
 */

Parameter Descriptions

Bad: Restating the Name

/**
 * @param id - The id
 * @param name - The name
 * @param options - The options
 */

Good: Adding Value

/**
 * @param id - The user's UUID (not the legacy numeric ID from v1 API)
 * @param name - Display name, max 50 characters, sanitized for XSS
 * @param options - Configuration for the query, see QueryOptions type
 */

Parameter Description Guidelines

IncludeAvoid
Valid value rangesRestating the parameter name
Format requirementsRestating the type
Default behaviorObvious information
Edge casesImplementation details
Units (ms, bytes, etc.)Internal variable names

Return Value Descriptions

Bad: Restating the Type

/**
 * @returns The user
 * @returns A promise
 * @returns The result
 */

Good: Explaining Behavior

/**
 * @returns The user if found, null if not found or soft-deleted
 * @returns Promise resolving to array of entities in same order as input
 * @returns Authentication tokens on success, error message on failure
 */

Anti-Patterns to Avoid

Don't Document the Obvious

// Wrong: Adds no value
/**
 * Constructor
 */
constructor() {}

/**
 * Gets the name
 * @returns The name
 */
getName(): string { return this.name; }

Don't Duplicate TypeScript Types

// Wrong: Type is already in signature
/**
 * @param id - {string} The user ID
 * @returns {Promise<User>} The user
 */
async getUser(id: string): Promise<User> { ... }

// Correct: Description only, type from TypeScript
/**
 * @param id - The user's UUID identifier
 * @returns The user entity with populated relations
 */
async getUser(id: string): Promise<User> { ... }

Don't Write Implementation Comments

// Wrong: Documents how, not why
/**
 * Loops through users and filters by active status
 */
const activeUsers = users.filter(u => u.active);

// Correct: Self-documenting code needs no comment
// If explanation is needed, explain WHY:
// Active users are filtered first to avoid unnecessary permission checks
const activeUsers = users.filter(u => u.active);

Escaping @ Symbols in JSDoc

When documenting code that contains TypeScript/NestJS decorators (like @Injectable(), @Processor('queue-name')), JSDoc will interpret the @ as a tag marker. This causes lint errors because JSDoc sees @Processor('qpr-v2') as a single unknown tag name (including the parentheses and arguments).

The problem: Adding decorator names to definedTags doesn't help because JSDoc parses the entire string @Processor('qpr-v2') as the tag name, not just @Processor.

Solution 1: Backticks in Prose

When mentioning decorators in description text, wrap them in backticks:

/**
 * Queue processor for QPR calculations
 * @description Handles jobs from the `@Processor('qpr-v2')` queue
 * @remarks Uses `@Injectable()` scope for request isolation
 */

Solution 2: Escape in @example Blocks

In @example blocks, use fenced code blocks and escape @ as \@:

/**
 * Creates a queue processor
 * @example
 * ```typescript
 * \@Processor('my-queue')
 * export class MyProcessor {
 *   \@Process()
 *   async handle(job: Job) { ... }
 * }
 * ```
 */

Quick Reference for Escaping

ContextApproachExample
Prose/descriptionWrap in backticks` @Injectable() `
@example blockEscape with backslash\@Processor('name')
Code commentsNo escaping needed// Uses @Injectable

Quick Reference

Required Structure for Services

/**
 * @file feature.service.ts
 * @description Service providing feature functionality
 * @module feature
 */

/**
 * Service for feature operations
 * @description Brief description of what this service handles
 * @remarks
 * - Important architectural decisions
 * - Usage patterns or constraints
 */
@Injectable()
export class FeatureService {
  /**
   * Brief description of what this method does
   * @param paramName - What this parameter represents and any constraints
   * @returns What is returned and under what conditions
   * @remarks Any non-obvious behavior or usage notes
   */
  methodName(paramName: Type): ReturnType { ... }
}

Required Structure for Interfaces

/**
 * Interface for feature operations
 * @description Explains the contract this interface defines
 */
export interface IFeature {
  /**
   * Method description
   * @param param - Parameter description with constraints
   * @returns Return description with conditions
   */
  method(param: Type): ReturnType;
}

Required Structure for Types

/**
 * Represents a feature configuration
 * @description Used to configure feature behavior at initialization
 */
export type FeatureConfig = {
  /** Maximum retry attempts before failing */
  maxRetries: number;
  /** Timeout in milliseconds */
  timeoutMs: number;
};

Verification Checklist

Before committing code, verify:

  1. File preamble exists: @file, @description, @module
  2. Function declarations have JSDoc: Required by ESLint
  3. Interfaces have JSDoc: Required by ESLint
  4. Type aliases have JSDoc: Required by ESLint
  5. Parameters have meaningful descriptions: Not just restating the name
  6. Returns have meaningful descriptions: Explain conditions and edge cases
  7. @remarks used for "why": Design decisions, constraints, non-obvious behavior
  8. No TypeScript types in JSDoc: Types come from the signature

平台分布

Claude Code

28.96%
按下载量换算79

Antigravity

24.22%
按下载量换算66

windsurf

19.27%
按下载量换算52

trae

12.53%
按下载量换算34

OpenCode

7.03%
按下载量换算19

Gemini CLI

3.36%
按下载量换算9

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

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

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

继续浏览同类 Skills