# Spicy Automation

## Project Overview

AWS CDK infrastructure and Jenkins shared library for deploying VPCs, ECS clusters, and ECS services on AWS. Provides type-safe TypeScript CDK constructs and Jenkins pipeline functions for automated infrastructure deployment with blue/green deployments, mixed capacity strategies (EC2 + Fargate), and persistent ALB patterns.

## Architecture Principles

### Language & Stack

- **TypeScript** for CDK constructs (AWS CDK v2)
- **Groovy** for Jenkins shared library pipelines
- **AWS CDK** for infrastructure as code
- **Jest** for testing
- **pnpm** for package management

### Code Organization

```text
spicy-automation/
├── bin/spicy-cdk.ts              # CDK app entry point
├── lib/
│   ├── constructs/               # Reusable CDK constructs
│   │   ├── spicy-vpc.ts          # VPC construct
│   │   ├── spicy-ecs-cluster.ts  # ECS cluster construct
│   │   ├── spicy-ecs-service.ts  # ECS service construct
│   │   └── spicy-alb.ts          # Persistent ALB construct
│   └── stacks/                   # CDK stacks (fromContext factories)
│       ├── spicy-vpc-stack.ts
│       ├── spicy-ecs-cluster-stack.ts
│       ├── spicy-ecs-service-stack.ts
│       └── spicy-alb-stack.ts
├── vars/                         # Jenkins shared library
│   ├── spicyVPC.groovy          # VPC pipeline
│   ├── spicyECSCluster.groovy   # ECS cluster pipeline
│   ├── spicyECSService.groovy   # ECS service pipeline
│   ├── spicyRollback.groovy     # Blue/green rollback
│   ├── cdkUtils.groovy          # CDK command utilities
│   ├── dockerUtils.groovy       # Docker/Nexus utilities
│   ├── gitUtils.groovy          # Git utilities
│   └── accounts.groovy          # Account configurations
├── docs/                         # Documentation
├── test/                         # Jest tests
└── Dockerfile                    # Jenkins agent image
```

**Directory Rules:**

- `lib/constructs/` - Reusable CDK constructs (no stack logic)
- `lib/stacks/` - Stack factories that read from CDK context
- `vars/` - Jenkins shared library functions (Groovy)
- `docs/` - User-facing documentation (keep minimal, avoid duplication)
- `test/` - Unit tests for constructs

## Coding Standards

### TypeScript Conventions

- Use interfaces for all public APIs
- Document exported functions and types with JSDoc
- Prefer readonly properties where possible
- Use strict TypeScript settings
- One construct per file, named exports only
- Use CDK best practices (overrideLogicalId for stability)

### Error Handling

- Validate required parameters early in constructors
- Throw descriptive errors with usage examples
- Use CDK's built-in validation where possible
- Don't swallow errors silently

### Concurrency

- CDK constructs are synchronous (no async/await needed)
- Jenkins pipelines handle concurrency at the stage level
- No shared mutable state in constructs

## Documentation

- Keep README.md updated
- Code comments for complex logic

## Minimal Viable Product (MVP)

1. **Keep it minimal**: Code should be the smallest implementation that works correctly
2. **Avoid over-engineering**: Don't add features "just in case" - add them when needed
3. **Simple solutions first**: Prefer simple, straightforward code over complex abstractions
4. **One thing at a time**: Each function/type should do one thing well

## When Making Changes

1. **Write tests first**: Define all expectations and error cases in tests BEFORE any implementation
2. **Mock third-party dependencies**: Use mocks for external libraries, don't test their internals
3. **Implement minimal code**: Write only what's needed to pass the tests
4. **Follow patterns**: Use existing code patterns
5. **Keep it simple**: Prefer simple, readable code over clever solutions

## Questions to Ask

If unsure about implementation:

1. Does it follow existing patterns?
2. Is it testable?
3. Does it maintain thread safety?
4. Is it documented?
5. Does it validate inputs?
6. Does it handle errors properly?
