firstp1ck/pi-coding-agent-forge/design-patterns
Claude Code and agent skill by firstp1ck/pi-coding-agent-forge
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Agents should invoke this skill when choosing patterns, designing traits/interfaces/components, deciding abstraction boundaries, evaluating dependency injection/callbacks, or comparing implementation approaches in Rust, TypeScript/React, or Django/Python.
Install
npx vskill@latest install firstp1ck/pi-coding-agent-forge/design-patternsSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
Design Patterns
Pattern recommendations tailored to the user's tech stacks. Every pattern recommendation includes when to use it, when to avoid it, and the trade-offs.
Quick Start
Choose a Pattern
- Identify the problem: What design challenge are you solving?
- Consider the context: What language? What scale? How often will this change?
- Evaluate options: 2-3 candidate patterns with trade-offs
- Recommend: The best fit for this specific context (not the "best pattern in general")
The golden rule: Patterns are tools, not goals. Use the simplest pattern that solves the problem. If no pattern fits, a plain function or struct is fine.
Rust Patterns
Newtype Pattern
Wrap a primitive to add type safety and domain meaning.
When to use: When two values have the same underlying type but different meanings. When to skip: One-off uses where a type alias suffices.
Builder Pattern
Construct complex objects step by step.
When to use: Structs with many optional fields, complex construction logic. When to skip: Structs with 1-3 required fields — just use new().
Typestate Pattern
Encode state transitions in the type system so invalid states are unrepresentable.
When to use: Protocols with clear state transitions (connections, workflows, parsing stages). When to skip: Simple on/off states — a boolean or enum is clearer.
Trait Objects vs Generics
| Approach | Dispatch | Binary Size | Flexibility | |
|---|---|---|---|---|
impl Trait (generics) | Static (monomorphized) | Larger (one copy per type) | Known at compile time | |
dyn Trait (trait objects) | Dynamic (vtable) | Smaller (one copy) | Extensible at runtime |
Use generics when: Performance matters, types are known at compile time, you want zero-cost abstraction. Use trait objects when: You need heterogeneous collections, plugin systems, or the set of types is open-ended.
Error Handling Patterns
| Pattern | When | Crate | |
|---|---|---|---|
thiserror | Library errors — structured, specific variants | thiserror | |
anyhow | Application errors — context-rich, propagate quickly | anyhow | |
| Custom enum | When you need exhaustive matching by callers | std only |
Rule of thumb: Libraries use thiserror (callers need to match). Applications use anyhow (callers need context).
TypeScript / React Patterns
Compound Components
Components that work together implicitly via shared context.
When to use: Complex UI components with multiple related parts (menus, accordions, tabs). When to skip: Simple components with 1-2 elements.
Custom Hook Composition
Extract and compose behavior into reusable hooks.
When to use: Shared stateful logic across components, complex state management within a component. When to skip: One-off logic that doesn't repeat.
Discriminated Unions
Type-safe state modeling using TypeScript's union types.
When to use: State machines, API response states, form states, anything with distinct modes. When to skip: Boolean flags are fine for simple on/off states.
State Management Decision Tree
- UI-local state? ->
useState/useReducer - Shared between siblings? -> Lift state to common parent
- Shared across distant components? -> React Context
- Complex state logic? ->
useReducer+ Context - Server state (API data)? -> TanStack Query / SWR
- Global app state? -> Zustand / Jotai (prefer over Redux for new projects)
Django / Python Patterns
Service Layer
Separate business logic from views and models.
When to use: Business logic that involves multiple models, external calls, or complex validation. When to skip: Simple CRUD with no business rules beyond Django's built-in validation.
Repository Pattern (QuerySet Abstraction)
Custom managers and querysets to encapsulate query logic.
When to use: Complex or reusable query logic, domain-specific filtering. When to skip: One-off queries or simple filters.
Signals vs Explicit Calls
| Approach | Pros | Cons | |
|---|---|---|---|
| Django signals | Decoupled, works across apps | Hidden control flow, hard to debug, ordering issues | |
| Explicit calls | Visible, debuggable, testable | Coupling between modules |
Rule of thumb: Use signals for truly cross-cutting concerns (audit logging, cache invalidation). Use explicit calls for business-critical logic where you need to understand and test the flow.
Anti-Patterns (All Stacks)
| Anti-Pattern | Problem | Fix | |
|---|---|---|---|
| Premature abstraction | Abstracting before seeing the pattern repeat | Wait for 3 instances before extracting | |
| Inheritance over composition | Deep inheritance hierarchies, fragile base class | Prefer composition (traits, hooks, mixins) | |
| God object | One class/module that does everything | Split by responsibility (SRP) | |
| Shotgun surgery | One change requires editing many files | Group related code together | |
| Feature envy | A function uses another class's data more than its own | Move the function to the class it envies | |
| Speculative generality | Building for use cases that may never come | YAGNI — build for now, refactor when needed | |
| Golden hammer | Using the same pattern/tool for everything | Choose the right tool for the job |
Pattern Selection Guide
When asked "which pattern should I use?":
- Describe the problem (not the pattern you think fits)
- Identify constraints (performance, extensibility, team size, timeline)
- Present 2-3 options with trade-offs
- Recommend one with clear justification
- Note when to revisit — "If X changes, reconsider Y"
Integration
- Data: Pattern decisions logged to
MEMORY.md(Patterns in Use section) - Cross-reference: architecture-review skill for structural assessment, refactoring-advisor for migration planning
- Anti-patterns: When anti-patterns are detected, link to refactoring-advisor for remediation planning
_Arc skill — Design pattern selection and guidance_
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingpi-skill-design-patterns/skills/design-patterns/SKILL.md
Popularity
- 7-day trend score
- 5
Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/firstp1ck/pi-coding-agent-forge/design-patterns)