690414:1113 Update README.md /.agents/skills, /.windsurf/workflows
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
#!/bin/bash
|
||||
|
||||
# audit-skills.sh - Verify skill completeness and health
|
||||
# Part of LCBP3-DMS Phase 2 improvements
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Base directory
|
||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
AGENTS_DIR="$BASE_DIR/.agents"
|
||||
SKILLS_DIR="$AGENTS_DIR/skills"
|
||||
|
||||
echo "=== Skills Health Audit ==="
|
||||
echo "Base directory: $BASE_DIR"
|
||||
echo
|
||||
|
||||
# Function to check if skill has required files
|
||||
check_skill_health() {
|
||||
local skill_dir="$1"
|
||||
local skill_name="$(basename "$skill_dir")"
|
||||
|
||||
local issues=0
|
||||
|
||||
# Check for SKILL.md
|
||||
if [[ -f "$skill_dir/SKILL.md" ]]; then
|
||||
echo -e "${GREEN} OK${NC}: $skill_name/SKILL.md"
|
||||
else
|
||||
echo -e "${RED} MISSING${NC}: $skill_name/SKILL.md"
|
||||
((issues++))
|
||||
fi
|
||||
|
||||
# Check for templates directory (optional)
|
||||
if [[ -d "$skill_dir/templates" ]]; then
|
||||
template_count=$(find "$skill_dir/templates" -name "*.md" -type f | wc -l)
|
||||
if [[ $template_count -gt 0 ]]; then
|
||||
echo -e "${GREEN} OK${NC}: $skill_name/templates ($template_count files)"
|
||||
else
|
||||
echo -e "${YELLOW} EMPTY${NC}: $skill_name/templates (no files)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check SKILL.md content if exists
|
||||
local skill_file="$skill_dir/SKILL.md"
|
||||
if [[ -f "$skill_file" ]]; then
|
||||
# Check for required front matter fields
|
||||
local required_fields=("name" "description" "version")
|
||||
for field in "${required_fields[@]}"; do
|
||||
if grep -q "^$field:" "$skill_file"; then
|
||||
echo -e " ${GREEN} FIELD${NC}: $field"
|
||||
else
|
||||
echo -e " ${RED} MISSING FIELD${NC}: $field"
|
||||
((issues++))
|
||||
fi
|
||||
done
|
||||
|
||||
# Check for Role section
|
||||
if grep -q "^## Role$" "$skill_file"; then
|
||||
echo -e " ${GREEN} SECTION${NC}: Role"
|
||||
else
|
||||
echo -e " ${YELLOW} MISSING SECTION${NC}: Role"
|
||||
((issues++))
|
||||
fi
|
||||
|
||||
# Check for Task section
|
||||
if grep -q "^## Task$" "$skill_file"; then
|
||||
echo -e " ${GREEN} SECTION${NC}: Task"
|
||||
else
|
||||
echo -e " ${YELLOW} MISSING SECTION${NC}: Task"
|
||||
((issues++))
|
||||
fi
|
||||
fi
|
||||
|
||||
return $issues
|
||||
}
|
||||
|
||||
# Function to get skill version from SKILL.md
|
||||
get_skill_version() {
|
||||
local skill_file="$1"
|
||||
if [[ -f "$skill_file" ]]; then
|
||||
grep "^version:" "$skill_file" | head -1 | sed 's/version: *//' || echo "unknown"
|
||||
else
|
||||
echo "no_file"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check skills directory
|
||||
if [[ ! -d "$SKILLS_DIR" ]]; then
|
||||
echo -e "${RED}ERROR: Skills directory not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Scanning skills directory: $SKILLS_DIR"
|
||||
echo
|
||||
|
||||
# Get all skill directories
|
||||
SKILL_DIRS=()
|
||||
while IFS= read -r -d '' dir; do
|
||||
SKILL_DIRS+=("$dir")
|
||||
done < <(find "$SKILLS_DIR" -maxdepth 1 -type d -not -path "$SKILLS_DIR" -print0 | sort -z)
|
||||
|
||||
echo "Found ${#SKILL_DIRS[@]} skill directories"
|
||||
echo
|
||||
|
||||
# Audit each skill
|
||||
TOTAL_ISSUES=0
|
||||
SKILL_SUMMARY=()
|
||||
|
||||
for skill_dir in "${SKILL_DIRS[@]}"; do
|
||||
skill_name="$(basename "$skill_dir")"
|
||||
echo "Auditing: $skill_name"
|
||||
echo "------------------------"
|
||||
|
||||
check_skill_health "$skill_dir"
|
||||
issues=$?
|
||||
|
||||
skill_version=$(get_skill_version "$skill_dir/SKILL.md")
|
||||
SKILL_SUMMARY+=("$skill_name:$issues:$skill_version")
|
||||
|
||||
TOTAL_ISSUES=$((TOTAL_ISSUES + issues))
|
||||
echo
|
||||
done
|
||||
|
||||
# Summary report
|
||||
echo "=== Skills Audit Summary ==="
|
||||
echo
|
||||
|
||||
echo "Skill Status:"
|
||||
echo "-----------"
|
||||
for summary in "${SKILL_SUMMARY[@]}"; do
|
||||
IFS=':' read -r name issues version <<< "$summary"
|
||||
if [[ $issues -eq 0 ]]; then
|
||||
echo -e "${GREEN} HEALTHY${NC}: $name (v$version)"
|
||||
else
|
||||
echo -e "${RED} ISSUES${NC}: $name (v$version) - $issues issues"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
# Check skills.md version consistency
|
||||
SKILLS_VERSION_FILE="$SKILLS_DIR/VERSION"
|
||||
if [[ -f "$SKILLS_VERSION_FILE" ]]; then
|
||||
global_version=$(grep "^version:" "$SKILLS_VERSION_FILE" | sed 's/version: *//')
|
||||
echo "Global skills version: v$global_version"
|
||||
echo
|
||||
|
||||
# Check for version mismatches
|
||||
echo "Version Consistency Check:"
|
||||
echo "------------------------"
|
||||
VERSION_MISMATCHES=0
|
||||
|
||||
for summary in "${SKILL_SUMMARY[@]}"; do
|
||||
IFS=':' read -r name issues version <<< "$summary"
|
||||
if [[ "$version" != "unknown" && "$version" != "no_file" && "$version" != "$global_version" ]]; then
|
||||
echo -e "${YELLOW} MISMATCH${NC}: $name is v$version, global is v$global_version"
|
||||
((VERSION_MISMATCHES++))
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $VERSION_MISMATCHES -eq 0 ]]; then
|
||||
echo -e "${GREEN} All skills match global version${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo
|
||||
|
||||
# Overall health
|
||||
if [[ $TOTAL_ISSUES -eq 0 ]]; then
|
||||
echo -e "${GREEN}=== SUCCESS: All skills healthy ===${NC}"
|
||||
echo "Total skills: ${#SKILL_DIRS[@]}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}=== ISSUES FOUND: $TOTAL_ISSUES total issues ===${NC}"
|
||||
echo
|
||||
echo "Recommendations:"
|
||||
echo "1. Fix missing SKILL.md files"
|
||||
echo "2. Add required front matter fields"
|
||||
echo "3. Ensure Role and Task sections exist"
|
||||
echo "4. Align skill versions with global version"
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,149 @@
|
||||
#!/bin/bash
|
||||
|
||||
# sync-workflows.sh - Sync workflow references between .agents and .windsurf
|
||||
# Part of LCBP3-DMS Phase 2 improvements
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Base directory
|
||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
AGENTS_DIR="$BASE_DIR/.agents"
|
||||
WINDSURF_DIR="$BASE_DIR/.windsurf"
|
||||
WORKFLOWS_DIR="$WINDSURF_DIR/workflows"
|
||||
|
||||
echo "=== Workflow Synchronization Check ==="
|
||||
echo "Base directory: $BASE_DIR"
|
||||
echo
|
||||
|
||||
# Function to check if workflow exists
|
||||
check_workflow() {
|
||||
local workflow_name="$1"
|
||||
local workflow_file="$WORKFLOWS_DIR/$workflow_name"
|
||||
|
||||
if [[ -f "$workflow_file" ]]; then
|
||||
echo -e "${GREEN} EXISTS${NC}: $workflow_name"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED} MISSING${NC}: $workflow_name"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to list all workflows
|
||||
list_workflows() {
|
||||
if [[ -d "$WORKFLOWS_DIR" ]]; then
|
||||
find "$WORKFLOWS_DIR" -name "*.md" -type f | sort
|
||||
else
|
||||
echo "No workflows directory found"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check directories
|
||||
echo "Checking directory structure..."
|
||||
if [[ -d "$AGENTS_DIR" ]]; then
|
||||
echo -e "${GREEN} OK${NC}: .agents directory exists"
|
||||
else
|
||||
echo -e "${RED} ERROR${NC}: .agents directory not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -d "$WINDSURF_DIR" ]]; then
|
||||
echo -e "${GREEN} OK${NC}: .windsurf directory exists"
|
||||
else
|
||||
echo -e "${RED} ERROR${NC}: .windsurf directory not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -d "$WORKFLOWS_DIR" ]]; then
|
||||
echo -e "${GREEN} OK${NC}: workflows directory exists"
|
||||
else
|
||||
echo -e "${RED} ERROR${NC}: workflows directory not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
|
||||
# Expected workflows based on README documentation
|
||||
echo "Checking expected workflows..."
|
||||
EXPECTED_WORKFLOWS=(
|
||||
"00-speckit.all.md"
|
||||
"01-speckit.constitution.md"
|
||||
"02-speckit.specify.md"
|
||||
"03-speckit.clarify.md"
|
||||
"04-speckit.plan.md"
|
||||
"05-speckit.tasks.md"
|
||||
"06-speckit.analyze.md"
|
||||
"07-speckit.implement.md"
|
||||
"08-speckit.checker.md"
|
||||
"09-speckit.tester.md"
|
||||
"10-speckit.reviewer.md"
|
||||
"11-speckit.validate.md"
|
||||
"speckit.prepare.md"
|
||||
"schema-change.md"
|
||||
"create-backend-module.md"
|
||||
"create-frontend-page.md"
|
||||
"deploy.md"
|
||||
"review.md"
|
||||
"util-speckit.checklist.md"
|
||||
"util-speckit.diff.md"
|
||||
"util-speckit.migrate.md"
|
||||
"util-speckit.quizme.md"
|
||||
"util-speckit.status.md"
|
||||
"util-speckit.taskstoissues.md"
|
||||
)
|
||||
|
||||
MISSING_WORKFLOWS=0
|
||||
|
||||
for workflow in "${EXPECTED_WORKFLOWS[@]}"; do
|
||||
if ! check_workflow "$workflow"; then
|
||||
((MISSING_WORKFLOWS++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
# List all actual workflows
|
||||
echo "All workflows in $WORKFLOWS_DIR:"
|
||||
echo "--------------------------------"
|
||||
while IFS= read -r workflow; do
|
||||
echo " $(basename "$workflow")"
|
||||
done < <(list_workflows)
|
||||
|
||||
echo
|
||||
|
||||
# Check for orphaned workflows (unexpected ones)
|
||||
echo "Checking for unexpected workflows..."
|
||||
ACTUAL_WORKFLOWS=()
|
||||
while IFS= read -r workflow; do
|
||||
ACTUAL_WORKFLOWS+=("$(basename "$workflow")")
|
||||
done < <(list_workflows)
|
||||
|
||||
for actual_workflow in "${ACTUAL_WORKFLOWS[@]}"; do
|
||||
if [[ ! " ${EXPECTED_WORKFLOWS[*]} " =~ " ${actual_workflow} " ]]; then
|
||||
echo -e "${YELLOW} UNEXPECTED${NC}: $actual_workflow"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
# Summary
|
||||
if [[ $MISSING_WORKFLOWS -eq 0 ]]; then
|
||||
echo -e "${GREEN}=== SUCCESS: All expected workflows present ===${NC}"
|
||||
echo "Total workflows: ${#ACTUAL_WORKFLOWS[@]}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}=== FAILED: $MISSING_WORKFLOWS workflows missing ===${NC}"
|
||||
echo
|
||||
echo "To fix missing workflows:"
|
||||
echo "1. Create missing workflow files in $WORKFLOWS_DIR"
|
||||
echo "2. Use existing workflows as templates"
|
||||
echo "3. Run this script again to verify"
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,108 @@
|
||||
#!/bin/bash
|
||||
|
||||
# validate-versions.sh - Check version consistency across .agents files
|
||||
# Part of LCBP3-DMS Phase 2 improvements
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Base directory
|
||||
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
AGENTS_DIR="$BASE_DIR/.agents"
|
||||
|
||||
# Expected version (should match LCBP3 version)
|
||||
EXPECTED_VERSION="1.8.6"
|
||||
|
||||
echo "=== .agents Version Validation ==="
|
||||
echo "Base directory: $BASE_DIR"
|
||||
echo "Expected version: $EXPECTED_VERSION"
|
||||
echo
|
||||
|
||||
# Function to extract version from file
|
||||
extract_version() {
|
||||
local file="$1"
|
||||
local pattern="$2"
|
||||
|
||||
if [[ -f "$file" ]]; then
|
||||
grep -o "$pattern" "$file" | head -1 | sed 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/' || echo "NOT_FOUND"
|
||||
else
|
||||
echo "FILE_NOT_FOUND"
|
||||
fi
|
||||
}
|
||||
|
||||
# Files to check
|
||||
declare -A FILES_TO_CHECK=(
|
||||
["$AGENTS_DIR/README.md"]="Version: \([0-9]\+\.[0-9]\+\.[0-9]\+\)"
|
||||
["$AGENTS_DIR/skills/VERSION"]="version: \([0-9]\+\.[0-9]\+\.[0-9]\+\)"
|
||||
["$AGENTS_DIR/rules/00-project-context.md"]="Version: \([0-9]\+\.[0-9]\+\.[0-9]\+\)"
|
||||
["$AGENTS_DIR/skills/skills.md"]="V\([0-9]\+\.[0-9]\+\.[0-9]\+\)"
|
||||
)
|
||||
|
||||
# Track issues
|
||||
ISSUES=0
|
||||
|
||||
echo "Checking version consistency..."
|
||||
echo
|
||||
|
||||
for file in "${!FILES_TO_CHECK[@]}"; do
|
||||
pattern="${FILES_TO_CHECK[$file]}"
|
||||
relative_path="${file#$BASE_DIR/}"
|
||||
|
||||
version=$(extract_version "$file" "$pattern")
|
||||
|
||||
if [[ "$version" == "NOT_FOUND" ]] || [[ "$version" == "FILE_NOT_FOUND" ]]; then
|
||||
echo -e "${RED} ERROR${NC}: $relative_path - Version not found"
|
||||
((ISSUES++))
|
||||
elif [[ "$version" != "$EXPECTED_VERSION" ]]; then
|
||||
echo -e "${RED} ERROR${NC}: $relative_path - Found v$version, expected v$EXPECTED_VERSION"
|
||||
((ISSUES++))
|
||||
else
|
||||
echo -e "${GREEN} OK${NC}: $relative_path - v$version"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
|
||||
# Check for version mismatches in skill files
|
||||
echo "Checking skill file versions..."
|
||||
SKILL_VERSIONS_FILE="$AGENTS_DIR/skills/VERSION"
|
||||
if [[ -f "$SKILL_VERSIONS_FILE" ]]; then
|
||||
skills_version=$(extract_version "$SKILL_VERSIONS_FILE" "version: \([0-9]\+\.[0-9]\+\.[0-9]\+\)")
|
||||
echo "Skills version file: v$skills_version"
|
||||
fi
|
||||
|
||||
# Check workflow versions (in .windsurf/workflows)
|
||||
WORKFLOWS_DIR="$BASE_DIR/.windsurf/workflows"
|
||||
if [[ -d "$WORKFLOWS_DIR" ]]; then
|
||||
echo "Checking workflow files..."
|
||||
workflow_count=0
|
||||
for workflow in "$WORKFLOWS_DIR"/*.md; do
|
||||
if [[ -f "$workflow" ]]; then
|
||||
workflow_count=$((workflow_count + 1))
|
||||
fi
|
||||
done
|
||||
echo -e "${GREEN} OK${NC}: Found $workflow_count workflow files"
|
||||
else
|
||||
echo -e "${YELLOW} WARNING${NC}: Workflows directory not found at $WORKFLOWS_DIR"
|
||||
fi
|
||||
|
||||
echo
|
||||
|
||||
# Summary
|
||||
if [[ $ISSUES -eq 0 ]]; then
|
||||
echo -e "${GREEN}=== SUCCESS: All versions consistent ===${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}=== FAILED: $ISSUES version issues found ===${NC}"
|
||||
echo
|
||||
echo "To fix version issues:"
|
||||
echo "1. Update files to use v$EXPECTED_VERSION"
|
||||
echo "2. Ensure LCBP3 project version matches"
|
||||
echo "3. Run this script again to verify"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user