{"id":"7e3885c6-ddd2-4fa9-b9f7-086b01f61c6f","shortId":"h7cLvr","kind":"skill","title":"python-dev","tagline":"Opinionated Python development setup with uv + ty + ruff + pytest + just. Use when creating new Python projects, setting up pyproject.toml, configuring linting, type checking, testing, or build tooling. Triggers on \"python project\", \"uv init\", \"pyproject.toml\", \"ruff config\", \"ty","description":"# Python Development Setup\n\nOpinionated, production-ready Python development stack. No choices to make - just use this.\n\n## When to Use\n\n- Starting a new Python project\n- Modernizing an existing project (migrating from pip/poetry/mypy/black/flake8)\n- Setting up linting, formatting, type checking, or testing\n- Creating a Justfile for project commands\n- Configuring pyproject.toml as the single source of truth\n\n## The Stack\n\n| Tool | Role | Replaces |\n|------|------|----------|\n| [uv](https://docs.astral.sh/uv/) 0.10+ | Package manager, Python versions, runner | pip, poetry, pyenv, virtualenv |\n| [ty](https://docs.astral.sh/ty/) | Type checker (Astral, Rust) | mypy, pyright |\n| [ruff](https://docs.astral.sh/ruff/) | Linter + formatter | flake8, black, isort, pyupgrade |\n| [pytest](https://docs.pytest.org/) | Testing | unittest |\n| [just](https://just.systems/) | Command runner | make |\n\n## Quick Start: New Project\n\n```bash\n# 1. Create project with src layout\nuv init --package my-project\ncd my-project\n\n# 2. Pin Python version\nuv python pin 3.13\n\n# 3. Add dev dependencies\nuv add --dev ruff ty pytest pytest-asyncio pre-commit\n\n# 4. Create Justfile (see template below)\n# 5. Configure pyproject.toml (see template below)\n# 6. Run checks\njust check\n```\n\n## pyproject.toml Template\n\nThis is the single config file. Copy this and adjust `[project]` fields.\n\n```toml\n[project]\nname = \"my-project\"\nversion = \"0.1.0\"\ndescription = \"Project description\"\nreadme = \"README.md\"\nrequires-python = \">=3.13\"\nlicense = {text = \"MIT\"}\ndependencies = []\n\n[project.scripts]\nmy-project = \"my_project:main\"\n\n[dependency-groups]\ndev = [\n    \"ruff>=0.7.0\",\n    \"ty>=0.0.1a32\",\n    \"pytest>=8.0.0\",\n    \"pytest-asyncio>=1.0.0\",\n    \"pre-commit>=3.0.0\",\n]\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"src/my_project\"]\n\n# =============================================================================\n# RUFF - Loose, helpful rules only\n# =============================================================================\n[tool.ruff]\ntarget-version = \"py313\"\nline-length = 100\n\n[tool.ruff.lint]\nselect = [\n    \"E\",   # pycodestyle errors - syntax issues\n    \"F\",   # pyflakes - undefined vars, unused imports\n    \"I\",   # isort - import sorting\n    \"UP\",  # pyupgrade - modern Python syntax\n]\nignore = [\n    \"E501\",   # line too long - formatter handles it\n    \"E741\",   # ambiguous variable name - sometimes makes sense\n    \"UP007\",  # X | Y unions - Optional[X] is more readable\n]\nexclude = [\".git\", \".venv\", \"__pycache__\", \"build\", \"dist\"]\n\n[tool.ruff.format]\nquote-style = \"double\"\nindent-style = \"space\"\nline-ending = \"lf\"\n\n# =============================================================================\n# TY - Type Checker\n# =============================================================================\n[tool.ty.environment]\npython-version = \"3.13\"\n\n[tool.ty.src]\ninclude = [\"src\"]\n\n# =============================================================================\n# PYTEST\n# =============================================================================\n[tool.pytest.ini_options]\ntestpaths = [\"tests\"]\npython_files = [\"test_*.py\"]\npython_classes = [\"Test*\"]\npython_functions = [\"test_*\"]\nasyncio_mode = \"auto\"\naddopts = [\n    \"--strict-markers\",\n    \"--strict-config\",\n    \"-ra\",\n]\n```\n\n## Justfile Template\n\n```just\n# Check types and lint\ncheck:\n    uv run ty check\n    uv run ruff check --fix && uv run ruff format\n\n# Run tests\ntest *ARGS:\n    uv run pytest {{ARGS}}\n\n# Run tests with coverage\ntest-cov:\n    uv run pytest --cov=src --cov-report=term-missing\n\n# Auto-fix and format\nfix:\n    uv run ruff check --fix\n    uv run ruff format\n\n# Install/sync all dependencies\ninstall:\n    uv sync --all-groups\n\n# Update all dependencies\nupdate:\n    uv lock --upgrade\n    uv sync --all-groups\n\n# Clean build artifacts\nclean:\n    rm -rf dist/ build/ .pytest_cache/ .ruff_cache/ htmlcov/\n    find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true\n```\n\n## Pre-commit Config\n\nCreate `.pre-commit-config.yaml`:\n\n```yaml\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: check-added-large-files\n        args: ['--maxkb=1000']\n        exclude: ^uv\\.lock$\n      - id: detect-private-key\n      - id: check-merge-conflict\n      - id: check-yaml\n      - id: check-toml\n      - id: end-of-file-fixer\n      - id: trailing-whitespace\n      - id: mixed-line-ending\n        args: ['--fix=lf']\n\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.8.4\n    hooks:\n      - id: ruff\n        args: [--fix]\n      - id: ruff-format\n\nexclude: |\n  (?x)^(\n    \\.venv/.*|\n    \\.git/.*|\n    __pycache__/.*|\n    build/.*|\n    dist/.*|\n    uv\\.lock\n  )$\n```\n\nThen run: `uv run pre-commit install`\n\n## Project Structure\n\nAlways use src layout:\n\n```\nmy-project/\n  src/\n    my_project/\n      __init__.py\n      cli.py\n      models.py\n  tests/\n    conftest.py\n    test_models.py\n  pyproject.toml\n  Justfile\n  uv.lock\n  .python-version\n  .pre-commit-config.yaml\n  .gitignore\n```\n\n## Daily Workflow\n\n```bash\njust check          # Type check + lint + format\njust test           # Run tests\njust test -x        # Stop on first failure\njust fix            # Auto-fix lint issues\nuv add httpx        # Add a dependency\nuv add --dev hypothesis  # Add dev dependency\nuv run python -m my_project  # Run the project\n```\n\n## Existing Project Migration\n\n```bash\n# 1. Install uv if not present\nbrew install uv\n\n# 2. Convert requirements.txt to pyproject.toml deps\nuv add -r requirements.txt\n\n# 3. Replace mypy with ty\nuv remove --dev mypy\nuv add --dev ty\n\n# 4. Replace black/flake8/isort with ruff\nuv remove --dev black flake8 isort\nuv add --dev ruff\n\n# 5. Apply pyproject.toml config sections from template above\n# 6. Create Justfile from template above\n# 7. Run: just check\n```\n\n## Reference Docs\n\nDetailed guides for each tool in `references/`:\n- **uv-reference.md** - Project init, dependencies, lock/sync, Python versions, build/publish\n- **ty-reference.md** - Configuration, rules, CLI flags, known limitations\n- **ruff-reference.md** - Rule sets, formatter options, per-file ignores, CI integration\n- **pytest-reference.md** - Plugins, fixtures, async testing, conftest patterns\n- **justfile-reference.md** - Syntax, variables, parameters, shebang recipes, settings\n\n## Resources\n\n- [uv docs](https://docs.astral.sh/uv/) | [uv GitHub](https://github.com/astral-sh/uv)\n- [ty docs](https://docs.astral.sh/ty/) | [ty GitHub](https://github.com/astral-sh/ty)\n- [ruff docs](https://docs.astral.sh/ruff/) | [ruff GitHub](https://github.com/astral-sh/ruff)\n- [pytest docs](https://docs.pytest.org/en/stable/)\n- [just manual](https://just.systems/man/en/)","tags":["python","dev","skills","tenequm","agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","mpp","openclaw"],"capabilities":["skill","source-tenequm","skill-python-dev","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-clawhub","topic-erc-8004","topic-mpp","topic-openclaw","topic-skills","topic-solana","topic-x402"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tenequm/skills/python-dev","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tenequm/skills","source_repo":"https://github.com/tenequm/skills","install_from":"skills.sh"}},"qualityScore":"0.461","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 23 github stars · SKILL.md body (6,745 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T01:01:40.301Z","embedding":null,"createdAt":"2026-04-18T23:05:21.965Z","updatedAt":"2026-04-22T01:01:40.301Z","lastSeenAt":"2026-04-22T01:01:40.301Z","tsv":"'/)':137,143 '/astral-sh/ruff)':824 '/astral-sh/ruff-pre-commit':571 '/astral-sh/ty)':814 '/astral-sh/uv)':804 '/dev/null':503 '/en/stable/)':829 '/man/en/)':834 '/pre-commit/pre-commit-hooks':516 '/ruff/)':127,819 '/ty/)':117,809 '/uv/)':103,799 '0.0.1':258 '0.1.0':230 '0.10':104 '0.7.0':256 '1':152,680 '1.0.0':265 '100':295 '1000':528 '2':168,502,689 '3':176,699 '3.0.0':269 '3.13':175,239,368 '4':192,712 '5':198,727 '6':204,735 '7':741 '8.0.0':261 'a32':259 'ad':523 'add':177,181,655,657,661,664,696,709,724 'addopt':390 'adjust':220 'all-group':466,478 'alway':602 'ambigu':327 'appli':728 'arg':422,426,526,565,577 'artifact':483 'astral':120 'async':783 'asyncio':188,264,387 'auto':389,446,650 'auto-fix':445,649 'backend':277 'bash':151,629,679 'black':131,720 'black/flake8/isort':714 'brew':686 'build':29,271,276,346,482,488,588 'build-backend':275 'build-system':270 'build/publish':761 'cach':490,492 'cd':164 'check':26,78,206,208,401,405,409,413,454,522,539,544,548,631,633,744 'check-added-large-fil':521 'check-merge-conflict':538 'check-toml':547 'check-yaml':543 'checker':119,363 'choic':52 'ci':778 'class':382 'clean':481,484 'cli':765 'cli.py':614 'command':86,144 'commit':191,268,507,598 'config':39,215,396,508,730 'configur':23,87,199,763 'conflict':541 'conftest':785 'conftest.py':617 'convert':690 'copi':217 'cov':433,437,440 'cov-report':439 'coverag':430 'creat':16,81,153,193,509,736 'd':496 'daili':627 'dep':694 'depend':179,243,252,462,471,659,666,757 'dependency-group':251 'descript':231,233 'detail':747 'detect':534 'detect-private-key':533 'dev':3,178,182,254,662,665,706,710,719,725 'develop':6,42,49 'dist':347,487,589 'doc':746,796,806,816,826 'docs.astral.sh':102,116,126,798,808,818 'docs.astral.sh/ruff/)':125,817 'docs.astral.sh/ty/)':115,807 'docs.astral.sh/uv/)':101,797 'docs.pytest.org':136,828 'docs.pytest.org/)':135 'docs.pytest.org/en/stable/)':827 'doubl':352 'e':298 'e501':319 'e741':326 'end':359,552,564 'end-of-file-fix':551 'error':300 'exclud':342,529,583 'exec':499 'exist':68,676 'f':303 'failur':646 'field':222 'file':216,378,525,554,776 'find':494 'first':645 'fix':414,447,450,455,566,578,648,651 'fixer':555 'fixtur':782 'flag':766 'flake8':130,721 'format':76,418,449,459,582,635 'formatt':129,323,772 'function':385 'git':343,586 'github':801,811,821 'github.com':515,570,803,813,823 'github.com/astral-sh/ruff)':822 'github.com/astral-sh/ruff-pre-commit':569 'github.com/astral-sh/ty)':812 'github.com/astral-sh/uv)':802 'github.com/pre-commit/pre-commit-hooks':514 'gitignor':626 'group':253,468,480 'guid':748 'handl':324 'hatchl':274 'hatchling.build':278 'help':284 'hook':519,574 'htmlcov':493 'httpx':656 'hypothesi':663 'id':520,532,537,542,546,550,556,560,575,579 'ignor':318,777 'import':308,311 'includ':370 'indent':354 'indent-styl':353 'init':36,159,612,756 'instal':463,599,681,687 'install/sync':460 'integr':779 'isort':132,310,722 'issu':302,653 'just.systems':142,833 'just.systems/)':141 'just.systems/man/en/)':832 'justfil':83,194,398,620,737 'justfile-reference.md':787 'key':536 'known':767 'larg':524 'layout':157,605 'length':294 'lf':360,567 'licens':240 'limit':768 'line':293,320,358,563 'line-end':357 'line-length':292 'lint':24,75,404,634,652 'linter':128 'lock':474,531,591 'lock/sync':758 'long':322 'loos':283 'm':670 'main':250 'make':54,146,331 'manag':106 'manual':831 'marker':393 'maxkb':527 'merg':540 'migrat':70,678 'miss':444 'mit':242 'mix':562 'mixed-line-end':561 'mode':388 'models.py':615 'modern':66,315 'my-project':161,165,226,245,606 'mypi':122,701,707 'name':225,329,497 'new':17,63,149 'opinion':4,44 'option':337,374,773 'packag':105,160,280 'paramet':790 'pattern':786 'per':775 'per-fil':774 'pin':169,174 'pip':110 'pip/poetry/mypy/black/flake8':72 'plugin':781 'poetri':111 'pre':190,267,506,597 'pre-commit':189,266,505,596 'pre-commit-config.yaml':510,625 'present':685 'privat':535 'product':46 'production-readi':45 'project':19,34,65,69,85,150,154,163,167,221,224,228,232,247,249,600,608,611,672,675,677,755 'project.scripts':244 'py':380,613 'py313':291 'pycach':345,498,587 'pycodestyl':299 'pyenv':112 'pyflak':304 'pyproject.toml':22,37,88,200,209,619,693,729 'pyright':123 'pytest':12,134,185,187,260,263,372,425,436,489,825 'pytest-asyncio':186,262 'pytest-reference.md':780 'python':2,5,18,33,41,48,64,107,170,173,238,316,366,377,381,384,623,669,759 'python-dev':1 'python-vers':365,622 'pyupgrad':133,314 'quick':147 'quot':350 'quote-styl':349 'r':697 'ra':397 'readabl':341 'readi':47 'readm':234 'readme.md':235 'recip':792 'refer':745,753 'remov':705,718 'replac':99,700,713 'repo':512,513,568 'report':441 'requir':237,273 'requirements.txt':691,698 'requires-python':236 'resourc':794 'rev':517,572 'rf':486,501 'rm':485,500 'role':98 'ruff':11,38,124,183,255,282,412,417,453,458,491,576,581,716,726,815,820 'ruff-format':580 'ruff-reference.md':769 'rule':285,764,770 'run':205,407,411,416,419,424,427,435,452,457,593,595,638,668,673,742 'runner':109,145 'rust':121 'section':731 'see':195,201 'select':297 'sens':332 'set':20,73,771,793 'setup':7,43 'shebang':791 'singl':91,214 'skill' 'skill-python-dev' 'sometim':330 'sort':312 'sourc':92 'source-tenequm' 'space':356 'src':156,371,438,604,609 'src/my_project':281 'stack':50,96 'start':61,148 'stop':643 'strict':392,395 'strict-config':394 'strict-mark':391 'structur':601 'style':351,355 'sync':465,477 'syntax':301,317,788 'system':272 'target':289 'target-vers':288 'templat':196,202,210,399,733,739 'term':443 'term-miss':442 'test':27,80,138,376,379,383,386,420,421,428,432,616,637,639,641,784 'test-cov':431 'test_models.py':618 'testpath':375 'text':241 'toml':223,549 'tool':30,97,751 'tool.hatch.build.targets.wheel':279 'tool.pytest.ini':373 'tool.ruff':287 'tool.ruff.format':348 'tool.ruff.lint':296 'tool.ty.environment':364 'tool.ty.src':369 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-clawhub' 'topic-erc-8004' 'topic-mpp' 'topic-openclaw' 'topic-skills' 'topic-solana' 'topic-x402' 'trail':558 'trailing-whitespac':557 'trigger':31 'true':504 'truth':94 'ty':10,40,114,184,257,361,408,703,711,805,810 'ty-reference.md':762 'type':25,77,118,362,402,495,632 'undefin':305 'union':336 'unittest':139 'unus':307 'up007':333 'updat':469,472 'upgrad':475 'use':14,56,60,603 'uv':9,35,100,158,172,180,406,410,415,423,434,451,456,464,473,476,530,590,594,654,660,667,682,688,695,704,708,717,723,795,800 'uv-reference.md':754 'uv.lock':621 'v0.8.4':573 'v5.0.0':518 'var':306 'variabl':328,789 'venv':344,585 'version':108,171,229,290,367,624,760 'virtualenv':113 'whitespac':559 'workflow':628 'x':334,338,584,642 'y':335 'yaml':511,545","prices":[{"id":"9306124d-72b7-4d18-86dd-0836aef138a3","listingId":"7e3885c6-ddd2-4fa9-b9f7-086b01f61c6f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tenequm","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:05:21.965Z"}],"sources":[{"listingId":"7e3885c6-ddd2-4fa9-b9f7-086b01f61c6f","source":"github","sourceId":"tenequm/skills/python-dev","sourceUrl":"https://github.com/tenequm/skills/tree/main/skills/python-dev","isPrimary":false,"firstSeenAt":"2026-04-18T23:05:21.965Z","lastSeenAt":"2026-04-22T01:01:40.301Z"}],"details":{"listingId":"7e3885c6-ddd2-4fa9-b9f7-086b01f61c6f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tenequm","slug":"python-dev","github":{"repo":"tenequm/skills","stars":23,"topics":["agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","mpp","openclaw","skills","solana","x402"],"license":"mit","html_url":"https://github.com/tenequm/skills","pushed_at":"2026-04-14T16:24:57Z","description":"Agent skills for building, shipping, and growing software products","skill_md_sha":"42148a18da99589c33c8eed4c323bbe6075b3de4","skill_md_path":"skills/python-dev/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tenequm/skills/tree/main/skills/python-dev"},"layout":"multi","source":"github","category":"skills","frontmatter":{"name":"python-dev","description":"Opinionated Python development setup with uv + ty + ruff + pytest + just. Use when creating new Python projects, setting up pyproject.toml, configuring linting, type checking, testing, or build tooling. Triggers on \"python project\", \"uv init\", \"pyproject.toml\", \"ruff config\", \"ty check\", \"pytest setup\", \"justfile\", \"python linting\", \"python formatting\", \"type checking python\"."},"skills_sh_url":"https://skills.sh/tenequm/skills/python-dev"},"updatedAt":"2026-04-22T01:01:40.301Z"}}