Files
2026-07-13 12:35:03 +08:00

251 lines
7.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Consolidated prerequisite checking script for ArcKit
#
# This script provides unified prerequisite checking for ArcKit workflow.
# It helps find projects, validate environment, and check for required files.
#
# Usage: ./check-prerequisites.sh [OPTIONS]
#
# OPTIONS:
# --json Output in JSON format
# --project <prefix> Specify project by number or name prefix
# --require-file <file> Require specific file to exist (can be used multiple times)
# --paths-only Only output path variables (no validation)
# --list-projects List all available projects
# --help, -h Show help message
#
# OUTPUTS:
# JSON mode: {"REPO_ROOT":"...", "PROJECT_DIR":"...", "AVAILABLE_DOCS":["..."]}
# Text mode: REPO_ROOT: ... \n PROJECT_DIR: ... \n AVAILABLE_DOCS: \n ✓/✗ file.md
# Paths only: REPO_ROOT: ... \n PROJECT_DIR: ... etc.
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/common.sh"
# Parse command line arguments
JSON_MODE=false
PATHS_ONLY=false
LIST_PROJECTS=false
PROJECT_PREFIX=""
REQUIRED_FILES=()
while [[ $# -gt 0 ]]; do
case "$1" in
--json)
JSON_MODE=true
shift
;;
--project)
PROJECT_PREFIX="$2"
shift 2
;;
--require-file)
REQUIRED_FILES+=("$2")
shift 2
;;
--paths-only)
PATHS_ONLY=true
shift
;;
--list-projects)
LIST_PROJECTS=true
shift
;;
--help|-h)
cat << 'EOF'
Usage: check-prerequisites.sh [OPTIONS]
Consolidated prerequisite checking for ArcKit workflow.
OPTIONS:
--json Output in JSON format
--project <prefix> Specify project by number or name prefix
--require-file <file> Require specific file to exist (can be used multiple times)
--paths-only Only output path variables (no validation)
--list-projects List all available projects
--help, -h Show this help message
EXAMPLES:
# Check prerequisites in JSON mode
./check-prerequisites.sh --json
# Find project by prefix
./check-prerequisites.sh --project "payment"
# Require specific files
./check-prerequisites.sh --project "001" --require-file "requirements.md"
# List all projects
./check-prerequisites.sh --list-projects
EXIT CODES:
0 - Success
1 - Error (missing required files, project not found, etc.)
EOF
exit 0
;;
*)
log_error "Unknown option: $1"
exit 1
;;
esac
done
# Get repository root
REPO_ROOT="$(find_repo_root)"
# List projects if requested
if [[ "$LIST_PROJECTS" == "true" ]]; then
list_projects "$REPO_ROOT"
exit 0
fi
# Paths only mode - just output variables
if [[ "$PATHS_ONLY" == "true" ]]; then
echo "REPO_ROOT: $REPO_ROOT"
echo "ARCKIT_DIR: $(get_arckit_dir "$REPO_ROOT")"
echo "PROJECTS_DIR: $(get_projects_dir "$REPO_ROOT")"
echo "MEMORY_DIR: $(get_memory_dir "$REPO_ROOT")"
echo "TEMPLATES_DIR: $(get_templates_dir "$REPO_ROOT")"
if [[ -n "$PROJECT_PREFIX" ]]; then
PROJECT_DIR=$(find_project_dir_by_prefix "$PROJECT_PREFIX" "$REPO_ROOT" 2>/dev/null || echo "")
if [[ -n "$PROJECT_DIR" ]]; then
echo "PROJECT_DIR: $PROJECT_DIR"
PROJECT_NUMBER=$(get_project_number_from_dir "$PROJECT_DIR")
echo "PROJECT_NUMBER: $PROJECT_NUMBER"
fi
fi
exit 0
fi
# Find project if prefix specified
PROJECT_DIR=""
PROJECT_NUMBER=""
if [[ -n "$PROJECT_PREFIX" ]]; then
PROJECT_DIR=$(find_project_dir_by_prefix "$PROJECT_PREFIX" "$REPO_ROOT")
if [[ $? -ne 0 ]]; then
exit 1
fi
PROJECT_NUMBER=$(get_project_number_from_dir "$PROJECT_DIR")
fi
# Check for available documentation files
AVAILABLE_DOCS=()
if [[ -n "$PROJECT_DIR" ]]; then
# Check for all standard ArcKit artifacts
ARTIFACTS=(
"stakeholder-drivers.md"
"risk-register.md"
"sobc.md"
"requirements.md"
"data-model.md"
"research-findings.md"
"sow.md"
"evaluation-criteria.md"
"traceability-matrix.md"
"servicenow-design.md"
)
for artifact in "${ARTIFACTS[@]}"; do
if [[ -f "$PROJECT_DIR/$artifact" ]]; then
AVAILABLE_DOCS+=("$artifact")
fi
done
# Check for Wardley maps
if [[ -d "$PROJECT_DIR/wardley-maps" ]] && [[ -n $(ls -A "$PROJECT_DIR/wardley-maps" 2>/dev/null) ]]; then
AVAILABLE_DOCS+=("wardley-maps/")
fi
# Check for vendor proposals
if [[ -d "$PROJECT_DIR/vendors" ]] && [[ -n $(ls -A "$PROJECT_DIR/vendors" 2>/dev/null) ]]; then
AVAILABLE_DOCS+=("vendors/")
fi
fi
# Check required files if specified
ALL_REQUIRED_FOUND=true
for required_file in "${REQUIRED_FILES[@]}"; do
if [[ -n "$PROJECT_DIR" ]]; then
full_path="$PROJECT_DIR/$required_file"
else
full_path="$REPO_ROOT/$required_file"
fi
if [[ ! -f "$full_path" ]]; then
if [[ "$JSON_MODE" != "true" ]]; then
log_error "Required file not found: $required_file"
fi
ALL_REQUIRED_FOUND=false
fi
done
# Output results
if [[ "$JSON_MODE" == "true" ]]; then
# JSON output
echo "{"
echo " \"REPO_ROOT\": \"$REPO_ROOT\","
echo " \"ARCKIT_DIR\": \"$(get_arckit_dir "$REPO_ROOT")\","
echo " \"PROJECTS_DIR\": \"$(get_projects_dir "$REPO_ROOT")\","
echo " \"MEMORY_DIR\": \"$(get_memory_dir "$REPO_ROOT")\","
echo " \"TEMPLATES_DIR\": \"$(get_templates_dir "$REPO_ROOT")\","
if [[ -n "$PROJECT_DIR" ]]; then
echo " \"PROJECT_DIR\": \"$PROJECT_DIR\","
echo " \"PROJECT_NUMBER\": \"$PROJECT_NUMBER\","
else
echo " \"PROJECT_DIR\": null,"
echo " \"PROJECT_NUMBER\": null,"
fi
echo -n " \"AVAILABLE_DOCS\": "
output_json_array "${AVAILABLE_DOCS[@]}"
echo ""
echo "}"
else
# Text output
echo "ArcKit Environment:"
echo "==================="
echo ""
echo "Repository:"
echo " REPO_ROOT: $REPO_ROOT"
echo " ARCKIT_DIR: $(get_arckit_dir "$REPO_ROOT")"
echo " PROJECTS_DIR: $(get_projects_dir "$REPO_ROOT")"
echo " MEMORY_DIR: $(get_memory_dir "$REPO_ROOT")"
echo " TEMPLATES_DIR: $(get_templates_dir "$REPO_ROOT")"
echo ""
if [[ -n "$PROJECT_DIR" ]]; then
echo "Project:"
echo " PROJECT_DIR: $PROJECT_DIR"
echo " PROJECT_NUMBER: $PROJECT_NUMBER"
echo ""
echo "Available Artifacts:"
if [[ ${#AVAILABLE_DOCS[@]} -eq 0 ]]; then
echo " (no artifacts found)"
else
for doc in "${AVAILABLE_DOCS[@]}"; do
echo " ✓ $doc"
done
fi
else
echo "Project: (not specified)"
echo ""
echo "Use --project <prefix> to specify a project"
list_projects "$REPO_ROOT"
fi
fi
# Exit with error if required files missing
if [[ "$ALL_REQUIRED_FOUND" != "true" ]]; then
exit 1
fi
exit 0