#!/usr/bin/env tsx /** * Validate project is ready for release * * This script checks: * - CHANGELOG.md exists and is well-formatted * - [Unreleased] section has content * - Working directory is clean (unless --allow-dirty) * - npm authentication works (npm whoami) * - Current branch is allowed (if GIT_REQUIRE_BRANCH is set) * * Usage: * tsx validate-release.ts [--allow-dirty] * * Exit codes: * 0 - All validations passed * 1 - Validation failed */ import type { ExecSyncOptions } from 'node:child_process'; import { existsSync, readFileSync } from 'node:fs'; export interface ValidationResult { name: string; passed: boolean; message?: string; } export interface ValidateOptions { allowDirty: boolean; } export interface ValidateReleaseDeps { execSync: (command: string, options?: ExecSyncOptions) => Buffer | string; existsSync: typeof existsSync; readFileSync: typeof readFileSync; getEnv: (key: string) => string | undefined; } export declare function parseArgs(argv: string[]): ValidateOptions; export declare function validateChangelogExists(deps: ValidateReleaseDeps): ValidationResult; export declare function validateChangelogFormat(deps: ValidateReleaseDeps): ValidationResult; export declare function validateUnreleasedHasContent(deps: ValidateReleaseDeps): ValidationResult; export declare function validateWorkingDirectoryClean(deps: ValidateReleaseDeps, options: ValidateOptions): ValidationResult; export declare function validateNpmAuth(deps: ValidateReleaseDeps): ValidationResult; export declare function validateBranch(deps: ValidateReleaseDeps): ValidationResult; export declare function validateGitRepo(deps: ValidateReleaseDeps): ValidationResult; export declare function validateRelease(deps: ValidateReleaseDeps, options: ValidateOptions): ValidationResult[];