<!-- source-hash: 5a845a31a46ea7c6d1945d44c5a712fa -->
Defines the complete TypeScript type system for the Flamingo product release module, including data shapes for releases, changelog entries, media assets, and external integrations (GitHub, ClickUp, Knowledge Base).

## Key Components

### Core Interfaces

| Interface | Purpose |
|-----------|---------|
| `ProductRelease` | Primary entity — full release record with video, SEO, AI, analytics, and relation fields |
| `ChangelogEntry` | Single changelog item with optional per-entry `visibility` (supports investor update use case) |
| `ReleaseMedia` | Attached media assets (`image`, `video`, `screenshot`, `demo`) |
| `CreateProductReleaseData` | Input shape for creating a new release |
| `UpdateProductReleaseData` | Partial version of create data for updates |
| `ProductReleaseFilters` | Query filter bag for list endpoints (pagination, tags, type, status, search) |
| `ProductReleaseListResponse` | Paginated list response wrapper |

### External Link Interfaces

| Interface | Links To |
|-----------|---------|
| `ProductReleaseGitHubLink` | GitHub release URLs |
| `KnowledgeBaseLink` | Internal KB article paths |
| `ClickUpRoadmapTask` | ClickUp roadmap task IDs |
| `ClickUpDeliveryTask` | ClickUp delivery list task IDs |
| `GitHubRelease` | GitHub API release shape (wizard import) |

### Constants & Utilities

- `releaseTypeOptions` — dropdown metadata for `major`, `minor`, `patch`, `beta`, `alpha`
- `releaseStatusOptions` — dropdown metadata for `alpha`, `beta`, `stable`, `deprecated`
- `changelogLabels` — human-readable labels for changelog categories
- `SEMVER_REGEX` — validates semantic versioning strings including pre-release and build metadata

## Usage Example

```typescript
import type {
  ProductRelease,
  CreateProductReleaseData,
  ProductReleaseFilters,
  ChangelogEntry,
} from './product-release'
import { releaseTypeOptions, SEMVER_REGEX } from './product-release'

// Validate version before submission
const version = '2.1.0-beta.1'
if (!SEMVER_REGEX.test(version)) {
  throw new Error(`Invalid semver: ${version}`)
}

// Build a new release payload
const newRelease: CreateProductReleaseData = {
  title: 'OpenFrame 2.1 Beta',
  slug: 'openframe-2-1-beta',
  version,
  release_type: 'beta',
  release_status: 'beta',
  release_date: '2025-07-01',
  status: 'draft',
  author_id: 'user-uuid',
  platforms: ['platform-uuid-1'],
  tags: [1, 4],
  features_added: [
    { title: 'Mingo AI ticket routing', visibility: 'public' },
    { title: 'Internal billing dashboard', visibility: 'internal' },
  ] satisfies ChangelogEntry[],
}

// Filter releases for a public changelog page
const filters: ProductReleaseFilters = {
  release_status: ['stable', 'beta'],
  has_breaking_changes: false,
  status: 'published',
  limit: 20,
  offset: 0,
}

// Access dropdown labels for a form
const typeLabel = releaseTypeOptions.find(o => o.value === 'beta')?.label
// → 'Beta Release'
```