Agent skill
dataset-validator-deploy-pre
Example skill hook for validating datasets before infrastructure deployment. This demonstrates the skill hook interface and WorkflowContext/WorkflowResult pattern.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/devops/dataset-validator-deploy-pre-fractary-claude-plugins
SKILL.md
Dataset Validator - Pre-Deployment (Example Skill Hook)
<CRITICAL_RULES> IMPORTANT: Skill Hook Interface
- Receive WorkflowContext via environment variables (set by invoke-skill-hook.sh)
- Return structured WorkflowResult as JSON to stdout
- Exit with code 0 for success, 1 for failure
- Always include success, messages, errors in result
- WorkflowResult must be valid JSON </CRITICAL_RULES>
Optional: WorkflowContext JSON file passed as argument </INPUTS>
<COMPLETION_CRITERIA> ✅ WorkflowContext read and parsed ✅ Dataset validation checks executed ✅ Validation results documented ✅ WorkflowResult JSON output to stdout ✅ Appropriate exit code returned </COMPLETION_CRITERIA>
<ERROR_HANDLING> If validation fails:
- Set success: false
- Populate errors array with specific issues
- Include suggestions in messages
- Exit with code 1
- Skill hook execution will be blocked (if required: true) </ERROR_HANDLING>
<EXAMPLE_EXECUTION>
# Environment variables set by faber-cloud hook executor
export FABER_CLOUD_ENV="test"
export FABER_CLOUD_OPERATION="deploy"
export FABER_CLOUD_HOOK_TYPE="pre-deploy"
export FABER_CLOUD_PROJECT="myproject"
export FABER_CLOUD_TERRAFORM_DIR="./infrastructure/terraform"
# Skill invoked by invoke-skill-hook.sh
/skill dataset-validator-deploy-pre
# Expected output (JSON):
{
"success": true,
"messages": ["Validation passed"],
"warnings": [],
"errors": [],
"artifacts": {},
"executionTime": 1234,
"timestamp": "2025-11-07T12:00:00Z",
"skillName": "dataset-validator-deploy-pre"
}
</EXAMPLE_EXECUTION>
Implementation
Step 1: Read WorkflowContext
# Read context from environment variables
ENV=${FABER_CLOUD_ENV:-unknown}
OPERATION=${FABER_CLOUD_OPERATION:-unknown}
HOOK_TYPE=${FABER_CLOUD_HOOK_TYPE:-unknown}
PROJECT=${FABER_CLOUD_PROJECT:-unknown}
echo "🎯 STARTING: Dataset Validator (Pre-Deployment)"
echo "Environment: $ENV"
echo "Operation: $OPERATION"
echo "Hook Type: $HOOK_TYPE"
echo "Project: $PROJECT"
echo "───────────────────────────────────────"
Step 2: Validate Datasets
# Example validation logic
DATASET_DIR="./datasets"
ISSUES_FOUND=0
MESSAGES=()
WARNINGS=()
ERRORS=()
# Check datasets exist
if [ ! -d "$DATASET_DIR" ]; then
ERRORS+=("Dataset directory not found: $DATASET_DIR")
ISSUES_FOUND=$((ISSUES_FOUND + 1))
else
MESSAGES+=("Dataset directory found: $DATASET_DIR")
# Count datasets
DATASET_COUNT=$(ls -1 "$DATASET_DIR"/*.csv 2>/dev/null | wc -l)
MESSAGES+=("Found $DATASET_COUNT dataset files")
# Validate each dataset
for dataset in "$DATASET_DIR"/*.csv; do
if [ -f "$dataset" ]; then
# Check file size
SIZE=$(stat -f%z "$dataset" 2>/dev/null || stat -c%s "$dataset" 2>/dev/null)
if [ $SIZE -gt 10000000 ]; then
WARNINGS+=("Dataset $(basename $dataset) is large: ${SIZE} bytes")
fi
# Validate CSV structure (example: check header row)
if ! head -n1 "$dataset" | grep -q ","; then
ERRORS+=("Dataset $(basename $dataset) appears invalid (no CSV header)")
ISSUES_FOUND=$((ISSUES_FOUND + 1))
fi
fi
done
fi
Step 3: Generate WorkflowResult
# Build result JSON
START_TIME=$(date +%s)
END_TIME=$(date +%s)
EXECUTION_TIME=$((END_TIME - START_TIME))
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
SUCCESS="true"
if [ $ISSUES_FOUND -gt 0 ]; then
SUCCESS="false"
fi
# Convert arrays to JSON
MESSAGES_JSON=$(printf '%s\n' "${MESSAGES[@]}" | jq -R . | jq -s .)
WARNINGS_JSON=$(printf '%s\n' "${WARNINGS[@]}" | jq -R . | jq -s .)
ERRORS_JSON=$(printf '%s\n' "${ERRORS[@]}" | jq -R . | jq -s .)
# Output WorkflowResult as JSON
cat <<EOF
{
"success": $SUCCESS,
"messages": $MESSAGES_JSON,
"warnings": $WARNINGS_JSON,
"errors": $ERRORS_JSON,
"artifacts": {
"datasetsValidated": $DATASET_COUNT,
"issuesFound": $ISSUES_FOUND
},
"executionTime": $EXECUTION_TIME,
"timestamp": "$TIMESTAMP",
"skillName": "dataset-validator-deploy-pre"
}
EOF
# Exit with appropriate code
if [ $ISSUES_FOUND -gt 0 ]; then
exit 1
else
exit 0
fi
Testing
Test independently:
# Set up test environment
export FABER_CLOUD_ENV="test"
export FABER_CLOUD_OPERATION="deploy"
export FABER_CLOUD_HOOK_TYPE="pre-deploy"
export FABER_CLOUD_PROJECT="test-project"
# Create test datasets
mkdir -p ./datasets
echo "id,name,value" > ./datasets/test1.csv
echo "1,test,100" >> ./datasets/test1.csv
# Invoke skill
/skill dataset-validator-deploy-pre
# Expected: Success with messages about datasets found
Test as hook:
{
"hooks": {
"pre-deploy": [
{
"type": "skill",
"name": "dataset-validator-deploy-pre",
"required": true,
"failureMode": "stop",
"timeout": 300
}
]
}
}
# Run hook executor
bash plugins/faber-cloud/skills/cloud-common/scripts/execute-hooks.sh pre-deploy test ./infrastructure/terraform
# Expected: Hook executes skill and reports results
Installation
To use this skill hook in your project:
-
Copy skill to project:
bashmkdir -p .claude/skills/dataset-validator-deploy-pre cp dataset-validator-deploy-pre-SKILL.md .claude/skills/dataset-validator-deploy-pre/SKILL.md -
Configure hook in faber-cloud.json:
json{ "hooks": { "pre-deploy": [ { "type": "skill", "name": "dataset-validator-deploy-pre", "required": true, "failureMode": "stop", "timeout": 300, "description": "Validate datasets before deployment" } ] } } -
Test the hook:
bash# Test skill independently /skill dataset-validator-deploy-pre # Test full deployment workflow /fractary-faber-cloud:deploy-apply --env=test
Benefits
✅ Reusable - Share across projects
✅ Testable - Test independently with /skill
✅ Discoverable - Visible in /help
✅ Structured - Type-safe interfaces
✅ Maintainable - Clear documentation
✅ Extensible - Easy to customize
See Also:
Didn't find tool you were looking for?