Skip to main content

Error Reference

Overview​

PipeCraft implements comprehensive error handling with clear, actionable error messages. This guide documents error types, recovery strategies, and troubleshooting steps.

Error Categories​

1. Configuration Errors​

When: Loading or validating .pipecraftrc.json

Missing Configuration File​

Error: No configuration file found. Expected: .pipecraftrc.json

Cause: No configuration file in current directory or ancestors

Recovery:

# Create initial configuration
pipecraft init

# Or specify custom path
pipecraft generate --config path/to/config.json

Invalid Configuration Structure​

Error: Missing required field: branchFlow

Cause: Configuration missing required fields

Required Fields:

  • ciProvider
  • mergeStrategy
  • requireConventionalCommits
  • initialBranch
  • finalBranch
  • branchFlow
  • domains

Recovery:

# Re-run init to create valid config
pipecraft init

# Or manually add missing fields to .pipecraftrc.json

Invalid Field Values​

Error: ciProvider must be either "github" or "gitlab"

Cause: Invalid enum value in configuration

Recovery:

{
"ciProvider": "github", // Must be "github" or "gitlab"
"mergeStrategy": "fast-forward" // Must be "fast-forward" or "merge"
}

Invalid Domain Configuration​

Error: Domain "api" must have at least one path pattern

Cause: Domain configured with empty paths array

Recovery:

{
"domains": {
"api": {
"paths": ["packages/api/**"], // Must have at least one path
"description": "API services"
}
}
}

2. Pre-Flight Check Failures​

When: Running pre-flight validation before workflow generation

Node Version​

Error: Node.js version 16.0.0 is too old. Required: >=18.0.0

Cause: Node.js version below minimum requirement

Recovery:

# Install Node 18+ using nvm
nvm install 18
nvm use 18

# Or using brew (macOS)
brew upgrade node

# Verify version
node --version

Not a Git Repository​

Error: Current directory is not a git repository

Cause: Running PipeCraft outside a git repository

Recovery:

# Initialize git repository
git init

# Add remote
git remote add origin https://github.com/user/repo.git

No Git Remote​

Error: No git remote configured

Cause: Git repository has no remote URL

Recovery:

# Add GitHub remote
git remote add origin https://github.com/user/repo.git

# Or GitHub CLI
gh repo create user/repo --source=. --remote=origin

Workflow Directory Not Writable​

Error: Cannot write to .github/workflows/ directory

Cause: Insufficient permissions for workflows directory

Recovery:

# Fix permissions
chmod +w .github/workflows/

# Or create directory if missing
mkdir -p .github/workflows

Invalid Branch Structure​

Error: initialBranch must be first in branchFlow

Cause: branchFlow doesn't start with initialBranch or end with finalBranch

Recovery:

{
"initialBranch": "develop",
"finalBranch": "main",
"branchFlow": ["develop", "staging", "main"] // Must match
}

3. Git Operation Errors​

When: Executing git commands for version management or validation

Not a Git Repository (Runtime)​

fatal: not a git repository (or any of the parent directories): .git

Cause: Git command executed outside repository context

Why Suppressed: These errors are expected in test environments and are silently handled with fallback values (e.g., version 0.0.0).

Recovery: Not needed in user code; errors are caught and handled gracefully.

No Git Tags​

Error: No git tags found. Cannot determine current version.

Cause: Repository has no version tags

Recovery:

# Create initial version tag
git tag v0.1.0
git push --tags

# Or disable versioning
# Edit .pipecraftrc.json: "versioning": { "enabled": false }

Conventional Commits Not Followed​

Warning: Some commits do not follow conventional format

Cause: Recent commits don't match type(scope?): subject format

Recovery:

# Setup commit message validation
pipecraft init --with-versioning

# This creates:
# - commitlint.config.js
# - .husky/commit-msg hook

# Future commits will be validated automatically

4. GitHub API Errors​

When: Configuring repository settings via GitHub API

Missing GitHub Token​

Error: GITHUB_TOKEN not found in environment

Cause: No GitHub token provided for API operations

Recovery:

# Create personal access token at github.com/settings/tokens
# Required scopes: repo, workflow

# Set environment variable
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx

# Or use GitHub CLI (automatically authenticated)
gh auth login

Insufficient Permissions​

Error: Token does not have required permissions: repo, workflow

Cause: GitHub token missing required scopes

Recovery:

  1. Go to https://github.com/settings/tokens
  2. Select your token
  3. Enable scopes: repo, workflow
  4. Regenerate token
  5. Update GITHUB_TOKEN environment variable

