スキル一覧に戻る
srstomp

sdk-development

by srstomp

An orchestration plugin for Claude Code that enables reliable autonomous development sessions with configurable checkpoints and task management.

0🍴 0📅 2026年1月23日
GitHubで見るManusで実行

SKILL.md


name: sdk-development description: Create, extract, and publish TypeScript SDKs. Covers analyzing existing applications to extract reusable logic, designing clean SDK APIs, implementing typed clients with proper error handling, bundling for multiple targets (ESM/CJS/browser), and publishing to npm (public or private registries). Use this skill when building SDKs, extracting shared code into packages, or creating developer tooling libraries.

SDK Development

Create professional TypeScript SDKs from scratch or by extraction.

Development Process

┌─────────────────────────────────────────────────────────────┐
│                   SDK DEVELOPMENT PROCESS                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. ANALYZE          2. DESIGN           3. IMPLEMENT       │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │ Find code   │ →  │ Define API  │ →  │ Build SDK   │     │
│  │ Map deps    │    │ Plan types  │    │ Add types   │     │
│  │ Set bounds  │    │ Error strat │    │ Handle errs │     │
│  └─────────────┘    └─────────────┘    └─────────────┘     │
│                                                             │
│  4. BUILD            5. TEST            6. PUBLISH          │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐     │
│  │ Bundle      │ →  │ Unit tests  │ →  │ npm publish │     │
│  │ ESM/CJS     │    │ Integration │    │ Docs        │     │
│  │ Types       │    │ Examples    │    │ Changelog   │     │
│  └─────────────┘    └─────────────┘    └─────────────┘     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Extraction Workflow

When extracting SDK from existing application:

┌─────────────────────────────────────────────────────────────┐
│                    EXTRACTION WORKFLOW                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  EXISTING APP                        NEW SDK PACKAGE        │
│  ┌─────────────────────┐            ┌─────────────────────┐│
│  │ src/                │            │ @org/auth-sdk/      ││
│  │ ├── services/       │            │ ├── src/            ││
│  │ │   └── auth/       │ ────────►  │ │   ├── client.ts   ││
│  │ │       ├── client  │  Extract   │ │   ├── types.ts    ││
│  │ │       ├── types   │            │ │   └── errors.ts   ││
│  │ │       └── errors  │            │ ├── package.json    ││
│  │ └── utils/          │            │ └── tsconfig.json   ││
│  └─────────────────────┘            └─────────────────────┘│
│                                              │              │
│                                              ▼              │
│  UPDATED APP                         npm publish            │
│  ┌─────────────────────┐                     │              │
│  │ import { AuthClient }│ ◄──────────────────┘              │
│  │ from '@org/auth-sdk' │                                   │
│  └─────────────────────┘                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Quick Start

New SDK Structure

my-sdk/
├── src/
│   ├── index.ts           # Public exports
│   ├── client.ts          # Main client class
│   ├── types.ts           # Public types
│   ├── errors.ts          # Error classes
│   └── internal/          # Internal utilities
│       └── http.ts
├── tests/
│   ├── client.test.ts
│   └── integration/
├── examples/
│   └── basic-usage.ts
├── package.json
├── tsconfig.json
├── tsup.config.ts         # Build config
├── vitest.config.ts       # Test config
├── README.md
├── CHANGELOG.md
└── LICENSE

Minimal package.json

{
  "name": "@org/my-sdk",
  "version": "1.0.0",
  "description": "SDK for My Service",
  "type": "module",
  "exports": {
    ".": {
      "import": "./dist/index.js",
      "require": "./dist/index.cjs",
      "types": "./dist/index.d.ts"
    }
  },
  "main": "./dist/index.cjs",
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "files": ["dist"],
  "scripts": {
    "build": "tsup",
    "test": "vitest",
    "prepublishOnly": "npm run build && npm test"
  },
  "devDependencies": {
    "tsup": "^8.0.0",
    "typescript": "^5.0.0",
    "vitest": "^1.0.0"
  },
  "peerDependencies": {
    "typescript": ">=4.7"
  },
  "peerDependenciesMeta": {
    "typescript": { "optional": true }
  }
}

