Convert Internal Package to TypeScript
TryGhost/Ghost
Moves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact.
Expert 10x engineer with extensive knowledge of TypeScript fundamentals, migration strategies, and best practices.
$ npx skills add LeoYeAI/openclaw-master-skills --skill typescript-coder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills typescript-coder --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/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/typescript-coder .claude/skills/typescript-coder && 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 "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .claude/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coderType 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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills typescript-coder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/typescript-coder .agents/skills/typescript-coder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .agents/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills typescript-coder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/typescript-coder .cursor/skills/typescript-coder && 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 "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .cursor/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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/LeoYeAI/openclaw-master-skills.git --path skills/typescript-coder--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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills typescript-coder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/typescript-coder .gemini/skills/typescript-coder && 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 "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .gemini/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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 LeoYeAI/openclaw-master-skills typescript-coderInstalls 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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/typescript-coder .github/skills/typescript-coder && 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 "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .github/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills typescript-coder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/typescript-coder .opencode/skills/typescript-coder && 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 "typescript-coder" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/typescript-coder into .opencode/skills/typescript-coder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript-coder", 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.
typescript-coderExpert 10x engineer with extensive knowledge of TypeScript fundamentals, migration strategies, and best practices.
Typescript Coder is an agent skill from LeoYeAI/openclaw-master-skills. Expert 10x engineer with extensive knowledge of TypeScript fundamentals, migration strategies, and best practices. Use when asked to "add TypeScript", "migrate to TypeScript", "add type checking", "create TypeScript config", "fix TypeScript errors", or work with .ts/.tsx files. Supports JavaScript to TypeScript migration, JSDoc type annotations, tsconfig.json configuration, and type-safe code patterns.
Its SKILL.md is about 5.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 66 other files, including scripts, reference files and assets (for example `_meta.json`, `assets/select-from-the-type-menu.md` and `assets/typescript-algolia.md`).
It sits in Development, covering Type safety, Technical documentation and React components. It works with TypeScript and JavaScript. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. 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.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
npmnpxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
typescriptlang.orgbasarat.gitbook.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Typescript Coder loads about 5.8k tokens when it runs, and up to ~137k if it reads all its reference files. Until then it costs about 106 tokens; SKILL.md has 1,346 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); the scripts in this folder are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 1,346 words, ~5,812 tokens.
.claude/skills/typescript-coder/SKILL.md (or your agent's skills folder). This skill also uses 65 other files; get the full folder from GitHub.Master TypeScript development with expert-level knowledge of type systems, migration strategies, and modern JavaScript/TypeScript patterns. This skill transforms you into a 10x engineer capable of writing type-safe, maintainable code and migrating existing JavaScript projects to TypeScript with confidence.
tsconfig.json for a project.ts, .tsx, .mts, or .d.ts filestypescript package (can be installed if needed)Keywords to trigger this skill as if using a command-line tool:
openPrompt = ["typescript-coder", "ts-coder"]Use these shorthand commands to quickly invoke TypeScript expertise without lengthy explanations. For example:
typescript-coder --check "this code"typescript-coder check this type guardts-coder migrate this filets-coder --migrate project-to-typescriptAs a TypeScript expert, you operate with:
TypeScript uses structural typing (duck typing) rather than nominal typing:
interface Point {
x: number;
y: number;
}
// This works because the object has the right structure
const point: Point = { x: 10, y: 20 };
// This also works - structural compatibility
const point3D = { x: 1, y: 2, z: 3 };
const point2D: Point = point3D; // OK - has x and yTypeScript infers types when possible, reducing boilerplate:
// Type inferred as string
const message = "Hello, TypeScript!";
// Type inferred as number
const count = 42;
// Type inferred as string[]
const names = ["Alice", "Bob", "Charlie"];
// Return type inferred as number
function add(a: number, b: number) {
return a + b; // Returns number
}| Feature | Purpose | When to Use |
|---|---|---|
| Interfaces | Define object shapes | Defining data structures, API contracts |
| Type Aliases | Create custom types | Union types, complex types, type utilities |
| Generics | Type-safe reusable components | Functions/classes that work with multiple types |
| Enums | Named constants | Fixed set of related values |
| Type Guards | Runtime type checking | Narrowing union types safely |
| Utility Types | Transform types | Partial<T>, Pick<T, K>, Omit<T, K>, etc. |
For a new or existing JavaScript project:
Install TypeScript as a dev dependency:
npm install --save-dev typescriptInstall type definitions for Node.js (if using Node.js):
npm install --save-dev @types/nodeInitialize TypeScript configuration:
npx tsc --initConfigure tsconfig.json for your project:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ES2020"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}Add build script to package.json:
{
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"check": "tsc --noEmit"
}
}Safe, incremental migration strategy:
Enable TypeScript to process JavaScript files:
{
"compilerOptions": {
"allowJs": true,
"checkJs": false,
"noEmit": true
}
}Add JSDoc type annotations to JavaScript files (optional intermediate step):
// @ts-check
/**
* Calculates the sum of two numbers
* @param {number} a - First number
* @param {number} b - Second number
* @returns {number} The sum
*/
function add(a, b) {
return a + b;
}
/** @type {string[]} */
const names = ["Alice", "Bob"];
/** @typedef {{ id: number, name: string, email?: string }} User */
/** @type {User} */
const user = {
id: 1,
name: "Alice"
};Rename files incrementally from .js to .ts:
# Start with utility files and leaf modules
mv src/utils/helpers.js src/utils/helpers.tsFix TypeScript errors in converted files:
any types appropriatelyGradually convert remaining files:
Enable strict mode progressively:
{
"compilerOptions": {
"strict": false,
"noImplicitAny": true,
"strictNullChecks": true
// Enable other strict flags one at a time
}
}Creating robust type definitions:
Define interfaces for data structures:
// User data model
interface User {
id: number;
name: string;
email: string;
age?: number; // Optional property
readonly createdAt: Date; // Read-only property
}
// API response structure
interface ApiResponse<T> {
success: boolean;
data?: T;
error?: {
code: string;
message: string;
};
}Use type aliases for complex types:
// Union type
type Status = 'pending' | 'active' | 'completed' | 'failed';
// Intersection type
type Employee = User & {
employeeId: string;
department: string;
salary: number;
};
// Function type
type TransformFn<T, U> = (input: T) => U;
// Conditional type
type NonNullable<T> = T extends null | undefined ? never : T;Create type definitions in .d.ts files for external modules:
// types/custom-module.d.ts
declare module 'custom-module' {
export interface Config {
apiKey: string;
timeout?: number;
}
export function initialize(config: Config): Promise<void>;
export function fetchData<T>(endpoint: string): Promise<T>;
}Type-safe reusable components:
Generic functions:
// Basic generic function
function identity<T>(value: T): T {
return value;
}
const num = identity(42); // Type: number
const str = identity("hello"); // Type: string
// Generic with constraints
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { name: "Alice", age: 30 };
const name = getProperty(user, "name"); // Type: string
const age = getProperty(user, "age"); // Type: numberGeneric classes:
class DataStore<T> {
private items: T[] = [];
add(item: T): void {
this.items.push(item);
}
get(index: number): T | undefined {
return this.items[index];
}
filter(predicate: (item: T) => boolean): T[] {
return this.items.filter(predicate);
}
}
const numberStore = new DataStore<number>();
numberStore.add(42);
const userStore = new DataStore<User>();
userStore.add({ id: 1, name: "Alice", email: "alice@example.com" });Generic interfaces:
interface Repository<T> {
findById(id: string): Promise<T | null>;
findAll(): Promise<T[]>;
create(item: Omit<T, 'id'>): Promise<T>;
update(id: string, item: Partial<T>): Promise<T>;
delete(id: string): Promise<boolean>;
}
class UserRepository implements Repository<User> {
async findById(id: string): Promise<User | null> {
// Implementation
return null;
}
// ... other methods
}Common type errors and solutions:
"Property does not exist" errors:
// ❌ Error: Property 'name' does not exist on type '{}'
const user = {};
user.name = "Alice";
// ✅ Solution 1: Define interface
interface User {
name: string;
}
const user: User = { name: "Alice" };
// ✅ Solution 2: Type assertion (use cautiously)
const user = {} as User;
user.name = "Alice";
// ✅ Solution 3: Index signature
interface DynamicObject {
[key: string]: any;
}
const user: DynamicObject = {};
user.name = "Alice";"Cannot find name" errors:
// ❌ Error: Cannot find name 'process'
const env = process.env.NODE_ENV;
// ✅ Solution: Install type definitions
// npm install --save-dev @types/node
const env = process.env.NODE_ENV; // Now worksany type issues:
// ❌ Implicit any (with noImplicitAny: true)
function process(data) {
return data.value;
}
// ✅ Solution: Add explicit types
function process(data: { value: number }): number {
return data.value;
}
// ✅ Or use generic
function process<T>(data: T): T {
return data;
}Union type narrowing:
function processValue(value: string | number) {
// ❌ Error: Property 'toUpperCase' does not exist on type 'string | number'
return value.toUpperCase();
// ✅ Solution: Type guard
if (typeof value === "string") {
return value.toUpperCase(); // TypeScript knows it's string here
}
return value.toString();
}Environment-specific configurations:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ES2020"],
"types": ["node"],
"moduleResolution": "node",
"esModuleInterop": true
}
}{
"compilerOptions": {
"target": "ES2020",
"module": "esnext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"moduleResolution": "bundler",
"resolveJsonModule": true,
"noEmit": true
}
}{
"compilerOptions": {
"target": "ES2020",
"module": "esnext",
"declaration": true,
"declarationMap": true,
"outDir": "./dist",
"rootDir": "./src"
}
}"strict": true) for maximum type safetyunknown instead of any - forces type checking before useas const) for literal typesany everywhere - defeats the purpose of TypeScript@ts-ignore without good reasonstrictNullChecks@types/*Type-safe state management:
type LoadingState = { status: 'loading' };
type SuccessState<T> = { status: 'success'; data: T };
type ErrorState = { status: 'error'; error: Error };
type AsyncState<T> = LoadingState | SuccessState<T> | ErrorState;
function handleState<T>(state: AsyncState<T>) {
switch (state.status) {
case 'loading':
console.log('Loading...');
break;
case 'success':
console.log('Data:', state.data); // TypeScript knows state.data exists
break;
case 'error':
console.log('Error:', state.error.message); // TypeScript knows state.error exists
break;
}
}Type-safe fluent API:
class QueryBuilder<T> {
private filters: Array<(item: T) => boolean> = [];
private sortFn?: (a: T, b: T) => number;
private limitCount?: number;
where(predicate: (item: T) => boolean): this {
this.filters.push(predicate);
return this;
}
sortBy(compareFn: (a: T, b: T) => number): this {
this.sortFn = compareFn;
return this;
}
limit(count: number): this {
this.limitCount = count;
return this;
}
execute(data: T[]): T[] {
let result = data.filter(item =>
this.filters.every(filter => filter(item))
);
if (this.sortFn) {
result = result.sort(this.sortFn);
}
if (this.limitCount) {
result = result.slice(0, this.limitCount);
}
return result;
}
}
// Usage
const users = [/* ... */];
const result = new QueryBuilder<User>()
.where(u => u.age > 18)
.where(u => u.email.includes('@example.com'))
.sortBy((a, b) => a.name.localeCompare(b.name))
.limit(10)
.execute(users);type EventMap = {
'user:created': { id: string; name: string };
'user:updated': { id: string; changes: Partial<User> };
'user:deleted': { id: string };
};
class TypedEventEmitter<T extends Record<string, any>> {
private listeners: { [K in keyof T]?: Array<(data: T[K]) => void> } = {};
on<K extends keyof T>(event: K, listener: (data: T[K]) => void): void {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event]!.push(listener);
}
emit<K extends keyof T>(event: K, data: T[K]): void {
const eventListeners = this.listeners[event];
if (eventListeners) {
eventListeners.forEach(listener => listener(data));
}
}
}
// Usage with type safety
const emitter = new TypedEventEmitter<EventMap>();
emitter.on('user:created', (data) => {
console.log(data.id, data.name); // TypeScript knows the shape
});
emitter.emit('user:created', { id: '123', name: 'Alice' }); // Type-checked| Issue | Cause | Solution |
|---|---|---|
| Module not found | Missing type definitions | Install @types/[package-name] or add declare module |
| Implicit any errors | noImplicitAny enabled | Add explicit type annotations |
| Cannot find global types | Missing lib in compilerOptions | Add to lib: ["ES2020", "DOM"] |
| Type errors in node_modules | Third-party library types | Add skipLibCheck: true to tsconfig.json |
| Import errors with .ts extension | Import resolving issues | Use imports without extensions |
| Build takes too long | Compiling too many files | Use incremental: true and tsBuildInfoFile |
| Type inference not working | Complex inferred types | Add explicit type annotations |
| Circular dependency errors | Import cycles | Refactor to break cycles, use interfaces |
Transform existing types:
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Partial<T> = {
[P in keyof T]?: T[P];
};
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// Usage
interface User {
id: number;
name: string;
email: string;
}
type ReadonlyUser = Readonly<User>; // All properties readonly
type PartialUser = Partial<User>; // All properties optional
type UserNameEmail = Pick<User, 'name' | 'email'>; // Only name and emailTypes that depend on conditions:
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
// Practical example: Extract function return type
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function getUser() {
return { id: 1, name: "Alice" };
}
type User = ReturnType<typeof getUser>; // { id: number; name: string }String manipulation at type level:
type Greeting<T extends string> = `Hello, ${T}!`;
type WelcomeMessage = Greeting<"World">; // "Hello, World!"
// Practical: Create event names
type EventName<T extends string> = `on${Capitalize<T>}`;
type ClickEvent = EventName<"click">; // "onClick"
type HoverEvent = EventName<"hover">; // "onHover"tsconfig.json Options| Option | Purpose | Recommended |
|---|---|---|
strict | Enable all strict type checking | true |
target | ECMAScript target version | ES2020 or higher |
module | Module system | commonjs (Node) or esnext (bundlers) |
lib | Include type definitions | ["ES2020"] + DOM if browser |
outDir | Output directory | ./dist |
rootDir | Root source directory | ./src |
sourceMap | Generate source maps | true for debugging |
declaration | Generate .d.ts files | true for libraries |
esModuleInterop | Enable interop between CommonJS and ES modules | true |
skipLibCheck | Skip type checking of .d.ts files | true for performance |
forceConsistentCasingInFileNames | Enforce consistent file casing | true |
resolveJsonModule | Allow importing JSON files | true if needed |
allowJs | Allow JavaScript files | true during migration |
checkJs | Type check JavaScript files | false during migration |
noEmit | Don't emit files (use external bundler) | true with bundlers |
incremental | Enable incremental compilation | true for faster builds |
When migrating a JavaScript project to TypeScript:
tsconfig.json with permissive settingsallowJs: true and checkJs: false.tsnoImplicitAny: truestrictNullChecks: trueany types where possiblestrict: trueThis skill includes bundled reference documentation for TypeScript essentials.
references/)The TypeScript Coder skill empowers you to write type-safe, maintainable code with expert-level TypeScript knowledge. Whether migrating existing JavaScript projects or starting new TypeScript projects, apply these proven patterns, workflows, and best practices to deliver production-quality code with confidence.
Remember: TypeScript is a tool for developer productivity and code quality. Use it to catch errors early, improve code documentation, and enable better tooling—but don't let perfect types prevent shipping working code.
© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 65 other files (scripts, references, assets) in skills/typescript-coder of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Typescript Coder 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 |
|---|---|---|---|---|---|---|
| Typescript Coder this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~5.8k | Automated safety check: Pass | MIT | |
| Convert Internal Package to TypeScriptTryGhost/Ghost | 55k | — | ~1.2k | Automated safety check: Pass | MIT | |
| Typescript Expertcin12211/orca-q | 223 | 11 repos | ~3.7k | Automated safety check: Pass | MIT | |
| Typescripttahabasri/snippets | 170 | — | ~968 | Automated safety check: Pass | MIT | |
| Cb Code QualityBlkLeg/CircuitBreaker | 201 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Typescript Styletjx666/vscode-mcp | 106 | — | ~961 | Automated safety check: Pass | Custom licence |
TryGhost/Ghost
Moves a legacy internal Ghost package from JavaScript and CommonJS to TypeScript and ESM in three focused commits that keep git file history intact.
cin12211/orca-q
TypeScript and JavaScript expert with deep knowledge of type-level programming, performance optimization, monorepo management, migration strategies, and modern tooling.
tahabasri/snippets
LobeHub TypeScript style and type-safety guide. An agent skill from tahabasri/snippets.
BlkLeg/CircuitBreaker
Circuit Breaker code conventions and the quality gates that actually block a push — ruff, mypy, eslint, the pytest coverage ratchet, and the make verify tiers.
tjx666/vscode-mcp
TypeScript code style and repo conventions for VSCode MCP — inference vs explicit types, ESM import suffixes, zod schema contracts, async VSCode/Node APIs, JSON-safe IPC results, JSDoc for public…
fallow-rs/fallow-skills
Set up or modernize code-quality tooling for JavaScript and TypeScript projects.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Works with
Categories
Expert 10x engineer with extensive knowledge of TypeScript fundamentals, migration strategies, and best practices. Typescript Coder is an agent skill from LeoYeAI/openclaw-master-skills. Expert 10x engineer with extensive knowledge of TypeScript fundamentals, migration strategies, and best practices.
Typescript Coder fits situations like: asked to add TypeScript; migrate to TypeScript; add type checking; create TypeScript config.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill typescript-coder -a claude-code`. Or copy the skill folder (skills/typescript-coder in LeoYeAI/openclaw-master-skills) into .claude/skills/typescript-coder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill typescript-coder -a codex`. Or copy the skill folder (skills/typescript-coder in LeoYeAI/openclaw-master-skills) into .agents/skills/typescript-coder 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 LeoYeAI/openclaw-master-skills --skill typescript-coder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/typescript-coder, .gemini/skills/typescript-coder, .github/skills/typescript-coder and .opencode/skills/typescript-coder in your project.
Going by SKILL.md and its folder, Typescript Coder needs the command-line tools its instructions call (npm and npx). Our summary lists: Node.js.
SKILL.md names 2 domains. As links in the text: typescriptlang.org and basarat.gitbook.io. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Typescript Coder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.8k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 131k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Typescript Coder: Convert Internal Package to TypeScript (TryGhost/Ghost, 55k stars), Typescript Expert (cin12211/orca-q, 223 stars), Typescript (tahabasri/snippets, 170 stars) and Cb Code Quality (BlkLeg/CircuitBreaker, 201 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,158 GitHub stars. The repository holds 1,215 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.