skills/create-makefile/SKILL.md
Generate a context-sensitive, self-documenting Makefile by analyzing the current project. Detects languages, frameworks, and tools to select appropriate targets (build, test, lint, deploy, etc.). Presents proposed targets for approval before writing. Use on any project that would benefit from a standardized Makefile.
npx skillsauth add adeshmukh/claude-skills create-makefileInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a self-documenting Makefile tailored to the current project.
Examine the project to determine its language, runtime, frameworks, and tooling. Read the following files if they exist:
Package/config files:
pyproject.toml, setup.py, setup.cfg, requirements.txt — Pythonpackage.json — Node.js/JavaScript/TypeScriptCargo.toml — Rustgo.mod — Gopom.xml, build.gradle, build.gradle.kts — Java/KotlinGemfile — Rubycomposer.json — PHPMakefile — already exists (warn user, ask to overwrite)Tooling indicators:
Dockerfile, docker-compose.yml, docker-compose.yaml — Docker.github/workflows/ — CI/CDProcfile, fly.toml, vercel.json, netlify.toml — deploy configsalembic.ini, prisma/, migrations/ — database migrations.eslintrc*, ruff.toml, .flake8, .golangci.yml — lintersjest.config*, pytest.ini, vitest.config*, *_test.go — test frameworksRecord your findings as a structured summary:
Based on the analysis, select appropriate targets from these categories. Only include categories that are relevant to the project.
Include if the project has dependencies to install.
setup / install — install dependencies and set up the development environmentInclude for compiled languages, TypeScript, Docker, or anything with a build step.
build — compile/bundle the projectclean — remove build artifactsInclude for projects with a development server or runnable scripts.
dev — start in development mode (hot reload if applicable)run — run the main entry pointInclude only for service-type projects (web servers, APIs, background workers).
start — start the servicestop — stop the servicerestart — restart the servicestatus — check service statusInclude if the project has linters, formatters, or type checkers.
lint — run linter(s)fmt — run formatter(s)check — run all quality checks (lint + fmt + type check)Include if the project has tests.
test — run all teststest-unit — run unit tests only (if distinguishable)test-integration — run integration tests only (if distinguishable)Include if the project uses database migrations.
db-up — start local databasedb-migrate — run migrationsdb-seed — seed the databaseInclude if the project has deployment configuration.
deploy — deploy to target environmentrelease — tag and release a versionBefore writing anything, present the proposed Makefile to the user:
Wait for user approval before proceeding.
Write the Makefile following these conventions:
Header:
.DEFAULT_GOAL := help
Variables section (if needed):
Define variables for repeated values at the top:
PYTHON := uv run python
RUFF := uv run ruff
Self-documenting help target (always first):
##@ General
.PHONY: help
help: ## Show this help message
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
Target format:
Every target MUST follow this pattern:
##@ Section Header
.PHONY: target-name
target-name: ## Short description of what this target does
command1
command2
Rules:
.PHONY (unless it produces a file)## description comment on the same line as the target name##@ Section Header comments$(VARIABLE) for repeated tool paths@ prefix for commands that should not be echoed (e.g. @echo)Tell the user:
make or make help to see available targetstesting
Initialize a git repository in the current (empty) folder with a curated .gitignore. Creates project-specific ignore entries plus community gitignore content for the specified technology types. Use when starting a brand-new project from scratch.
development
Set up a modern Python project using uv (package manager) and ruff (linter/formatter). Initializes pyproject.toml with sensible ruff rules, creates a virtual environment, and optionally migrates an existing requirements.txt. Use when starting a new Python project.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------