Minimal tsup.config.ts

import { defineConfig } from 'tsup';

export default defineConfig({
  entry: ['src/index.ts'],
  format: ['esm', 'cjs'],
  dts: true,
  clean: true,
  sourcemap: true,
});

SDK Design Principles

1. Clean Public API

// ✅ Good: Clear, minimal exports
export { AuthClient } from './client';
export { AuthError, TokenExpiredError } from './errors';
export type { AuthConfig, User, Session } from './types';

// ❌ Bad: Exposing internals
export * from './internal/http';
export { parseJwt } from './utils';

2. Typed Everything

// ✅ Good: Full type coverage
interface AuthConfig {
  baseUrl: string;
  timeout?: number;
  onTokenRefresh?: (token: string) => void;
}

class AuthClient {
  constructor(config: AuthConfig) {}
  
  async login(email: string, password: string): Promise<Session> {}
  async logout(): Promise<void> {}
  getUser(): User | null {}
}

3. Meaningful Errors

// ✅ Good: Typed, informative errors
class AuthError extends Error {
  constructor(
    message: string,
    public code: string,
    public statusCode?: number,
  ) {
    super(message);
    this.name = 'AuthError';
  }
}

class TokenExpiredError extends AuthError {
  constructor() {
    super('Access token has expired', 'TOKEN_EXPIRED', 401);
    this.name = 'TokenExpiredError';
  }
}

4. Sensible Defaults

// ✅ Good: Works out of the box
const client = new AuthClient({
  baseUrl: 'https://api.example.com',
  // timeout: 30000 (default)
  // retries: 3 (default)
  // storage: localStorage (default in browser)
});

5. Framework Agnostic

// ✅ Good: Core SDK has no framework deps
// @org/auth-sdk        - Core SDK
// @org/auth-sdk-react  - React bindings (optional)
// @org/auth-sdk-vue    - Vue bindings (optional)

Extraction Checklist

Before Extraction

  • Identify all code to extract
  • Map internal dependencies
  • Identify external dependencies
  • Find all usages in app
  • Document current behavior
  • Write tests for existing behavior

During Extraction

  • Create new package structure
  • Move code incrementally
  • Update imports in original app
  • Run tests after each move
  • Keep original working until done

After Extraction

  • SDK has its own tests
  • Original app uses SDK as dependency
  • No duplicate code remains
  • Documentation complete
  • Examples provided

Anti-Patterns

❌ Leaking Internals

// Bad: Internal types exposed
export interface _InternalHttpConfig { ... }
export function _makeRequest() { ... }

// Good: Only public API exported
export { AuthClient } from './client';
export type { AuthConfig } from './types';

❌ Tight Coupling

// Bad: SDK depends on app-specific code
import { appConfig } from '../../../config';
import { logger } from '../../../utils/logger';

// Good: SDK is self-contained, configurable
class AuthClient {
  constructor(config: AuthConfig) {
    this.baseUrl = config.baseUrl;
    this.logger = config.logger ?? console;
  }
}

❌ No Error Handling

// Bad: Raw errors bubble up
async function login() {
  const res = await fetch('/auth/login');
  return res.json(); // What if it fails?
}

// Good: Wrapped, typed errors
async function login() {
  try {
    const res = await fetch('/auth/login');
    if (!res.ok) {
      throw AuthError.fromResponse(res);
    }
    return res.json();
  } catch (err) {
    throw AuthError.wrap(err);
  }
}

❌ Breaking Changes

// Bad: Rename without deprecation
// v1: login(email, password)
// v2: signIn(credentials) // Breaks all users!

// Good: Deprecate, then remove
/** @deprecated Use signIn() instead */
login(email: string, password: string) {
  return this.signIn({ email, password });
}

signIn(credentials: Credentials) { ... }

References:

スコア

総合スコア

60/100

リポジトリの品質指標に基づく評価

SKILL.md

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

+20
LICENSE

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

0/10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

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

0/5
Issue管理

オープンIssueが50未満

+5
言語

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

+5
タグ

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

0/5

レビュー

💬

レビュー機能は近日公開予定です