Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate Python project scaffolding with Poetry/pipenv, pytest configuration, type hints (mypy), linting (ruff/black), and packaging (setuptools/flit).
.claude/skills/williamzujkowski-python-tooling-specialist/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 263% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 434% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 77% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 319% | 0% |
Trigger conditions:
Not for:
Time normalization:
NOW_ET using NIST/time.gov semantics (America/New_York, ISO-8601)NOW_ET for all citation access datesInput validation:
project_type must be one of: library, application, cli, data-pipelinedependency_manager must be one of: poetry, pipenv, pip-toolspython_version must be one of: 3.9, 3.10, 3.11, 3.12 (string format)project_name must be valid Python package name (lowercase, hyphens allowed)Source freshness:
Fast path for common cases:
project_name/ src/project_name/ # for library/cli __init__.py py.typed # PEP 561 marker project_name/ # for application/data-pipeline __init__.py tests/ __init__.py conftest.py docs/ .gitignore README.md pyproject.toml
python_version input)Decision: If only basic scaffolding needed → STOP at T1; otherwise proceed to T2.
Extended configuration with all tools:
Poetry (pyproject.toml) accessed 2025-10-26T02:31:27-04:00 toml tool.poetry] name = "project-name" version = "0.1.0" description = "" authors = "Your Name <you@example.com>"]
tool.poetry.dependencies] python = "^3.11"
tool.poetry.group.dev.dependencies] pytest = "^7.4.0" pytest-cov = "^4.1.0" mypy = "^1.5.0" ruff = "^0.1.0" black = "^23.9.0"
pipenv (Pipfile) accessed 2025-10-26T02:31:27-04:00
pip-tools (requirements.in) accessed 2025-10-26T02:31:27-04:00
toml [tool.pytest.ini_options] minversion = "7.0" addopts = "-ra -q --strict-markers --cov=src" testpaths = ["tests"] pythonpath = ["src"] markers = [ "slow: marks tests as slow", "integration: marks tests as integration tests", ]
toml [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true
Ruff (all-in-one linter/formatter) accessed 2025-10-26T02:31:27-04:00 toml [tool.ruff] target-version = "py311" line-length = 100 select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501"]
Black (code formatter) accessed 2025-10-26T02:31:27-04:00 toml [tool.black] line-length = 100 target-version = ['py311']
.pre-commit-config.yamlmakefile .PHONY: test lint format typecheck install
install: poetry install
test: pytest
lint: ruff check .
format: black . ruff check --fix .
typecheck: mypy src
Deep configuration for publishable packages:
[tool.poetry.build-system] or [build-system]poetry version integrationtoml [tool.poetry.scripts] my-cli = "project_name.cli:main"
Dependency Manager Selection:
Project Type Structure:
src/package_name/, includes py.typed, strict mypypackage_name/, relaxed typing, focus on integration testsAbort Conditions:
project_name (contains uppercase, special chars) → error "Invalid package name"python_version → error "Python version must be 3.9+"Tool Version Selection:
NOW_ETSchema (JSON):
json{ "project_name": "string", "project_type": "library | application | cli | data-pipeline", "python_version": "string", "dependency_manager": "poetry | pipenv | pip-tools", "structure": { "directories": ["string"], "files": { "path/to/file": "file content (string)" } }, "commands": { "install": "string", "test": "string", "lint": "string", "format": "string", "publish": "string (optional)" }, "next_steps": ["string"], "timestamp": "ISO-8601 string (NOW_ET)" }
Required Fields:
project_name, project_type, python_version, dependency_manager, structure, commands, next_steps, timestampFile Contents:
Quick Start: Python Library (35 lines)
python# examples/library_example.py from dataclasses import dataclass from datetime import datetime @dataclass(frozen=True) class AnalysisResult: length: int word_count: int analyzed_at: datetime class TextAnalyzer: def __init__(self) -> None: self._history: list[str] = [] def analyze(self, text: str) -> AnalysisResult: if not text or not text.strip(): raise ValueError("Text cannot be empty") self._history.append(text) word_count = len(text.split()) return AnalysisResult(len(text), word_count, datetime.utcnow()) def get_history(self) -> tuple[str, ...]: return tuple(self._history)
Additional Examples:
examples/cli_example.py (32 lines) - Click framework, file I/O, error handlingexamples/api_example.py (38 lines) - Pydantic models, async endpointsTemplate Resources (see resources/)
pyproject-library.toml / pyproject-cli.toml / pyproject-api.tomlexample_test.py - pytest with fixtures and parametrizepre-commit-config.yaml - ruff, black, mypy hooksToken Budgets:
Safety:
Auditability:
Determinism:
Performance:
Official Documentation (accessed 2025-10-26T02:31:27-04:00):
Tool Configurations:
/resources/pyproject-templates/ - Complete pyproject.toml templates by project type/resources/pre-commit-configs/ - Pre-commit configurations for different tool combinations/resources/makefile-templates/ - Makefile templates for poetry/pipenv/pip-toolsBest Practices:
Community Resources:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 35,964 | 19,782 | -45% | 1 | 1 | 0% | 2,365 | 8,575 | +263% | 0 | 0 | — |
case-02 | fail→pass | 16,426 | 12,276 | -25% | 1 | 1 | 0% | 3,934 | 6,603 | +68% | 0 | 0 | — |
case-03 | fail→fail | 13,088 | 15,959 | +22% | 1 | 1 | 0% | 3,199 | 7,592 | +137% | 0 | 0 | — |
case-04 | fail→fail | 4,034 | 10,257 | +154% | 1 | 1 | 0% | 879 | 6,366 | +624% | 0 | 0 | — |
case-05 | fail→pass | 3,694 | 3,641 | -1% | 1 | 1 | 0% | 851 | 4,543 | +434% | 0 | 0 | — |
case-06 | fail→pass | 19,895 | 15,739 | -21% | 1 | 1 | 0% | 4,517 | 7,976 | +77% | 0 | 0 | — |
case-07 | pass→pass | 10,608 | 9,078 | -14% | 1 | 1 | 0% | 2,196 | 5,890 | +168% | 0 | 0 | — |
case-08 | fail→fail | 5,304 | 10,077 | +90% | 1 | 1 | 0% | 1,075 | 6,357 | +491% | 0 | 0 | — |
case-09 | pass→pass | 9,123 | 14,281 | +57% | 1 | 1 | 0% | 2,116 | 7,340 | +247% | 0 | 0 | — |
case-10 | fail→fail | 8,969 | 7,693 | -14% | 1 | 1 | 0% | 1,932 | 5,477 | +183% | 0 | 0 | — |
case-11 | fail→fail | 10,530 | 11,598 | +10% | 1 | 1 | 0% | 2,147 | 6,362 | +196% | 0 | 0 | — |
case-12 | fail→pass | 8,159 | 12,712 | +56% | 1 | 1 | 0% | 1,585 | 6,638 | +319% | 0 | 0 | — |
case-13 | fail→pass | 7,871 | 11,836 | +50% | 1 | 1 | 0% | 1,777 | 6,509 | +266% | 0 | 0 | — |
case-14 | pass→pass | 13,213 | 10,090 | -24% | 1 | 1 | 0% | 3,131 | 6,159 | +97% | 0 | 0 | — |
case-15 | fail→pass | 8,109 | 5,416 | -33% | 1 | 1 | 0% | 1,992 | 5,034 | +153% | 0 | 0 | — |
case-16 | fail→fail | 17,195 | 15,817 | -8% | 1 | 1 | 0% | 3,068 | 7,421 | +142% | 0 | 0 | — |
case-17 | fail→fail | 5,720 | 11,566 | +102% | 1 | 1 | 0% | 1,249 | 6,496 | +420% | 0 | 0 | — |
case-18 | fail→fail | 8,012 | 10,029 | +25% | 1 | 1 | 0% | 1,756 | 6,026 | +243% | 0 | 0 | — |
case-19 | fail→pass | 29,480 | 10,862 | -63% | 1 | 1 | 0% | 3,971 | 6,200 | +56% | 0 | 0 | — |
case-20 | fail→pass | 9,403 | 8,013 | -15% | 1 | 1 | 0% | 2,185 | 5,353 | +145% | 0 | 0 | — |
case-21 | fail→fail | 16,313 | 12,932 | -21% | 1 | 1 | 0% | 3,639 | 6,534 | +80% | 0 | 0 | — |
case-22 | fail→fail | 6,338 | 6,933 | +9% | 1 | 1 | 0% | 1,087 | 5,059 | +365% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.