project-scaffolding
Project Scaffolding Skill
Comprehensive guide to project type detection, template selection, post-scaffolding setup, Harness integration, and testing strategies.
Project Type Detection Matrix
How to Detect Project Type
Detection Priority:
- Look for language-specific files in root
- Check build system presence
- Examine package/dependency files
- Analyze configuration files
- Review existing CI/CD setup
Type Identification Checklist
Python Project:
✓ setup.py, pyproject.toml, or requirements.txt
✓ .python-version file
✓ Pipfile (Pipenv)
✓ poetry.lock (Poetry)
Node.js/JavaScript:
✓ package.json exists
✓ node_modules/ directory
✓ .npmrc or .yarnrc
✓ yarn.lock or package-lock.json
Java/JVM:
✓ pom.xml (Maven) or build.gradle (Gradle)
✓ src/main/java structure
✓ .java files present
Go:
✓ go.mod file
✓ *.go source files
✓ go.sum dependencies file
Rust:
✓ Cargo.toml
✓ src/ directory
✓ Cargo.lock
C#/.NET:
✓ *.csproj or *.sln files
✓ appsettings.json
✓ global.json
TypeScript:
✓ tsconfig.json
✓ *.ts or *.tsx files
✓ package.json with typescript dependency
Kubernetes/DevOps:
✓ Dockerfile
✓ docker-compose.yml
✓ k8s/ or helm/ directory
✓ Helmfile
Infrastructure as Code:
✓ *.tf files (Terraform)
✓ bicep/ directory (Azure Bicep)
✓ cloudformation.yaml (AWS CloudFormation)
Project Type Recommendations Matrix
1. Python Projects
Best Templates:
- Cookiecutter - Standard Python projects, packages
- Copier - Complex projects with versioning needs
- Poetry - Modern Python packaging
Template Structure:
{project_name}/
├── {project_name}/ # Main package
│ ├── __init__.py
│ ├── main.py
│ └── config.py
├── tests/ # Test directory
│ ├── __init__.py
│ ├── conftest.py # pytest fixtures
│ └── test_main.py
├── docs/ # Documentation
│ ├── conf.py # Sphinx config
│ ├── index.rst
│ └── api.rst
├── .gitignore
├── README.md
├── LICENSE
├── requirements.txt # Or pyproject.toml
├── setup.py # Or tool.poetry in pyproject.toml
├── pytest.ini
├── tox.ini # Multi-environment testing
└── Dockerfile
Key Variables:
project_name: str # Package name (lowercase, underscores)
author_name: str # Author name
author_email: str # Author email
python_version: str # Target version (3.9, 3.10, 3.11, 3.12)
use_poetry: bool # Use Poetry for dependency management
use_pytest: bool # Use pytest (default: true)
use_docker: bool # Include Dockerfile
include_cli: bool # Include Click CLI framework
Post-Scaffolding:
cd {project_name}
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
pytest tests/ # Verify test setup
2. Node.js/JavaScript Projects
Best Templates:
- Cookiecutter - Standard Node projects
- Copier - Full-stack applications
Template Structure:
{project_name}/
├── src/
│ ├── index.js
│ ├── config.js
│ └── utils/
├── tests/
│ ├── unit/
│ ├── integration/
│ └── fixtures/
├── public/ # Static assets
├── docs/
├── .env.example # Environment template
├── .eslintrc.json # ESLint config
├── .prettierrc.json # Code formatting
├── jest.config.js # Jest testing config
├── tsconfig.json # If using TypeScript
├── package.json
├── package-lock.json # Or yarn.lock / pnpm-lock.yaml
├── Dockerfile
├── docker-compose.yml
├── .gitignore
├── README.md
└── LICENSE
Key Variables:
project_name: str # Project name
author_name: str # Author
use_typescript: bool # TypeScript support
use_eslint: bool # ESLint (default: true)
use_prettier: bool # Code formatter
use_jest: bool # Jest testing
use_docker: bool # Docker support
use_express: bool # Express.js framework
package_manager: str # npm, yarn, pnpm
Post-Scaffolding:
cd {project_name}
npm install # or yarn / pnpm install
npm run lint # Check linting
npm run test # Run tests
npm run dev # Start development server
3. Java/JVM Projects
Best Templates:
- Maven Archetypes - Standard Java projects
- Gradle Template - Gradle-based projects
Template Structure (Maven):
{project_name}/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/company/{project_name}/
│ │ │ ├── App.java
│ │ │ └── service/
│ │ └── resources/
│ │ └── application.properties
│ └── test/
│ ├── java/
│ │ └── com/company/{project_name}/
│ │ └── AppTest.java
│ └── resources/
├── docs/
├── pom.xml # Maven configuration
├── README.md
├── Dockerfile
└── .gitignore
Key Variables:
groupId: str # Maven group ID (e.g., com.company)
artifactId: str # Maven artifact ID
package: str # Java package name
java_version: str # JDK version (11, 17, 21)
spring_boot_version: str # If using Spring Boot
build_tool: str # maven or gradle
Post-Scaffolding:
cd {project_name}
mvn clean compile # Compile project
mvn test # Run tests
mvn spring-boot:run # If using Spring Boot
4. TypeScript Projects
Best Templates:
- ts-node - CLI tools and scripts
- Next.js - Full-stack web applications
- NestJS - Backend APIs
Template Structure:
{project_name}/
├── src/
│ ├── index.ts
│ ├── types/
│ │ └── index.ts
│ ├── services/
│ ├── controllers/ # If REST API
│ └── utils/
├── tests/
│ ├── unit/
│ └── integration/
├── dist/ # Compiled JavaScript (output)
├── tsconfig.json # TypeScript config
├── jest.config.js # Jest testing
├── .eslintrc.json # ESLint
├── package.json
├── Dockerfile
├── README.md
└── .gitignore
Key Variables:
project_name: str
typescript_version: str # Exact version or latest
jest_enabled: bool # Testing framework
eslint_enabled: bool # Linting
strict_mode: bool # tsconfig strict
target: str # Compilation target (ES2020, etc.)
module: str # Module system (ESNext, CommonJS)
Post-Scaffolding:
cd {project_name}
npm install
npm run build # Compile TypeScript
npm test # Run tests
npm start # Run compiled code
5. Go Projects
Best Templates:
- Go Project Layout - Standard Go project structure
- Cobra CLI - CLI applications
Template Structure:
{project_name}/
├── cmd/
│ ├── cli/
│ │ └── main.go # Application entry point
│ └── server/ # If server application
│ └── main.go
├── internal/ # Private packages
│ ├── config/
│ ├── handler/
│ └── service/
├── pkg/ # Public packages
│ └── {package_name}/
├── api/ # API definitions
├── test/
├── docs/
├── Makefile # Build automation
├── go.mod # Module definition
├── go.sum # Checksums
├── Dockerfile
├── .gitignore
├── README.md
└── LICENSE
Key Variables:
project_name: str # Go module name (github.com/user/project)
author_name: str
go_version: str # Minimum Go version (1.19, 1.20, 1.21)
use_cobra: bool # CLI framework
use_gin: bool # Web framework (if server)
use_gorm: bool # ORM (if database needed)
Post-Scaffolding:
cd {project_name}
go mod download # Download dependencies
go build ./cmd/cli # Build application
go test ./... # Run tests
./cli --help # Test CLI
6. Kubernetes/DevOps Projects
Best Templates:
- Helm Chart - Kubernetes deployments
- Kustomize - Kubernetes customization
- Copier - Multi-environment setups
Template Structure:
{project_name}/
├── helm/
│ └── {release_name}/
│ ├── Chart.yaml
│ ├── values.yaml
│ ├── values-dev.yaml
│ ├── values-prod.yaml
│ └── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── ingress.yaml
├── k8s/
│ ├── base/
│ ├── dev/
│ └── prod/
├── kustomization.yaml
├── docker-compose.yml # For local development
├── Dockerfile
├── .dockerignore
├── docs/
├── README.md
└── .gitignore
Key Variables:
project_name: str # Application name
image_registry: str # Docker registry
image_name: str # Docker image name
replicas_dev: int # Dev environment replicas
replicas_prod: int # Prod environment replicas
namespace: str # Kubernetes namespace
enable_ingress: bool
enable_monitoring: bool # Prometheus/monitoring
Post-Scaffolding:
cd {project_name}
docker build -t {image}:latest .
helm lint helm/{release}
helm template helm/{release} -f values-dev.yaml
kubectl apply -f k8s/dev/ # Deploy to dev
7. Infrastructure as Code (Terraform)
Best Templates:
- Terraform Module - Reusable infrastructure components
- Terraform Project - Full environment setup
Template Structure:
{project_name}/
├── main.tf # Main configuration
├── variables.tf # Input variables
├── outputs.tf # Output values
├── terraform.tfvars # Variable values
├── locals.tf # Local values
├── vpc.tf # VPC configuration
├── security.tf # Security groups
├── iam.tf # IAM roles/policies
├── modules/
│ ├── vpc/
│ ├── compute/
│ └── database/
├── environments/
│ ├── dev/
│ │ └── terraform.tfvars
│ ├── staging/
│ └── prod/
├── docs/
├── .gitignore
├── README.md
├── versions.tf # Terraform version constraints
└── backend.tf # State backend config
Key Variables:
project_name: str # Project identifier
aws_region: str # AWS region
environment: str # dev, staging, prod
terraform_version: str # Minimum version
Post-Scaffolding:
cd environments/dev
terraform init # Initialize backend
terraform plan # Preview changes
terraform apply # Apply configuration
terraform output # View outputs
Post-Scaffolding Checklist
Universal Tasks (All Projects)
- Review generated files and structure
- Verify .gitignore is appropriate
- Update README.md with project-specific info
- Add LICENSE file (if not included)
- Initialize Git repository
- Create initial commit
- Add remote repository
- Verify dependency installation
- Run basic tests to confirm setup works
- Document build/run commands
- Set up CI/CD configuration
Language-Specific Tasks
Python:
- Verify virtual environment works
- Test package imports
- Check pytest configuration
- Verify linting (flake8/pylint) setup
- Test documentation build (if Sphinx)
- Verify type hints (if mypy configured)
Node.js:
- Verify npm/yarn/pnpm setup
- Test linting and formatting
- Verify test framework (Jest/Mocha)
- Check TypeScript compilation
- Verify build output directory
- Test hot reload (if dev server)
Java:
- Verify Maven/Gradle build
- Test unit tests run successfully
- Verify IDE integration
- Check dependency tree
- Verify JAR/WAR packaging
Go:
- Verify go mod download
- Test build command
- Verify all tests pass
- Check linting (golangci-lint)
- Verify binary execution
Docker Tasks
- Build Docker image
- Test image runs locally
- Verify volumes/ports are correct
- Document docker run command
- Add Docker Compose if multi-container
- Set up .dockerignore
Harness Integration Patterns
Pattern 1: Basic CI Pipeline
For: Single service, simple build and push
# harness/build-pipeline.yaml
pipeline:
name: Build and Push
identifier: build_push
stages:
- stage:
name: Build Docker
type: CI
spec:
codebase:
repoName: {project_name}
branch: main
build:
type: Docker
spec:
dockerfile: Dockerfile
registryConnector: <+input.docker_connector>
imageName: <+input.image_name>
imageTag: <+codebase.commitSha>
Pattern 2: Build, Test, and Deploy
For: Multi-stage pipeline with testing
pipeline:
name: Build Test Deploy
identifier: build_test_deploy
stages:
- stage:
name: Build
type: CI
spec:
build:
type: Docker
spec:
dockerfile: Dockerfile
- stage:
name: Test
type: CI
depends_on:
- Build
spec:
steps:
- step:
type: Run
spec:
image: <+artifact.image>
script: npm test
- stage:
name: Deploy Dev
type: Deployment
depends_on:
- Test
spec:
service:
serviceRef: <+input.service>
environment:
environmentRef: dev
Pattern 3: Multi-Environment Deployment
For: Dev → Staging → Production with approvals
stages:
- stage:
name: Deploy Dev
type: Deployment
spec:
environment: dev
infrastructure: dev-k8s-cluster
- stage:
name: Deploy Staging
type: Deployment
depends_on:
- Deploy Dev
spec:
environment: staging
infrastructure: staging-k8s-cluster
- stage:
name: Approval for Production
type: Approval
depends_on:
- Deploy Staging
spec:
approvers:
- <+input.approver_group>
- stage:
name: Deploy Production
type: Deployment
depends_on:
- Approval for Production
spec:
environment: production
infrastructure: prod-k8s-cluster
Pattern 4: GitOps with Harness
For: Managing manifests separately from source code
stages:
- stage:
name: Build
type: CI
spec:
build:
type: Docker
- stage:
name: Update Manifests
type: CI
spec:
steps:
- step:
type: Run
spec:
script: |
git clone <+input.manifest_repo>
sed -i "s/IMAGE_TAG/<+artifact.imageTag>/g" k8s/deployment.yaml
git commit && git push
- stage:
name: Deploy via GitOps
type: Deployment
spec:
gitOpsEnabled: true
service:
serviceRef: <+input.service>
environment:
environmentRef: <+input.environment>
Testing Recommendations by Project Type
Python Testing
Frameworks:
- pytest - Modern, flexible test framework
- unittest - Standard library
- nose2 - Plugin-based testing
Setup:
pip install pytest pytest-cov pytest-mock
Test Structure:
tests/
├── conftest.py # Shared fixtures
├── unit/
│ ├── test_module.py
│ └── test_service.py
├── integration/
│ └── test_api.py
└── fixtures/
└── sample_data.py
Coverage Target: 80%+
Node.js Testing
Frameworks:
- Jest - All-in-one solution
- Mocha + Chai - Flexible combination
- Vitest - Fast alternative
Setup:
npm install --save-dev jest @testing-library/react
Test Structure:
tests/
├── unit/
│ ├── utils.test.js
│ └── helpers.test.js
├── integration/
│ └── api.test.js
└── e2e/
└── user-flow.test.js
Coverage Target: 80%+
Java Testing
Frameworks:
- JUnit 5 - Modern testing framework
- Mockito - Mocking framework
- TestNG - Alternative to JUnit
Setup:
<dependency>
<groupId>junit</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
Test Structure:
src/test/java/
└── com/company/project/
├── ServiceTest.java
├── ControllerTest.java
└── IntegrationTest.java
Coverage Target: 80%+
Go Testing
Testing Style:
- Standard Go testing package
- Table-driven tests
- Subtests
Setup:
go get github.com/stretchr/testify
Test Structure:
internal/
├── service/
│ ├── service.go
│ └── service_test.go
└── handler/
├── handler.go
└── handler_test.go
Coverage Target: 80%+
Post-Scaffolding Setup Verification
Universal Verification Commands
# Git setup
git init
git add .
git commit -m "Initial commit from template"
# Dependency verification
{build-tool} list # List dependencies
# Test verification
{build-tool} test # Run test suite
# Build verification
{build-tool} build # Build project
# Docker verification (if applicable)
docker build -t {image}:test .
docker run {image}:test --version
Checklist Summary
ESSENTIAL:
- [ ] Project initialized and builds
- [ ] Dependencies installed
- [ ] Tests run and pass
- [ ] Documentation exists
- [ ] .gitignore configured
- [ ] Initial commit created
HARNESS INTEGRATION:
- [ ] Harness service created
- [ ] Pipeline template ready
- [ ] Environment configured
- [ ] Deployment target defined
QUALITY GATES:
- [ ] Linting passes
- [ ] Tests pass
- [ ] Code coverage >= 80%
- [ ] Documentation complete
- [ ] Security scan passes