diff --git a/scripts/convert.sh b/scripts/convert.sh index 27d2f66e..cf96ae7e 100755 --- a/scripts/convert.sh +++ b/scripts/convert.sh @@ -263,8 +263,8 @@ convert_openclaw() { # Split body sections into SOUL.md (persona) vs AGENTS.md (operations) # by matching ## header keywords. Unmatched sections go to AGENTS.md. # - # SOUL keywords: identity, memory (paired with identity), communication, - # style, critical rules, rules you must follow + # SOUL keywords: identity, learning & memory, communication, style, + # critical rules, rules you must follow # AGENTS keywords: everything else (mission, deliverables, workflow, etc.) local current_target="agents" # default bucket @@ -288,6 +288,7 @@ convert_openclaw() { header_lower="$(echo "$line" | tr '[:upper:]' '[:lower:]')" if [[ "$header_lower" =~ identity ]] || + [[ "$header_lower" =~ learning.*memory ]] || [[ "$header_lower" =~ communication ]] || [[ "$header_lower" =~ style ]] || [[ "$header_lower" =~ critical.rule ]] || diff --git a/scripts/lint-agents.sh b/scripts/lint-agents.sh index f5e3bb6f..206c325f 100755 --- a/scripts/lint-agents.sh +++ b/scripts/lint-agents.sh @@ -30,6 +30,21 @@ RECOMMENDED_SECTIONS=("Identity" "Core Mission" "Critical Rules") errors=0 warnings=0 +classify_header_target() { + local header_lower="$1" + + if [[ "$header_lower" =~ identity ]] || + [[ "$header_lower" =~ learning.*memory ]] || + [[ "$header_lower" =~ communication ]] || + [[ "$header_lower" =~ style ]] || + [[ "$header_lower" =~ critical.rule ]] || + [[ "$header_lower" =~ rules.you.must.follow ]]; then + printf 'soul' + else + printf 'agents' + fi +} + lint_file() { local file="$1" @@ -76,6 +91,32 @@ lint_file() { echo "WARN $file: body seems very short (< 50 words)" warnings=$((warnings + 1)) fi + + local soul_headers=0 + local agents_headers=0 + while IFS= read -r line; do + if [[ "$line" =~ ^##[[:space:]] ]]; then + local header_lower + header_lower=$(printf '%s' "$line" | tr '[:upper:]' '[:lower:]') + local target + target=$(classify_header_target "$header_lower") + if [[ "$target" == "soul" ]]; then + soul_headers=$((soul_headers + 1)) + else + agents_headers=$((agents_headers + 1)) + fi + fi + done <<< "$body" + + if [[ $soul_headers -eq 0 ]]; then + echo "WARN $file: no section headers map to SOUL.md in convert.sh" + warnings=$((warnings + 1)) + fi + + if [[ $agents_headers -eq 0 ]]; then + echo "WARN $file: no section headers map to AGENTS.md in convert.sh" + warnings=$((warnings + 1)) + fi } # Collect files to lint