bundled/skills/smart-file-writer/SKILL.md
Intelligent file write error handler: diagnoses permissions, disk space, path length, file locks before retrying. Use when you encounter 'Error writing file', 'Permission denied', 'Access denied', 'No space left', or related file write failures.
npx skillsauth add foryourhealth111-pixel/vco-skills-codex smart-file-writerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Automatically diagnoses and resolves file write errors through systematic investigation rather than blind retries. Prevents common write failures proactively.
Use this skill when any of these occurs:
This skill does NOT:
Required inputs:
1. Path Validation
import os
# Check path length (Windows: 260 char limit)
if len(filepath) > 260 and os.name == 'nt':
print(f"Path too long: {len(filepath)} chars")
# Check parent directory exists
parent = os.path.dirname(filepath)
if not os.path.exists(parent):
print(f"Parent directory missing: {parent}")
2. Permission Check
import os
# Check directory write permission
parent = os.path.dirname(filepath) or '.'
if not os.access(parent, os.W_OK):
print(f"No write permission: {parent}")
# Check file permissions if exists
if os.path.exists(filepath):
if not os.access(filepath, os.W_OK):
print(f"File not writable: {filepath}")
3. Disk Space Check
import shutil
# Check available disk space
stat = shutil.disk_usage(os.path.dirname(filepath) or '.')
free_gb = stat.free / (1024**3)
if free_gb < 0.1: # Less than 100MB
print(f"Low disk space: {free_gb:.2f} GB free")
4. File Lock Detection
import os
# Try to open with exclusive access
try:
with open(filepath, 'a') as f:
pass
except PermissionError:
print(f"File locked by another process: {filepath}")
5. Windows-Specific Checks
# Check if file is in use (Windows)
handle.exe -a "filepath"
# Check file attributes
attrib "filepath"
Pattern 1: Create Missing Directories
import os
os.makedirs(os.path.dirname(filepath), exist_ok=True)
Pattern 2: Atomic Write (Temp + Rename)
import os
import tempfile
# Write to temp file first
temp_fd, temp_path = tempfile.mkstemp(dir=os.path.dirname(filepath))
try:
with os.fdopen(temp_fd, 'w') as f:
f.write(content)
# Atomic rename
os.replace(temp_path, filepath)
except Exception as e:
os.unlink(temp_path)
raise
Pattern 3: Exponential Backoff for Transient Issues
import time
def write_with_retry(filepath, content, max_retries=3):
for attempt in range(max_retries):
try:
with open(filepath, 'w') as f:
f.write(content)
return True
except (PermissionError, OSError) as e:
if attempt < max_retries - 1:
wait = 2 ** attempt # 1s, 2s, 4s
time.sleep(wait)
else:
raise
Pattern 4: Alternative Path (Shorten Long Paths)
import os
import hashlib
def shorten_path(long_path):
"""Use hash for long filenames"""
dir_path = os.path.dirname(long_path)
filename = os.path.basename(long_path)
if len(long_path) > 260:
# Hash the filename
name, ext = os.path.splitext(filename)
hash_name = hashlib.md5(name.encode()).hexdigest()[:16]
return os.path.join(dir_path, f"{hash_name}{ext}")
return long_path
Pattern 5: Permission Fix Suggestions
# Linux/Mac: Add write permission
chmod u+w filepath
# Windows: Remove read-only attribute
attrib -r filepath
# Windows: Take ownership (admin required)
takeown /f filepath
icacls filepath /grant %username%:F
Pattern 6: Detect Antivirus Interference
import time
import os
def is_antivirus_blocking(filepath):
"""Detect if antivirus is scanning file"""
try:
# Try to open exclusively
with open(filepath, 'r+b') as f:
pass
return False
except PermissionError:
# Wait and retry
time.sleep(0.5)
try:
with open(filepath, 'r+b') as f:
pass
return True # Was temporarily blocked
except:
return False # Persistent block
Before Any Critical Write
def validate_write_conditions(filepath):
"""Run before writing important files"""
issues = []
# 1. Path length
if len(filepath) > 260 and os.name == 'nt':
issues.append(f"Path too long: {len(filepath)} chars")
# 2. Parent directory
parent = os.path.dirname(filepath) or '.'
if not os.path.exists(parent):
issues.append(f"Parent missing: {parent}")
elif not os.access(parent, os.W_OK):
issues.append(f"No write permission: {parent}")
# 3. Disk space
stat = shutil.disk_usage(parent)
if stat.free < 100 * 1024 * 1024: # 100MB
issues.append(f"Low disk space: {stat.free / 1024**2:.1f} MB")
# 4. File exists and writable
if os.path.exists(filepath):
if not os.access(filepath, os.W_OK):
issues.append(f"File not writable: {filepath}")
return issues
Wrap Write Tool
# Before using Write tool, validate:
issues = validate_write_conditions(target_path)
if issues:
print("Pre-write validation failed:")
for issue in issues:
print(f" - {issue}")
# Take corrective action
else:
# Proceed with Write tool
Wrap Edit Tool
# Before editing, check file is writable
if not os.access(filepath, os.W_OK):
print(f"Cannot edit: {filepath} is read-only")
# Suggest: chmod u+w or attrib -r
Wrap Bash File Operations
# Before redirecting output
if [ ! -w "$(dirname "$output_file")" ]; then
echo "Cannot write to directory"
exit 1
fi
Input:
Steps:
os.makedirs('results', exist_ok=True)Expected output:
Diagnosis: Parent directory 'results' does not exist
Resolution: Created directory 'results'
Retry: torch.save() succeeded
Input:
D:\very\long\path\with\many\subdirectories\...\extremely_long_filename_that_exceeds_windows_limit.csvSteps:
Expected output:
Warning: Path length 285 chars exceeds Windows limit (260)
Alternative: D:\very\long\path\...\a3f5e8b2c1d4.csv
Mapping saved to: path_mappings.json
Write succeeded to alternative path
Input:
Steps:
attrib -r data.csvExpected output:
Diagnosis: File 'data.csv' has read-only attribute
Resolution: Run 'attrib -r data.csv' to remove read-only flag
[After user confirmation]
Attribute removed. Retry succeeded.
Input:
Steps:
Expected output:
Diagnosis: File 'report.xlsx' is locked by another process
Likely cause: File is open in Microsoft Excel
Resolution options:
1. Close Excel and retry
2. Write to alternative: 'report_new.xlsx'
3. Use atomic write with temp file
Cannot proceed automatically. User action required.
Input:
Steps:
Expected output:
Warning: Insufficient disk space
Required: ~2.0 GB
Available: 0.5 GB
Recommendations:
1. Clean up temporary files
2. Write to alternative drive: E:\
3. Compress checkpoint before saving
Write operation blocked to prevent failure.
references/diagnostic-procedures.md: Detailed diagnostic workflowsreferences/platform-specific.md: Windows/Linux/Mac specific issuesreferences/integration-guide.md: Integrating with Claude Code toolsreferences/error-catalog.md: Common error messages and solutionsdevelopment
Chunked N-D arrays for cloud storage. Compressed arrays, parallel I/O, S3/GCS integration, NumPy/Dask/Xarray compatible, for large-scale scientific computing pipelines.
tools
Use only when the user explicitly asks to stage, commit, push, and open a GitHub pull request in one flow using the GitHub CLI (`gh`).
tools
Spreadsheet toolkit (.xlsx/.csv). Create/edit with formulas/formatting, analyze data, visualization, recalculate formulas, for spreadsheet processing and analysis.
tools
High-performance CSV processing with xan CLI for large tabular datasets, streaming transformations, and low-memory pipelines.