Rate Limit Exceeded​

Error: GitHub API rate limit exceeded. Resets at 2024-01-01T12:00:00Z

Cause: Made too many API requests (5000/hour for authenticated)

Recovery:

# Wait for rate limit reset (shown in error message)

# Or use authenticated requests (higher limit)
export GITHUB_TOKEN=your_token

# Check current rate limit
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/rate_limit

Repository Not Found​

Error: Repository not found: user/repo

Cause: Repository doesn't exist or token lacks access

Recovery:

# Verify repository exists
gh repo view user/repo

# Check git remote URL matches
git remote -v

# Ensure token has access to private repos (if applicable)

5. File System Errors​

When: Reading or writing files during workflow generation

Permission Denied​

Error: EACCES: permission denied, open '.pipecraftrc.json'

Cause: Insufficient permissions to read/write files

Recovery:

# Fix file permissions
chmod 644 .pipecraftrc.json

# Fix directory permissions
chmod 755 .github/workflows/

File Already Exists (Overwrite Protection)​

Error: .pipecraftrc.json already exists. Use --force to overwrite.

Cause: Trying to initialize when config already exists

Recovery:

# Overwrite existing config
pipecraft init --force

# Or manually edit existing config
vim .pipecraftrc.json

Disk Full​

Error: ENOSPC: no space left on device

Cause: Insufficient disk space

Recovery:

# Free up disk space
# Check disk usage
df -h

# Clean up
npm cache clean --force
rm -rf node_modules/.cache

6. YAML Parsing Errors​

When: Parsing or generating workflow YAML files

Invalid YAML Syntax​

Error: Invalid YAML in .github/workflows/pipeline.yml
Line 42: Unexpected token

Cause: Malformed YAML in existing workflow file

Recovery:

# Validate YAML syntax
pipecraft validate

# Fix syntax errors manually
# Or regenerate from scratch
pipecraft generate --force

Comment Preservation Failed​

Warning: Could not preserve comments in existing workflow

Cause: User comments within PipeCraft-managed blocks

Why: PipeCraft can only preserve comments OUTSIDE managed blocks

Recovery:

  1. Move user comments outside # PIPECRAFT-MANAGED blocks
  2. Regenerate workflow
  3. Comments should now be preserved

7. Dependency Errors​

When: Running commands that depend on external tools

release-it Not Found​

Error: npx release-it: command not found

Cause: release-it not installed (when versioning is enabled)

Recovery:

# Install release-it
npm install --save-dev release-it @release-it/conventional-changelog

# Or disable versioning
# Edit .pipecraftrc.json: "versioning": { "enabled": false }

commitlint Not Found​

Error: commitlint: command not found

Cause: commitlint not installed (when conventional commits required)

Recovery:

# Install commitlint
npm install --save-dev @commitlint/cli @commitlint/config-conventional

# Or disable conventional commits
# Edit .pipecraftrc.json: "requireConventionalCommits": false

husky Not Found​

Error: husky: command not found

Cause: husky not installed (when setting up version management)

Recovery:

# Install husky
npm install --save-dev husky

# Initialize husky
npx husky install

Error Recovery Strategies​

General Recovery Flow​

1. Read Error Message
↓
2. Identify Error Category (config, preflight, git, etc.)
↓
3. Check Error Details (file, line number, field name)
↓
4. Apply Recovery Strategy (see above)
↓
5. Retry Operation
↓
6. If Still Failing → Enable Debug Mode

Debug Mode​

Enable verbose logging to diagnose issues:

# Verbose mode (detailed operation info)
pipecraft generate --verbose

# Debug mode (maximum detail)
pipecraft generate --debug

# Example output:
# [DEBUG] Loading config from /path/to/.pipecraftrc.json
# [DEBUG] Validating configuration...
# [DEBUG] Running preflight checks...
# [DEBUG] Checking Node version: 18.0.0
# [DEBUG] Checking git repository...
# [DEBUG] Generating workflow template...

Dry Run Mode​

Preview changes without writing files:

# See what would be generated without making changes
pipecraft generate --dry-run

# Example output:
# Would create: .github/workflows/pipeline.yml
# Would create: actions/detect-changes/action.yml
# Would update: .pipecraft-cache.json

Force Regeneration​

Bypass idempotency checks:

# Regenerate even if cache says nothing changed
pipecraft generate --force

# Useful when:
# - Cache is corrupted
# - Manual workflow edits were lost
# - Debugging template issues

Testing Error Scenarios​

Unit Tests​

Mock errors to test error handling:

