agentsclimarketplace

Unicorn javascript

Skill andrey-learning-machines/swe-harness/plugins/swe-harness/skills/unicorn-javascript

Portable SWE harness plugin for Codex and Claude Code

Install
npx -y skills add andrey-learning-machines/swe-harness --skill unicorn-javascript

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Guides JavaScript and TypeScript development with modern tooling and patterns. ALWAYS trigger on "typescript", "javascript", "tsconfig", "eslint", "prettier", "vitest", "jest", "react", "node.js", "express", "npm", "package.json", "type error", "ts error", "js project setup", "frontend testing", "react hooks", "discriminated union", "type guard". Use when configuring TS/JS tooling, writing tests, structuring React or Node apps, or debugging type issues. Different from testing skill which covers general strategy; this covers JS/TS-specific test patterns and framework configs.

SKILL.md

6.6 KB, as published. Nobody here has run it

JavaScript/TypeScript Domain Skill

TypeScript Essentials

Utility types (use these instead of manual definitions):

TypeEffect
Pick<T, K>Subset of properties
Omit<T, K>Exclude properties
Partial<T>All optional
Required<T>All required
Record<K, V>Key-value map
ReturnType<typeof fn>Extract return type
Awaited<Promise<T>>Unwrap promise type
Extract<T, U> / Exclude<T, U>Filter union members

Generics:

interface ApiResponse<T> {
  data: T;
  status: number;
}

function fetchData<T>(url: string): Promise<ApiResponse<T>> {
  return fetch(url).then(res => res.json());
}

Advanced TypeScript: See references/typescript-advanced.md for conditional types, mapped types, branded types, infer.

Configuration

TypeScript (tsconfig.json)

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "lib": ["ES2022", "DOM"],
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  }
}

ESLint

module.exports = {
  parser: '@typescript-eslint/parser',
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
  ],
  rules: {
    '@typescript-eslint/no-explicit-any': 'error',
  },
};

Prettier

module.exports = {
  semi: true,
  singleQuote: true,
  trailingComma: 'all',
  printWidth: 100,
};

Package Scripts

{
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "test": "vitest",
    "lint": "eslint . --ext .ts,.tsx --fix",
    "format": "prettier --write \"src/**/*.{ts,tsx}\""
  }
}

Testing

import { describe, it, expect, vi } from 'vitest';

describe('UserService', () => {
  it('fetches user data', async () => {
    const user = await service.fetchUser('123');
    expect(user).toBeDefined();
    expect(user.id).toBe('123');
  });

  it('throws on invalid ID', async () => {
    await expect(service.fetchUser('invalid'))
      .rejects.toThrow('User not found');
  });
});

// Mocking
vi.mock('./api', () => ({ fetchUser: vi.fn() }));
vi.mocked(fetchUser).mockResolvedValue({ id: '1', name: 'Alice' });

React component testing:

import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

it('submits form', async () => {
  render(<LoginForm onSubmit={vi.fn()} />);
  await userEvent.type(screen.getByLabelText(/email/i), '[email protected]');
  await userEvent.click(screen.getByRole('button', { name: /submit/i }));
  await waitFor(() => {
    expect(screen.getByText(/success/i)).toBeInTheDocument();
  });
});

See references/testing-examples.md for mocking patterns, integration tests, test factories.

React Patterns

Custom hook with cleanup:

function useUser(userId: string) {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    let cancelled = false;
    fetchUser(userId).then(data => {
      if (!cancelled) setUser(data);
      setLoading(false);
    });
    return () => { cancelled = true; };
  }, [userId]);

  return { user, loading };
}

Performance:

const sorted = useMemo(() => [...items].sort(), [items]);
const handleClick = useCallback(() => doSomething(), []);
const MemoComponent = memo(({ data }: Props) => <div>{data}</div>);

See references/react-patterns.md for compound components, context, forms, code splitting.

Node.js Patterns

Async handler wrapper (Express):

function asyncHandler(fn: (req: Request, res: Response) => Promise<void>) {
  return (req: Request, res: Response, next: NextFunction) => {
    Promise.resolve(fn(req, res)).catch(next);
  };
}

app.get('/users/:id', asyncHandler(async (req, res) => {
  const user = await userService.findById(req.params.id);
  if (!user) { res.status(404).json({ error: 'User not found' }); return; }
  res.json(user);
}));

See references/node-patterns.md for middleware, streams, database patterns, error handling.

Common Patterns

Result type:

type Result<T, E = string> =
  | { success: true; data: T }
  | { success: false; error: E };

Type guard:

function isUser(obj: unknown): obj is User {
  return typeof obj === 'object' && obj !== null && 'id' in obj;
}

Discriminated union:

type Response =
  | { status: 'success'; data: User }
  | { status: 'error'; error: string }
  | { status: 'loading' };

function handle(response: Response) {
  switch (response.status) {
    case 'success': return response.data;  // type-narrowed
    case 'error': throw new Error(response.error);
  }
}

Anti-patterns Quick Reference

Anti-patternFix
any typeProper types or unknown with validation
Mutating arrays/objects in placeSpread: [...arr, item], { ...obj, key: val }
Nested .then() chainsasync/await
Missing error handling on asynctry/catch or .catch()
React state mutation arr.push()setArr(prev => [...prev, item])
Missing useEffect depsInclude all referenced values
Unstable object refs in renderHoist constants or useMemo
Circular importsExtract shared code to shared.ts
console.log in productionStructured logger
Non-exhaustive switch on unionAdd default: assertNever(x)

Naming: camelCase (variables, functions), PascalCase (classes, types, components), SCREAMING_SNAKE_CASE (constants).

Reference Documentation

  • references/typescript-advanced.md - Generics, conditional types, mapped types, branded types
  • references/react-patterns.md - Hooks, component patterns, performance, state management, forms
  • references/node-patterns.md - Express, async patterns, streams, database patterns
  • references/testing-examples.md - Jest/Vitest config, mocking, component testing, integration tests

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.