Back to list
HDeibler

noop-entity

by HDeibler

Production-ready Express + TypeScript + PostgreSQL + Redis project generator for Claude Code

0🍴 0📅 Jan 7, 2026

SKILL.md


name: noop-entity description: Generate new domain entities with full CRUD infrastructure in noop-based projects. Use when adding new resources, tables, or API endpoints to an existing project.

Noop Entity Generator

This skill generates complete CRUD infrastructure for new domain entities.

When Claude Should Use This

Automatically use this skill when the user wants to:

  • Add a new resource/entity to their API
  • Create a new database table with CRUD operations
  • Add new API endpoints following noop patterns
  • Mentions "add entity", "new model", "new resource"

Framework Context

Generator Instructions (TEMPLATES)

@docs/universal-framework/GENERATOR_INSTRUCTIONS.md

Coding Conventions (NAMING)

@docs/universal-framework/CONVENTIONS.md

Architecture Specification (PATTERNS)

@docs/universal-framework/ARCHITECTURE_SPEC.md


Files Generated

For entity Product:

FilePurpose
src/types/product.types.tsType definitions
src/db/pg/ProductOps.tsDatabase operations
src/handlers/productHandler.tsHTTP handlers
Migration SQLTable creation

Files Updated

FileChanges
src/db/pg/PgClientStore.tsRegister ProductOps
src/routes.tsAdd CRUD routes
src/types/index.tsExport types

Naming Conventions

InputOutputExample
EntityPascalCaseProduct
Type file{entity}.types.tsproduct.types.ts
Ops file{Entity}Ops.tsProductOps.ts
Handler{entity}Handler.tsproductHandler.ts
Tablesnake_case pluralproducts
Routeslowercase plural/api/v1/products
Store propcamelCase pluraldbStore.products

Templates

Types

export interface ProductInfo {
  id: string
  name: string
  description?: string
  organizationId: string
  createdAt: Date
  updatedAt: Date
}

export type CreateProductInput = Omit<ProductInfo, 'id' | 'organizationId' | 'createdAt' | 'updatedAt'>

Ops Class (CRITICAL: organizationId required on ALL methods)

export class ProductOps {
  async create(data: CreateProductInput, organizationId: string): Promise<ProductInfo> {
    if (!organizationId) throw new Error('organization_id is required')
    // parameterized INSERT
  }

  async getById(id: string, organizationId: string): Promise<ProductInfo | undefined> {
    if (!organizationId) throw new Error('organization_id is required')
    // SELECT with org filter
  }

  private mapRowToProduct(row: DbProductRow): ProductInfo { }
}

Handler

export const create = asyncHandler(async (req, res) => {
  const { name, description } = req.body
  if (!name) throw createError.requiredField('name')

  const dbStore = getDbStore()
  const item = await dbStore.products.create(
    { name, description },
    req.user.organizationId
  )

  return sendSuccess(res, item, 'Product created', 201)
})

Migration SQL

CREATE TABLE products (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  name VARCHAR(255) NOT NULL,
  description TEXT,
  organization_id UUID NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_products_organization ON products(organization_id);

Routes

app.get(`${API_PREFIX}/products`, productHandlers.list)
app.post(`${API_PREFIX}/products`, productHandlers.create)
app.get(`${API_PREFIX}/products/:id`, productHandlers.get)
app.put(`${API_PREFIX}/products/:id`, productHandlers.update)
app.delete(`${API_PREFIX}/products/:id`, productHandlers.remove)

Verification

  • npm run typecheck passes
  • npm run lint passes
  • Types exported from index
  • Ops registered in PgClientStore
  • Routes registered

Score

Total Score

50/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon