---
name: heredoc-file-write
description: Use shell heredoc syntax as a workaround when write_file fails on complex TypeScript/JSX/code files with encoding or escaping issues
---
# Heredoc File Write Workaround
## When to Use This Skill
Use this pattern when:
- `write_file` repeatedly fails with "unknown error" or similar messages
- The target file contains complex code (TypeScript, JSX, JSON with special characters, etc.)
- Standard file writing approaches encounter encoding or escaping issues
- You need a reliable fallback method to create files
## Core Technique
Switch from `write_file` to `run_shell` using heredoc syntax with `cat`. The heredoc approach handles special characters, quotes, and complex content more reliably.
## Step-by-Step Instructions
### Step 1: Identify Write Failures
When `write_file` fails repeatedly on the same file:
1. Note the error message (e.g., "unknown error", encoding issues)
2. Review the file content for special characters, nested quotes, or complex syntax
3. Attempt the heredoc workaround below
### Step 2: Use Heredoc Syntax
Execute shell command with heredoc:
```bash
cat > /path/to/file.tsx << 'EOF'
// Your file content here
import React from 'react';
const Component = () => {
return
Hello
;
};
export default Component;
EOF
```
### Step 3: Key Heredoc Rules
1. **Use quoted delimiter** (`'EOF'` not `EOF`) to prevent variable expansion:
- `'EOF'` = literal content (recommended for code files)
- `EOF` = allows variable expansion (use only if needed)
2. **Match delimiters exactly**: Opening and closing `EOF` must be on their own lines with no leading/trailing whitespace
3. **No escaping needed**: Content between delimiters is taken literally when using quoted delimiter
### Step 4: Verify File Creation
After executing the heredoc command:
1. Check if file exists: `ls -la /path/to/file.tsx`
2. Verify content: `cat /path/to/file.tsx` or `head -20 /path/to/file.tsx`
3. Proceed with subsequent tasks once confirmed
## Example Scenarios
### TypeScript/JSX Component
```bash
cat > src/components/Button.tsx << 'EOF'
import React from 'react';
interface ButtonProps {
label: string;
onClick: () => void;
}
export const Button: React.FC = ({ label, onClick }) => {
return (
);
};
EOF
```
### JSON Configuration
```bash
cat > tsconfig.json << 'EOF'
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
},
"include": ["src/**/*"]
}
EOF
```
### Complex Shell Script
```bash
cat > deploy.sh << 'EOF'
#!/bin/bash
set -e
echo "Deploying..."
if [ "$ENV" = "production" ]; then
echo "Production deployment"
fi
EOF
```
## Advantages Over write_file
1. **No escaping complexity**: Quotes, backslashes, and special characters work naturally
2. **Preserves formatting**: Indentation and line breaks remain exact
3. **Handles multi-line content**: No need to concatenate strings or use base64
4. **More reliable**: Shell handles file I/O directly with fewer abstraction layers
## Limitations
- Creates files in shell execution context (ensure correct working directory)
- Less programmatic than `write_file` for dynamic content generation
- Requires shell access (may not work in restricted environments)
## Troubleshooting
**Problem**: File not created at expected path
- **Solution**: Use absolute paths or verify current working directory with `pwd`
**Problem**: Content appears corrupted
- **Solution**: Ensure delimiter is quoted (`'EOF'`) and closing delimiter has no trailing whitespace
**Problem**: Permission denied
- **Solution**: Ensure target directory exists and you have write permissions