Create Auth Skill
deadlock-mod-manager/deadlock-mod-manager
Scaffold and implement authentication in TypeScript/JavaScript apps using Better Auth.
Guidelines for developing with TypeORM, a full-featured ORM for TypeScript and JavaScript supporting multiple databases
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rolling-scopes/rsschool-app typeorm --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/typeorm .claude/skills/typeorm && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .claude/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeormType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rolling-scopes/rsschool-app typeorm --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/typeorm .agents/skills/typeorm && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .agents/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rolling-scopes/rsschool-app typeorm --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/typeorm .cursor/skills/typeorm && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .cursor/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rolling-scopes/rsschool-app.git --path .agents/skills/typeorm--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rolling-scopes/rsschool-app typeorm --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/typeorm .gemini/skills/typeorm && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .gemini/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rolling-scopes/rsschool-app typeormInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/typeorm .github/skills/typeorm && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .github/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rolling-scopes/rsschool-app --skill typeorm -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rolling-scopes/rsschool-app typeorm --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rolling-scopes/rsschool-app.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/typeorm .opencode/skills/typeorm && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "typeorm" agent skill from https://github.com/rolling-scopes/rsschool-app/tree/master/.agents/skills/typeorm into .opencode/skills/typeorm/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typeorm", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
typeormGuidelines for developing with TypeORM, a full-featured ORM for TypeScript and JavaScript supporting multiple databases
Typeorm is an agent skill from rolling-scopes/rsschool-app. Guidelines for developing with TypeORM, a full-featured ORM for TypeScript and JavaScript supporting multiple databases
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases, covering ORMs and data access. It works with TypeORM, TypeScript and JavaScript. The repository describes itself as: An application for the RS School education process. The licence is MPL-2.0.
Read from SKILL.md and the folder at commit f741ad2. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
DB_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Typeorm loads about 3.5k tokens when it runs. Until then it costs about 32 tokens; SKILL.md has 148 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from rolling-scopes/rsschool-app at commit f741ad2, republished under its MPL-2.0 licence (© rolling-scopes). 148 words, ~3,474 tokens.
.claude/skills/typeorm/SKILL.md (or your agent's skills folder).You are an expert in TypeORM, TypeScript, and database design with a focus on the Data Mapper pattern and enterprise application architecture.
Required settings in tsconfig.json:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"strict": true,
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node"
}
}import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
@Entity('users')
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'varchar', length: 255, unique: true })
email: string;
@Column({ type: 'varchar', length: 255, nullable: true })
name: string | null;
@Column({ type: 'boolean', default: true })
isActive: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}// Auto-increment
@PrimaryGeneratedColumn()
id: number;
// UUID
@PrimaryGeneratedColumn("uuid")
id: string;
// Custom primary key
@PrimaryColumn()
id: string;
// Composite primary key
@Entity()
export class OrderItem {
@PrimaryColumn()
orderId: number;
@PrimaryColumn()
productId: number;
}@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
// String columns
@Column({ type: 'varchar', length: 255 })
name: string;
@Column({ type: 'text', nullable: true })
description: string | null;
// Numeric columns
@Column({ type: 'decimal', precision: 10, scale: 2 })
price: number;
@Column({ type: 'int', default: 0 })
stock: number;
// Boolean
@Column({ type: 'boolean', default: true })
isAvailable: boolean;
// JSON
@Column({ type: 'jsonb', nullable: true })
metadata: Record<string, any> | null;
// Enum
@Column({
type: 'enum',
enum: ['active', 'inactive', 'pending'],
default: 'pending',
})
status: 'active' | 'inactive' | 'pending';
// Timestamps
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@DeleteDateColumn()
deletedAt: Date | null; // For soft deletes
// Version column for optimistic locking
@VersionColumn()
version: number;
}@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@OneToOne(() => Profile, profile => profile.user, { cascade: true })
@JoinColumn()
profile: Profile;
}
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
@OneToOne(() => User, user => user.profile)
user: User;
}@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Post, post => post.author)
posts: Post[];
}
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToOne(() => User, user => user.posts, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'author_id' })
author: User;
@Column()
authorId: number; // Explicit foreign key column
}@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToMany(() => Tag, tag => tag.posts)
@JoinTable({
name: 'post_tags',
joinColumn: { name: 'post_id' },
inverseJoinColumn: { name: 'tag_id' },
})
tags: Tag[];
}
@Entity()
export class Tag {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
name: string;
@ManyToMany(() => Post, post => post.tags)
posts: Post[];
}import { AppDataSource } from './data-source';
import { User } from './entities/User';
const userRepository = AppDataSource.getRepository(User);
// Find all
const users = await userRepository.find();
// Find with conditions
const activeUsers = await userRepository.find({
where: { isActive: true },
});
// Find one
const user = await userRepository.findOne({
where: { id: 1 },
});
// Find or fail
const user = await userRepository.findOneOrFail({
where: { id: 1 },
});
// Save
const newUser = userRepository.create({
email: 'user@example.com',
name: 'John Doe',
});
await userRepository.save(newUser);
// Update
await userRepository.update({ id: 1 }, { name: 'Jane Doe' });
// Delete
await userRepository.delete({ id: 1 });
// Soft delete (requires @DeleteDateColumn)
await userRepository.softDelete({ id: 1 });import { Repository, DataSource } from 'typeorm';
import { User } from './entities/User';
export class UserRepository extends Repository<User> {
constructor(private dataSource: DataSource) {
super(User, dataSource.createEntityManager());
}
async findByEmail(email: string): Promise<User | null> {
return this.findOne({ where: { email } });
}
async findActiveUsers(): Promise<User[]> {
return this.find({
where: { isActive: true },
order: { createdAt: 'DESC' },
});
}
async findWithPosts(userId: number): Promise<User | null> {
return this.findOne({
where: { id: userId },
relations: ['posts'],
});
}
}const users = await userRepository
.createQueryBuilder('user')
.leftJoinAndSelect('user.posts', 'post')
.where('user.isActive = :isActive', { isActive: true })
.andWhere('post.publishedAt IS NOT NULL')
.orderBy('user.createdAt', 'DESC')
.skip(0)
.take(10)
.getMany();
// With raw results
const result = await userRepository
.createQueryBuilder('user')
.select('COUNT(*)', 'count')
.where('user.isActive = :isActive', { isActive: true })
.getRawOne();
// Insert with query builder
await userRepository
.createQueryBuilder()
.insert()
.into(User)
.values([
{ email: 'user1@example.com', name: 'User 1' },
{ email: 'user2@example.com', name: 'User 2' },
])
.execute();// data-source.ts
import { DataSource } from 'typeorm';
import { User } from './entities/User';
import { Post } from './entities/Post';
export const AppDataSource = new DataSource({
type: 'postgres',
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT || '5432'),
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
// Entity configuration
entities: [User, Post],
// Or use glob pattern: entities: ["src/entities/**/*.ts"]
// Migrations
migrations: ['src/migrations/**/*.ts'],
// Synchronize - NEVER use in production
synchronize: false,
// Logging
logging: process.env.NODE_ENV === 'development',
// Connection pool
poolSize: 10,
// SSL (for production)
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false,
});
// Initialize connection
AppDataSource.initialize()
.then(() => console.log('Data Source initialized'))
.catch(error => console.error('Error initializing Data Source:', error));# Generate migration from entity changes
npx typeorm migration:generate src/migrations/CreateUsers -d src/data-source.ts
# Create empty migration
npx typeorm migration:create src/migrations/SeedUsers
# Run migrations
npx typeorm migration:run -d src/data-source.ts
# Revert last migration
npx typeorm migration:revert -d src/data-source.tsimport { MigrationInterface, QueryRunner, Table, TableIndex } from 'typeorm';
export class CreateUsers1234567890 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'users',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment',
},
{
name: 'email',
type: 'varchar',
length: '255',
isUnique: true,
},
{
name: 'name',
type: 'varchar',
length: '255',
isNullable: true,
},
{
name: 'is_active',
type: 'boolean',
default: true,
},
{
name: 'created_at',
type: 'timestamp',
default: 'CURRENT_TIMESTAMP',
},
{
name: 'updated_at',
type: 'timestamp',
default: 'CURRENT_TIMESTAMP',
onUpdate: 'CURRENT_TIMESTAMP',
},
],
}),
true,
);
await queryRunner.createIndex(
'users',
new TableIndex({
name: 'IDX_USERS_EMAIL',
columnNames: ['email'],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropIndex('users', 'IDX_USERS_EMAIL');
await queryRunner.dropTable('users');
}
}// Using QueryRunner
const queryRunner = AppDataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const user = queryRunner.manager.create(User, {
email: 'user@example.com',
name: 'User',
});
await queryRunner.manager.save(user);
const post = queryRunner.manager.create(Post, {
title: 'First Post',
author: user,
});
await queryRunner.manager.save(post);
await queryRunner.commitTransaction();
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}
// Using transaction method
await AppDataSource.transaction(async manager => {
const user = manager.create(User, {
email: 'user@example.com',
name: 'User',
});
await manager.save(user);
const post = manager.create(Post, {
title: 'First Post',
author: user,
});
await manager.save(post);
});// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UsersModule } from './users/users.module';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'db',
entities: [User],
synchronize: false,
}),
UsersModule,
],
})
export class AppModule {}
// users/users.module.ts
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}
// users/users.service.ts
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: number): Promise<User | null> {
return this.usersRepository.findOneBy({ id });
}
}Never use synchronize: true in production. Always use migrations:
// Development: Use migrations, not sync
synchronize: false,// Eager loading - loads relations automatically
@OneToMany(() => Post, (post) => post.author, { eager: true })
posts: Post[];
// Lazy loading - loads relations on access
@OneToMany(() => Post, (post) => post.author)
posts: Promise<Post[]>;
// Explicit loading (recommended)
const user = await userRepository.findOne({
where: { id: 1 },
relations: ["posts"],
});// Bad: N+1 queries
const users = await userRepository.find();
for (const user of users) {
console.log(user.posts); // Separate query for each user
}
// Good: Eager load relations
const users = await userRepository.find({
relations: ['posts'],
});@Entity()
@Index(['email'])
@Index(['firstName', 'lastName'])
export class User {
@Column()
@Index()
email: string;
@Column()
firstName: string;
@Column()
lastName: string;
}@OneToMany(() => Post, (post) => post.author, {
cascade: true, // Saves/removes related posts
onDelete: "CASCADE", // Database-level cascade
})
posts: Post[];For consistent naming between TypeScript and database:
import { DefaultNamingStrategy, NamingStrategyInterface } from "typeorm";
import { snakeCase } from "typeorm/util/StringUtils";
export class SnakeNamingStrategy extends DefaultNamingStrategy implements NamingStrategyInterface {
tableName(targetName: string, userSpecifiedName: string | undefined): string {
return userSpecifiedName ? userSpecifiedName : snakeCase(targetName);
}
columnName(propertyName: string, customName: string, embeddedPrefixes: string[]): string {
return snakeCase(embeddedPrefixes.join("_")) + (customName ? customName : snakeCase(propertyName));
}
}
// Use in data source config
namingStrategy: new SnakeNamingStrategy(),© rolling-scopes, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/typeorm of rolling-scopes/rsschool-app.
Open the folder on GitHubat commit f741ad2
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in rolling-scopes/rsschool-app, which our catalogue first saw on October 7, 2026.
Typeorm next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Typeorm this skillrolling-scopes/rsschool-app | 10k | 1 repos | ~3.5k | Automated safety check: Pass | MPL-2.0 | |
| Create Auth Skilldeadlock-mod-manager/deadlock-mod-manager | 574 | 4 repos | ~3.4k | Automated safety check: Pass | GPL-3.0 | |
| Twenty Entity Runner Actionstwentyhq/twenty | 58k | — | ~3.1k | Automated safety check: Pass | Custom licence | |
| Twenty Syncable Entity Typestwentyhq/twenty | 58k | — | ~2.8k | Automated safety check: Pass | Custom licence | |
| Hot Monitorliyupi/yupi-hot-monitor | 718 | 1 repos | ~1.2k | Automated safety check: Pass | None | |
| ClickHouse RowBinary for Node.jsClickHouse/agent-skills | 544 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 |
deadlock-mod-manager/deadlock-mod-manager
Scaffold and implement authentication in TypeScript/JavaScript apps using Better Auth.
twentyhq/twenty
Step four of adding a syncable entity in the Twenty server: write create, update and delete action handlers that run workspace migrations against the database.
twentyhq/twenty
Walks through the first of six steps for adding a syncable entity to Twenty's server: metadata name, TypeORM entity, flat types and central constants.
liyupi/yupi-hot-monitor
AI hotspot monitoring and trending topic discovery across multiple sources (Bing, Google, DuckDuckGo, HackerNews, Sogou, Bilibili, Weibo, Twitter).
ClickHouse/agent-skills
Generates TypeScript or JavaScript readers and writers for ClickHouse's RowBinary formats over HTTP in Node.js, after checking that RowBinary suits the data.
bretzel-app/crumbs
Drizzle ORM schema management and SQLite migrations — adding tables, modifying columns, creating indexes, generating and running migrations, Drizzle query patterns.
rolling-scopes/rsschool-app
Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.
rolling-scopes/rsschool-app
NestJS best practices and architecture patterns for building production-ready applications.
Works with
Categories
Guidelines for developing with TypeORM, a full-featured ORM for TypeScript and JavaScript supporting multiple databases. Typeorm is an agent skill from rolling-scopes/rsschool-app.
Typeorm fits situations like: tasks that involve ORMs and data access.
Run `npx skills add rolling-scopes/rsschool-app --skill typeorm -a claude-code`. Or copy the skill folder (.agents/skills/typeorm in rolling-scopes/rsschool-app) into .claude/skills/typeorm in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rolling-scopes/rsschool-app --skill typeorm -a codex`. Or copy the skill folder (.agents/skills/typeorm in rolling-scopes/rsschool-app) into .agents/skills/typeorm in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rolling-scopes/rsschool-app --skill typeorm -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/typeorm, .gemini/skills/typeorm, .github/skills/typeorm and .opencode/skills/typeorm in your project.
Going by SKILL.md and its folder, Typeorm needs the command-line tools its instructions call (npx) and credentials named DB_PASSWORD. Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Typeorm is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Typeorm: Create Auth Skill (deadlock-mod-manager/deadlock-mod-manager, 574 stars), Twenty Entity Runner Actions (twentyhq/twenty, 58k stars), Twenty Syncable Entity Types (twentyhq/twenty, 58k stars) and Hot Monitor (liyupi/yupi-hot-monitor, 718 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rolling-scopes (a GitHub organization) maintains it in rolling-scopes/rsschool-app, which has 10,399 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 4, 2026.
Source: rolling-scopes/rsschool-app on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.