Skip to content
library-writer logo

Library Writer

library-writer

This skill should be used when writing software libraries, packages, or modules following battle-tested patterns for clean, minimal, production-ready code. It applies when creating new libraries, refactoring existing ones, designing library APIs, or when clean, dependency-minimal library code is ...

SKILL.md

Full skill instructions

Library Writer

Write software libraries following battle-tested patterns from the most successful open-source maintainers. These patterns have been proven across hundreds of libraries with billions of downloads.

Core Philosophy

Simplicity over cleverness. Zero or minimal dependencies. Explicit code over metaprogramming. Framework integration without framework coupling. Every pattern serves production use cases.

The best library is the one you don't have to think about. It should:

  • Install easily
  • Configure simply
  • Work as expected
  • Not break on upgrades
  • Have obvious documentation

Entry Point Structure

Every library follows this pattern:

1. Dependencies (stdlib preferred)
2. Internal modules (relative imports)
3. Conditional framework loading (never require frameworks directly)
4. Module with config and errors

Why This Order?

  1. Dependencies first - Fail fast if deps are missing
  2. Internal modules - Load library components
  3. Conditional framework - Don't force framework on non-framework users
  4. Config and errors - Ready for use immediately

Conditional Framework Loading

Never require frameworks directly. Check if they exist first:

# Only load framework integration if framework is present
if framework_is_loaded:
  load framework_integration

# This allows the library to work:
# - In framework apps (with integration)
# - In plain apps (without framework overhead)
# - In test environments (isolated)

See framework-integration.md for detailed patterns.

Configuration Pattern

Use simple accessors, not Configuration objects:

Good:
  MyLib.api_key = "..."
  MyLib.timeout = 30
  MyLib.logger = custom_logger

Bad:
  MyLib.configure do |config|
    config.api_key = "..."
    config.timeout = 30
    config.logger = custom_logger
  end

Why Simple Accessors?

  • Easier to understand (just assignment)
  • Can be set from anywhere
  • No DSL to learn
  • Works with environment variables naturally
  • Testable (just set the value)

Configuration Defaults

Set sensible defaults immediately:

Module MyLib:
  timeout = 10           # Reasonable default
  logger = null          # Optional
  api_key = ENV["KEY"]   # From environment

See api-design.md for API patterns.

Error Handling

Simple hierarchy with informative messages:

Module MyLib:
  class Error (base error)
  class ConfigError (configuration problems)
  class ValidationError (invalid input)
  class ConnectionError (network issues)

Error Design Principles

  1. Inherit from standard error class - Works with existing error handling
  2. Few error types - Don't create an error for every situation
  3. Informative messages - Include what went wrong and how to fix it
  4. Validate early - Raise ArgumentError on bad input immediately
Good error message:
  "API key must be 32 characters, got 16. Set MyLib.api_key or MYLIB_API_KEY environment variable."

Bad error message:
  "Invalid key"

API Design Principles

Class Macro Pattern

The signature pattern for libraries that enhance classes:

Usage:
  class Product:
    searchable(fields: ["name", "description"])

Implementation:
  def searchable(**options):
    validate_options(options)
    store_options(options)
    add_methods()

Single Configuration Method

One method call should configure everything:

Good:
  class User:
    authenticatable()  # Adds all auth methods

Bad:
  class User:
    add_password_field()
    add_session_methods()
    add_remember_token()
    configure_encryption()

See api-design.md for detailed patterns.

Dependency Management

Zero Runtime Dependencies (When Possible)

Good:
  # Use stdlib for common operations
  # Vendor small utilities if needed
  # No runtime dependencies in manifest

Bad:
  # Dependencies for things stdlib handles
  # Dependencies for "convenience"
  # Dependencies that pull in more dependencies

Development Dependencies

Keep development dependencies separate:

Development only:
  - Test framework
  - Linting tools
  - Documentation generators
  - Debug utilities

Never in production:
  - These don't ship with the library
  - Users don't install them

Lock Files

Never commit lock files in libraries. Lock files:

  • Lock to specific versions you tested with
  • Prevent users from getting compatible updates
  • Cause conflicts with user's other dependencies

See module-organization.md for structure patterns.

Testing Philosophy

Use Standard Test Framework

Every language has a standard test framework. Use it.

Python: pytest or unittest
JavaScript: Jest or Vitest
Go: testing stdlib
Rust: built-in test
Ruby: Minitest

What to Test

1. Public API - Every public method
2. Edge cases - Empty input, null, large data
3. Error conditions - Invalid input, network failures
4. Configuration - Different config combinations
5. Integration - With frameworks (if applicable)

Test Structure

tests/
├── unit/           # Fast, isolated tests
├── integration/    # Tests with external systems
└── fixtures/       # Test data

See testing-patterns.md for detailed patterns.

Anti-Patterns to Avoid

PatternProblemAlternative
Dynamic method generationHard to understand, debugDefine methods explicitly
Configuration objectsUnnecessary complexitySimple accessors
Tight framework couplingLimits library usageConditional loading
Many runtime dependenciesBloat, conflicts, securityUse stdlib, vendor
Heavy DSLsLearning curve, magicExplicit method calls
Metaprogramming magicDebugging nightmareClear, explicit code
Committing lock filesVersion conflictsLet users manage deps

Directory Structure

my-library/
├── lib/                    # Source code (or src/)
│   ├── my_library.ext      # Entry point
│   ├── my_library/         # Internal modules
│   │   ├── client.ext
│   │   ├── config.ext
│   │   └── errors.ext
│   └── my_library/​integrations/  # Framework integrations
│       └── framework.ext
├── tests/                  # Test files
├── README.md               # Documentation
├── LICENSE                 # License file
└── [package manifest]      # package.json, setup.py, etc.

See module-organization.md for detailed structure.

Reference Files

For deeper patterns, see:

FileTopics
module-organization.mdDirectory layouts, file structure, require/​import patterns
framework-integration.mdConditional loading, hooks, lazy initialization
testing-patterns.mdMulti-version testing, CI setup, fixture patterns
api-design.mdPublic interface design, class macros, configuration

Success Criteria

A well-designed library:

  • Installs with one command
  • Configures with simple assignment
  • Works without framework (if applicable)
  • Has zero or minimal dependencies
  • Uses explicit, readable code
  • Tests pass across supported versions
  • Documents the public API clearly
  • Handles errors informatively
  • Doesn't break on upgrades

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View