원클릭으로
python-dev
Python development. Use for Python, FastAPI, Pydantic, asyncpg, pytest, pandas, SQLAlchemy.
메뉴
Python development. Use for Python, FastAPI, Pydantic, asyncpg, pytest, pandas, SQLAlchemy.
Use when user wants to create tests, generate test coverage, audit test quality, find untested code, or improve weak assertions. Use when user says write tests, test coverage, missing tests, or untested code.
Java development. Use for Java, Spring Boot, Maven, Gradle, JPA, Hibernate.
Swift development. Use for Swift, SwiftUI, UIKit, Vapor, SPM, XCTest, Combine.
Use when user wants to update requirements-dev.in with latest PyPI versions while preserving version patterns
Use when user wants to update requirements.in with latest PyPI versions while preserving version patterns
Use when starting any conversation - establishes how the development-skills plugin works and how to invoke its components on each platform (Claude Code, Codex). Read first.
| name | python-dev |
| description | Python development. Use for Python, FastAPI, Pydantic, asyncpg, pytest, pandas, SQLAlchemy. |
| user-invocable | true |
| allowed-tools | Glob, Read, Grep, Bash, Task, Skill, Edit, Write, AskUserQuestion |
Announce: "I'm using the python-dev skill. Following the 4-phase workflow."
You MUST read workflow.md NOW and follow ALL 4 phases defined there. The sections below provide Python-specific inputs for each phase.
Read patterns.md during Phase 1.
If you lost workflow.md from context: Re-read ../../shared/workflow.md NOW before continuing.
WORKFLOW STATE Verification line: pytest tests/ -x -q, ruff check, ruff format --check
Phase 3 Tier A commands:
pytest tests/ -x -q — default suite (unit + golden); excludes e2e and integration markerspytest tests/ -x -q -m e2e — e2e replay tests (no DB)pytest tests/ -x -q -m integration — integration tests (requires real DB)pytest tests/ -x -q -m '' — everythingruff check . — lintingruff format --check . — formattingpre-commit run --files <touched> — full hook chain (ruff + ruff-format + check-toml/yaml/merge-conflict + commitizen)Phase 3 Tier B additional MCP verifications:
app/model/<domain>/{models.py, requests.py, responses.py}; cross-cutting types in model/common/. Separate *Request from *Response; never merge. When a response carries both DB-mapped fields AND computed/Python-only fields, split into a *DbRow base (SELECT columns only) + a *Model subclass that adds enrichment and @computed_field properties. Query builders and aggregation utilities receive the DB-row base. Composition over deep inheritance.BaseSettings hierarchy, SecretStr for sensitive values, @lru_cache(maxsize=1) on the get_settings accessor. Tests that mutate env call get_settings.cache_clear().Exception handler in create_app + a per-domain-error handler in app/exception_handlers.py. Domain errors raised straight from service/repository; never wrapped in HTTPException. Handler detail strings hardcoded — never str(exc).except asyncio.CancelledError: raise separately from except Exception. Bounded asyncio.Queue for background work. asyncio.gather for independent queries. Heavy SDK clients constructed once at lifespan; blocking calls wrapped in asyncio.to_thread at adapter seams.patterns.mdpatterns.md.pytest tests/ -x -q.Exception handler in create_app; never per-endpoint try / except → HTTPException.TestClient(app, raise_server_exceptions=False) for any test that exercises the global handler.Add these to the shared workflow's verification checklist:
list[str] / dict[str, int], PEP 604 str | None; no from __future__ import annotations)from typing import List, Dict, Optional — use built-insBaseSettings for configuration; SecretStr for sensitive values*DbRow base + *Model subclass where DB-mapped and computed fields coexistjson_schema_extra used ONLY for OpenAPI examples — never for internal flagsException handler + per-domain handlers in app/exception_handlers.py; routes/services raise domain errors, never HTTPExceptionstr(exc) to clientsexcept asyncio.CancelledError re-raised; never swallowed in except BaseException@lru_cache(maxsize=1) on get_settings; tests call cache_clear() after env mutationsasyncio.to_thread at adapter seamsasyncpg.Record$1, $2) — no f-string interpolation of user inputasyncio.gather)IN (subquery) in one round tripasyncio_mode="auto" in pyproject.toml; markers golden, e2e, integrationTestClient(app, raise_server_exceptions=False) for tests that exercise the global handlerMagicMock(spec=Class) + AsyncMock for async methods; autouse fixture clears app.dependency_overridesiterrows()ruff check . passes; ruff format --check . passespytest tests/ -x -q passes (or alternative verification documented)