import { describe, it, expect, vi } from 'vitest'
import { loadConfig } from './config'

describe('Config Error Handling', () => {
it('throws clear error when config file missing', () => {
vi.mock('fs', () => ({
existsSync: () => false
}))

expect(() => loadConfig()).toThrow('No configuration file found')
})

it('throws validation error for invalid ciProvider', () => {
const invalidConfig = { ciProvider: 'invalid' }

expect(() => validateConfig(invalidConfig)).toThrow(
'ciProvider must be either "github" or "gitlab"'
)
})
})

Integration Tests​

Test real error scenarios:

describe('Git Error Handling', () => {
it('handles missing git repository gracefully', async () => {
const tempDir = await createTempDir() // No git init
process.chdir(tempDir)

const version = versionManager.getCurrentVersion()
expect(version).toBe('0.0.0') // Fallback value
})
})

Error Message Guidelines​

When adding new error handling:

Good Error Messages​

✅ Specific:

Error: Domain "api" must have at least one path pattern

✅ Actionable:

Error: Node.js version 16.0.0 is too old. Required: >=18.0.0
Suggestion: Run 'nvm install 18 && nvm use 18'

✅ Context-Rich:

Error: Invalid YAML in .github/workflows/pipeline.yml
Line 42: Unexpected token ':'
Context: jobs.test-api.steps[0]

Bad Error Messages​

❌ Vague:

Error: Invalid configuration

❌ Non-Actionable:

Error: Something went wrong

❌ No Context:

Error: Syntax error

Logging Best Practices​

Log Levels​

Use appropriate log levels:

import { logger } from './logger'

// Informational (always shown)
logger.info('✓ Workflows generated successfully')

// Success (always shown)
logger.success('✓ GitHub repository configured')

// Warning (always shown, non-fatal)
logger.warn('⚠ No git tags found, using version 0.0.0')

// Error (always shown, fatal)
logger.error('✗ Pre-flight check failed: Node version too old')

// Verbose (shown with --verbose)
logger.verbose('Loading config from .pipecraftrc.json')

// Debug (shown with --debug)
logger.debug('Config hash: abc123')

Error Context​

Always provide context:

try {
writeFileSync(path, content)
} catch (error) {
// ❌ Bad: Generic error
throw new Error('Failed to write file')

// ✅ Good: Specific error with context
throw new Error(`Failed to write ${path}: ${error.message}`)
}

Common Pitfalls​

1. Swallowing Errors​

// ❌ Bad: Silent failure
try {
dangerousOperation()
} catch (error) {
// Nothing - user has no idea what went wrong
}

// ✅ Good: Log and handle
try {
dangerousOperation()
} catch (error) {
logger.error('Failed to perform operation:', error.message)
throw error // Re-throw or handle appropriately
}

2. Not Validating Input​

// ❌ Bad: No validation
function generateWorkflow(config: any) {
return template(config.branchFlow) // Might be undefined!
}

// ✅ Good: Validate first
function generateWorkflow(config: PipecraftConfig) {
validateConfig(config) // Throws if invalid
return template(config.branchFlow)
}

3. Async Error Handling​

// ❌ Bad: Unhandled promise rejection
async function generate() {
await generateWorkflows() // If this throws, unhandled rejection
}

// ✅ Good: Proper error handling
async function generate() {
try {
await generateWorkflows()
} catch (error) {
logger.error('Generation failed:', error.message)
process.exit(1)
}
}

Debugging Checklist​

When troubleshooting issues:

  • Check Node.js version (node --version)
  • Verify git repository (git status)
  • Verify git remote (git remote -v)
  • Check configuration validity (pipecraft validate)
  • Enable verbose logging (--verbose)
  • Enable debug logging (--debug)
  • Check file permissions (ls -la .github/workflows/)
  • Verify GitHub token (echo $GITHUB_TOKEN)
  • Check GitHub Actions tab for workflow runs
  • Review workflow logs for errors
  • Verify branch names match configuration
  • Check for uncommitted changes (git status)
  • Review cache file (.pipecraft-cache.json)
  • Try force regeneration (--force)
  • Check for conflicting workflows

Getting Help​

If you encounter an error not covered in this guide:

  1. Enable Debug Mode: pipecraft generate --debug
  2. Check GitHub Issues: https://github.com/the-craftlab/pipecraft/issues
  3. Create Issue: Include:
    • PipeCraft version (pipecraft --version)
    • Node.js version (node --version)
    • Operating system
    • Full error message
    • Debug output
    • Configuration file (remove sensitive data)
  4. Stack Overflow: Tag with pipecraft and github-actions