Workflow Automation
When to use this skill
-
Repetitive tasks: running the same commands every time
-
Complex builds: multi-step build processes
-
Team onboarding: a consistent development environment
Instructions
Step 1: npm scripts
package.json:
{ "scripts": { "dev": "nodemon src/index.ts", "build": "tsc && vite build", "test": "jest --coverage", "test:watch": "jest --watch", "lint": "eslint src --ext .ts,.tsx", "lint:fix": "eslint src --ext .ts,.tsx --fix", "format": "prettier --write "src/**/*.{ts,tsx,json}"", "type-check": "tsc --noEmit", "pre-commit": "lint-staged", "prepare": "husky install", "clean": "rm -rf dist node_modules", "reset": "npm run clean && npm install", "docker:build": "docker build -t myapp .", "docker:run": "docker run -p 3000:3000 myapp" } }
Step 2: Makefile
Makefile:
.PHONY: help install dev build test clean docker
.DEFAULT_GOAL := help
help: ## Show this help @grep -E '^[a-zA-Z_-]+:.?## .$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
install: ## Install dependencies npm install
dev: ## Start development server npm run dev
build: ## Build for production npm run build
test: ## Run all tests npm test
lint: ## Run linter npm run lint
lint-fix: ## Fix linting issues npm run lint:fix
clean: ## Clean build artifacts rm -rf dist coverage
docker-build: ## Build Docker image docker build -t myapp:latest .
docker-run: ## Run Docker container docker run -d -p 3000:3000 --name myapp myapp:latest
deploy: build ## Deploy to production @echo "Deploying to production..." ./scripts/deploy.sh production
ci: lint test build ## Run CI pipeline locally @echo "✅ CI pipeline passed!"
Usage:
make help # Show all commands make dev # Start development make ci # Run full CI locally
Step 3: Husky + lint-staged (Git Hooks)
package.json:
{ "lint-staged": { ".{ts,tsx}": [ "eslint --fix", "prettier --write" ], ".{json,md}": [ "prettier --write" ] } }
.husky/pre-commit:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"
echo "Running pre-commit checks..."
Lint staged files
npx lint-staged
Type check
npm run type-check
Run tests related to changed files
npm test -- --onlyChanged
echo "✅ Pre-commit checks passed!"
Step 4: Task Runner scripts
scripts/dev-setup.sh:
#!/bin/bash set -e
echo "🚀 Setting up development environment..."
Check prerequisites
if ! command -v node &> /dev/null; then echo "❌ Node.js is not installed" exit 1 fi
if ! command -v docker &> /dev/null; then echo "❌ Docker is not installed" exit 1 fi
Install dependencies
echo "📦 Installing dependencies..." npm install
Copy environment file
if [ ! -f .env ]; then echo "📄 Creating .env file..." cp .env.example .env echo "⚠️ Please update .env with your configuration" fi
Start Docker services
echo "🐳 Starting Docker services..." docker-compose up -d
Wait for database
echo "⏳ Waiting for database..." ./scripts/wait-for-it.sh localhost:5432 --timeout=30
Run migrations
echo "🗄️ Running database migrations..." npm run migrate
Seed data (optional)
read -p "Seed database with sample data? (y/n) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then npm run seed fi
echo "✅ Development environment ready!" echo "Run 'make dev' to start the development server"
scripts/deploy.sh:
#!/bin/bash set -e
ENV=$1
if [ -z "$ENV" ]; then echo "Usage: ./deploy.sh [staging|production]" exit 1 fi
echo "🚀 Deploying to $ENV..."
Build
echo "📦 Building application..." npm run build
Run tests
echo "🧪 Running tests..." npm test
Deploy based on environment
if [ "$ENV" == "production" ]; then echo "🌍 Deploying to production..." # Production deployment logic ssh production "cd /app && git pull && npm install && npm run build && pm2 restart all" elif [ "$ENV" == "staging" ]; then echo "🧪 Deploying to staging..." # Staging deployment logic ssh staging "cd /app && git pull && npm install && npm run build && pm2 restart all" fi
echo "✅ Deployment to $ENV completed!"
Step 5: GitHub Actions workflow automation
.github/workflows/ci.yml:
name: CI
on: push: branches: [main, develop] pull_request: branches: [main]
jobs: test: runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Type check
run: npm run type-check
- name: Run tests
run: npm test -- --coverage
- name: Upload coverage
uses: codecov/codecov-action@v3
Output format
project/ ├── scripts/ │ ├── dev-setup.sh │ ├── deploy.sh │ ├── test.sh │ └── cleanup.sh ├── Makefile ├── package.json └── .husky/ ├── pre-commit └── pre-push
Constraints
Required rules (MUST)
-
Idempotency: safe to run scripts multiple times
-
Error handling: clear messages on failure
-
Documentation: comments on how to use the scripts
Prohibited items (MUST NOT)
-
Hardcoded secrets: do not include passwords or API keys in scripts
-
Destructive commands: do not run rm -rf without confirmation
Best practices
-
Use Make: platform-agnostic interface
-
Git Hooks: automated quality checks
-
CI/CD: automated with GitHub Actions
References
-
npm scripts
-
Make Tutorial
-
Husky
Metadata
Version
-- Current version: 1.0.0 -- Last updated: 2025-01-01 -- Compatible platforms: Claude, ChatGPT, Gemini
Tags
#automation #scripts #workflow #npm-scripts #Makefile #utilities
Examples
Example 1: Basic usage
Example 2: Advanced usage