360 lines
10 KiB
Bash
Executable File
360 lines
10 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# List all ArcKit projects with status indicators
|
|
#
|
|
# This script lists all projects in the repository with information about
|
|
# which artifacts exist and their completion status.
|
|
#
|
|
# Usage: ./list-projects.sh [OPTIONS]
|
|
#
|
|
# OPTIONS:
|
|
# --json Output in JSON format
|
|
# --verbose, -v Show detailed artifact status
|
|
# --help, -h Show help message
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/common.sh"
|
|
|
|
# Parse command line arguments
|
|
JSON_MODE=false
|
|
VERBOSE=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--json)
|
|
JSON_MODE=true
|
|
shift
|
|
;;
|
|
--verbose|-v)
|
|
VERBOSE=true
|
|
shift
|
|
;;
|
|
--help|-h)
|
|
cat << 'EOF'
|
|
Usage: list-projects.sh [OPTIONS]
|
|
|
|
List all ArcKit projects with status indicators.
|
|
|
|
OPTIONS:
|
|
--json Output in JSON format
|
|
--verbose, -v Show detailed artifact status
|
|
--help, -h Show this help message
|
|
|
|
EXAMPLES:
|
|
# List all projects
|
|
./list-projects.sh
|
|
|
|
# List with detailed artifact status
|
|
./list-projects.sh --verbose
|
|
|
|
# Output in JSON format
|
|
./list-projects.sh --json
|
|
|
|
EXIT CODES:
|
|
0 - Success
|
|
1 - Error
|
|
|
|
EOF
|
|
exit 0
|
|
;;
|
|
*)
|
|
log_error "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Get repository root
|
|
REPO_ROOT="$(find_repo_root)"
|
|
PROJECTS_DIR="$(get_projects_dir "$REPO_ROOT")"
|
|
|
|
# Check if projects directory exists
|
|
if [[ ! -d "$PROJECTS_DIR" ]]; then
|
|
if [[ "$JSON_MODE" == "true" ]]; then
|
|
echo '{"projects": []}'
|
|
else
|
|
log_warning "No projects directory found"
|
|
echo ""
|
|
echo "Run: /arckit:init to initialize an ArcKit repository"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# Count projects
|
|
PROJECT_COUNT=$(find "$PROJECTS_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
|
|
|
if [[ $PROJECT_COUNT -eq 0 ]]; then
|
|
if [[ "$JSON_MODE" == "true" ]]; then
|
|
echo '{"projects": []}'
|
|
else
|
|
echo "No projects found"
|
|
echo ""
|
|
echo "Run: /arckit:create to create a new project"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# Function to check artifact existence
|
|
check_artifact() {
|
|
local project_dir="$1"
|
|
local artifact="$2"
|
|
|
|
if [[ "$artifact" == "wardley-maps/" ]]; then
|
|
if [[ -d "$project_dir/wardley-maps" ]] && [[ -n $(ls -A "$project_dir/wardley-maps" 2>/dev/null) ]]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
elif [[ "$artifact" == "vendors/" ]]; then
|
|
if [[ -d "$project_dir/vendors" ]] && [[ -n $(ls -A "$project_dir/vendors" 2>/dev/null) ]]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
else
|
|
if [[ -f "$project_dir/$artifact" ]]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Count vendor proposals
|
|
count_vendors() {
|
|
local project_dir="$1"
|
|
if [[ -d "$project_dir/vendors" ]]; then
|
|
find "$project_dir/vendors" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Count external documents
|
|
count_external_docs() {
|
|
local project_dir="$1"
|
|
if [[ -d "$project_dir/external" ]]; then
|
|
find "$project_dir/external" -maxdepth 1 -type f \
|
|
\( -name "*.pdf" -o -name "*.docx" -o -name "*.md" -o -name "*.csv" -o -name "*.sql" -o -name "*.png" -o -name "*.jpg" \) \
|
|
! -name "README.md" 2>/dev/null | wc -l
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Calculate completion percentage
|
|
calculate_completion() {
|
|
local project_dir="$1"
|
|
local total=10
|
|
local completed=0
|
|
|
|
# Standard artifacts (8 items) — check both legacy and ARC-*-TYPE-* naming
|
|
local -A artifact_patterns=(
|
|
[stakeholder-drivers.md]="STKE"
|
|
[risk-register.md]="RISK"
|
|
[sobc.md]="SOBC"
|
|
[requirements.md]="REQ"
|
|
[data-model.md]="DATA"
|
|
[research-findings.md]="RSCH"
|
|
[sow.md]="SOW"
|
|
[evaluation-criteria.md]="EVAL"
|
|
)
|
|
|
|
for artifact in "${!artifact_patterns[@]}"; do
|
|
local type_code="${artifact_patterns[$artifact]}"
|
|
if [[ -f "$project_dir/$artifact" ]] || compgen -G "$project_dir/ARC-*-${type_code}-*.md" > /dev/null 2>&1; then
|
|
((completed++))
|
|
fi
|
|
done
|
|
|
|
# Wardley maps (1 item)
|
|
if [[ -d "$project_dir/wardley-maps" ]] && [[ -n $(ls -A "$project_dir/wardley-maps" 2>/dev/null) ]]; then
|
|
((completed++))
|
|
fi
|
|
|
|
# Vendors (1 item)
|
|
if [[ -d "$project_dir/vendors" ]] && [[ -n $(ls -A "$project_dir/vendors" 2>/dev/null) ]]; then
|
|
((completed++))
|
|
fi
|
|
|
|
# Calculate percentage
|
|
local percentage=$((completed * 100 / total))
|
|
echo "$percentage"
|
|
}
|
|
|
|
# Get status emoji based on completion
|
|
get_status_emoji() {
|
|
local percentage=$1
|
|
|
|
if [[ $percentage -eq 100 ]]; then
|
|
echo "✅"
|
|
elif [[ $percentage -ge 75 ]]; then
|
|
echo "🟢"
|
|
elif [[ $percentage -ge 50 ]]; then
|
|
echo "🟡"
|
|
elif [[ $percentage -ge 25 ]]; then
|
|
echo "🟠"
|
|
else
|
|
echo "🔴"
|
|
fi
|
|
}
|
|
|
|
# JSON output mode
|
|
if [[ "$JSON_MODE" == "true" ]]; then
|
|
echo "{"
|
|
echo " \"repository_root\": \"$REPO_ROOT\","
|
|
echo " \"projects_dir\": \"$PROJECTS_DIR\","
|
|
echo " \"project_count\": $PROJECT_COUNT,"
|
|
echo " \"projects\": ["
|
|
|
|
first_project=true
|
|
for project_dir in "$PROJECTS_DIR"/*; do
|
|
if [[ -d "$project_dir" ]]; then
|
|
if [[ "$first_project" == "true" ]]; then
|
|
first_project=false
|
|
else
|
|
echo ","
|
|
fi
|
|
|
|
project_name=$(basename "$project_dir")
|
|
project_number=$(get_project_number_from_dir "$project_dir" || echo "")
|
|
vendor_count=$(count_vendors "$project_dir")
|
|
external_doc_count=$(count_external_docs "$project_dir")
|
|
completion=$(calculate_completion "$project_dir")
|
|
|
|
echo " {"
|
|
echo " \"name\": \"$project_name\","
|
|
echo " \"number\": \"$project_number\","
|
|
echo " \"path\": \"$project_dir\","
|
|
echo " \"completion_percentage\": $completion,"
|
|
echo " \"vendor_count\": $vendor_count,"
|
|
echo " \"external_doc_count\": $external_doc_count,"
|
|
echo " \"artifacts\": {"
|
|
echo " \"stakeholder_drivers\": $(check_artifact "$project_dir" "stakeholder-drivers.md"),"
|
|
echo " \"risk_register\": $(check_artifact "$project_dir" "risk-register.md"),"
|
|
echo " \"sobc\": $(check_artifact "$project_dir" "sobc.md"),"
|
|
echo " \"requirements\": $(check_artifact "$project_dir" "requirements.md"),"
|
|
echo " \"data_model\": $(check_artifact "$project_dir" "data-model.md"),"
|
|
echo " \"research_findings\": $(check_artifact "$project_dir" "research-findings.md"),"
|
|
echo " \"wardley_maps\": $(check_artifact "$project_dir" "wardley-maps/"),"
|
|
echo " \"sow\": $(check_artifact "$project_dir" "sow.md"),"
|
|
echo " \"evaluation_criteria\": $(check_artifact "$project_dir" "evaluation-criteria.md"),"
|
|
echo " \"vendors\": $(check_artifact "$project_dir" "vendors/")"
|
|
echo " }"
|
|
echo -n " }"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo " ]"
|
|
echo "}"
|
|
exit 0
|
|
fi
|
|
|
|
# Text output mode
|
|
echo "ArcKit Projects"
|
|
echo "==============="
|
|
echo ""
|
|
echo "Repository: $REPO_ROOT"
|
|
echo "Projects found: $PROJECT_COUNT"
|
|
echo ""
|
|
|
|
for project_dir in "$PROJECTS_DIR"/*; do
|
|
if [[ -d "$project_dir" ]]; then
|
|
project_name=$(basename "$project_dir")
|
|
project_number=$(get_project_number_from_dir "$project_dir" || echo "")
|
|
vendor_count=$(count_vendors "$project_dir")
|
|
external_doc_count=$(count_external_docs "$project_dir")
|
|
completion=$(calculate_completion "$project_dir")
|
|
status_emoji=$(get_status_emoji $completion)
|
|
|
|
echo "$status_emoji [$project_number] $project_name ($completion% complete)"
|
|
|
|
if [[ "$VERBOSE" == "true" ]]; then
|
|
echo " Path: $project_dir"
|
|
echo " Artifacts:"
|
|
|
|
# Check each artifact
|
|
if [[ -f "$project_dir/stakeholder-drivers.md" ]]; then
|
|
echo " ✓ Stakeholder Drivers"
|
|
else
|
|
echo " ✗ Stakeholder Drivers"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/risk-register.md" ]]; then
|
|
echo " ✓ Risk Register"
|
|
else
|
|
echo " ✗ Risk Register"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/sobc.md" ]]; then
|
|
echo " ✓ Strategic Outline Business Case"
|
|
else
|
|
echo " ✗ Strategic Outline Business Case"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/requirements.md" ]]; then
|
|
echo " ✓ Requirements"
|
|
else
|
|
echo " ✗ Requirements"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/data-model.md" ]]; then
|
|
echo " ✓ Data Model"
|
|
else
|
|
echo " ✗ Data Model"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/research-findings.md" ]]; then
|
|
echo " ✓ Research Findings"
|
|
else
|
|
echo " ✗ Research Findings"
|
|
fi
|
|
|
|
if [[ -d "$project_dir/wardley-maps" ]] && [[ -n $(ls -A "$project_dir/wardley-maps" 2>/dev/null) ]]; then
|
|
echo " ✓ Wardley Maps"
|
|
else
|
|
echo " ✗ Wardley Maps"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/sow.md" ]]; then
|
|
echo " ✓ Statement of Work"
|
|
else
|
|
echo " ✗ Statement of Work"
|
|
fi
|
|
|
|
if [[ -f "$project_dir/evaluation-criteria.md" ]]; then
|
|
echo " ✓ Evaluation Criteria"
|
|
else
|
|
echo " ✗ Evaluation Criteria"
|
|
fi
|
|
|
|
if [[ $vendor_count -gt 0 ]]; then
|
|
echo " ✓ Vendor Proposals ($vendor_count)"
|
|
else
|
|
echo " ✗ Vendor Proposals"
|
|
fi
|
|
|
|
if [[ $external_doc_count -gt 0 ]]; then
|
|
echo " ✓ External Documents ($external_doc_count)"
|
|
else
|
|
echo " ✗ External Documents"
|
|
fi
|
|
|
|
echo ""
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
echo "Legend:"
|
|
echo " ✅ Complete (100%)"
|
|
echo " 🟢 Mostly complete (75-99%)"
|
|
echo " 🟡 In progress (50-74%)"
|
|
echo " 🟠 Started (25-49%)"
|
|
echo " 🔴 Not started (0-24%)"
|
|
|
|
exit 0
|