Files
gh-technicalpickles-pickled…/skills/scope/scripts/create-doctor-group.sh
2025-11-30 09:00:29 +08:00

206 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Create a new Scope doctor group with helper scripts
set -euo pipefail
usage() {
cat << EOF
Usage: $0 <type> <group-name>
Create a new Scope doctor group with helper scripts.
Arguments:
type Group type: 'application' or 'environment' or 'project'
group-name Descriptive name (e.g., ruby-version, colima)
Examples:
$0 application ruby-version
$0 environment colima
$0 project database-setup
The script will create:
For application/environment:
- {config-root}/{type}/{group-name}.yaml
- {config-root}/{type}/bin/{group-name}.sh
For project:
- .scope/{group-name}.yaml
- .scope/bin/{group-name}.sh
EOF
exit 1
}
# Check arguments
if [[ $# -ne 2 ]]; then
usage
fi
TYPE="$1"
GROUP_NAME="$2"
# Validate type and determine base directory
case "$TYPE" in
application | environment)
# Try common config directory structures
if [[ -d "config/${TYPE}" ]]; then
BASE_DIR="config/${TYPE}"
elif [[ -d "scope-config/${TYPE}" ]]; then
BASE_DIR="scope-config/${TYPE}"
elif [[ -d "${TYPE}" ]]; then
BASE_DIR="${TYPE}"
else
echo "Error: Cannot find ${TYPE} directory" >&2
echo "Run this from config root directory" >&2
exit 1
fi
BIN_DIR="${BASE_DIR}/bin"
;;
project)
BASE_DIR=".scope"
BIN_DIR="${BASE_DIR}/bin"
;;
*)
echo "Error: type must be 'application', 'environment', or 'project'" >&2
usage
;;
esac
# Create directories
mkdir -p "$BASE_DIR" "$BIN_DIR"
# Create YAML file
YAML_FILE="${BASE_DIR}/${GROUP_NAME}.yaml"
if [[ -f "$YAML_FILE" ]]; then
echo "Error: $YAML_FILE already exists" >&2
exit 1
fi
cat > "$YAML_FILE" << EOF
apiVersion: scope.github.com/v1alpha
kind: ScopeDoctorGroup
metadata:
name: ${GROUP_NAME}
description: TODO: Brief description of what this group does
spec:
include: when-required # or 'by-default'
needs:
# TODO: Add dependencies here
# - dependency-1
# - dependency-2
actions:
- name: check-and-fix
description: TODO: What this action checks/fixes
required: true
check:
# Option 1: Command-based check
commands:
- ./bin/${GROUP_NAME}.sh check
# Option 2: Path-based check (watches files for changes)
# paths:
# - "file-to-watch.txt"
# - "**/*.config"
fix:
commands:
- ./bin/${GROUP_NAME}.sh fix
helpText: |
TODO: What to do if the fix fails.
Common issues:
1. Issue 1 and resolution
2. Issue 2 and resolution
If you need assistance, contact #help-channel in Slack.
# Optional: helpUrl: https://docs.example.com/troubleshooting
EOF
# Create helper script
SCRIPT_FILE="${BIN_DIR}/${GROUP_NAME}.sh"
if [[ -f "$SCRIPT_FILE" ]]; then
echo "Error: $SCRIPT_FILE already exists" >&2
exit 1
fi
cat > "$SCRIPT_FILE" << 'SCRIPTEOF'
#!/usr/bin/env bash
# Helper script for GROUP_NAME doctor group
set -euo pipefail
ACTION="${1:-}"
check() {
# TODO: Implement check logic
# Return 0 if check passes (nothing to fix)
# Return non-zero if check fails (fix needed)
echo "Checking..." >&2
# Example: Check if a file exists
# if [[ -f .required-file ]]; then
# echo "Check passed" >&2
# return 0
# else
# echo "Check failed: .required-file missing" >&2
# return 1
# fi
echo "TODO: Implement check logic" >&2
return 1
}
fix() {
# TODO: Implement fix logic
# Return 0 on success
# Return non-zero on failure
echo "Fixing..." >&2
# Example: Create required file
# touch .required-file
echo "TODO: Implement fix logic" >&2
return 1
}
case "$ACTION" in
check)
check
;;
fix)
fix
;;
*)
echo "Usage: $0 [check|fix]" >&2
exit 1
;;
esac
SCRIPTEOF
# Replace GROUP_NAME placeholder
sed -i.bak "s/GROUP_NAME/${GROUP_NAME}/g" "$SCRIPT_FILE" && rm "${SCRIPT_FILE}.bak"
# Make script executable
chmod +x "$SCRIPT_FILE"
echo "Created files:"
echo " - $YAML_FILE"
echo " - $SCRIPT_FILE"
echo ""
echo "Next steps:"
echo "1. Edit $SCRIPT_FILE:"
echo " - Implement check() logic"
echo " - Implement fix() logic"
echo "2. Test script standalone:"
echo " - $SCRIPT_FILE check"
echo " - $SCRIPT_FILE fix"
echo "3. Edit $YAML_FILE:"
echo " - Update description"
echo " - Add dependencies in 'needs'"
echo " - Adjust include mode (when-required vs by-default)"
echo " - Update helpText"
echo "4. Test group:"
echo " - scope doctor list | grep ${GROUP_NAME}"
echo " - scope doctor run --only ${GROUP_NAME} --no-cache"
echo "5. Validate schema:"
echo " - jsonschema validate schema.json $YAML_FILE"