Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 39 additions & 31 deletions .github/workflows/auto-archive.yml
Original file line number Diff line number Diff line change
@@ -1,59 +1,67 @@
name: Auto Archive Root Garbage
name: Auto-Archive Repository Clutter (AI-HPP v4.2 Rules)

on:
pull_request:
branches: [ main ]
push:
branches: [ main ]
branches: [ "main" ]
workflow_dispatch:

jobs:
auto-archive:
archive:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
- name: Checkout
uses: actions/checkout@v4

- name: Move unexpected root items to archive
run: |
echo "Scanning root for unexpected items..."
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

allowed=(
- name: Run auto-archive script
run: |
ALLOWED=(
"README.md"
"CONTRIBUTING.md"
"LICENSE"
".gitignore"
"docs"
"spec"
"scripts"
"examples"
"scripts"
"archive"
".github"
"CONTRIBUTING.md"
)

today=$(date +%Y-%m-%d)
target="archive/$today/auto-archive"
mkdir -p "$target"
mkdir -p archive/$(date +%Y-%m-%d)/auto

# Convert allowed list into grep pattern
PATTERN=$(printf "%s\n" "${ALLOWED[@]}" | paste -sd "|" -)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Escape allowed names before regex matching

Building PATTERN by joining raw filenames makes grep -E treat metacharacters in allowed names as regex operators, so entries like README.md and .gitignore match unintended names (for example READMEXmd), which lets non-canonical root items bypass archiving. Quote or escape each allowed literal before composing the alternation so matching stays exact.

Useful? React with 👍 / 👎.


for ITEM in * .*; do
# Skip git internals and dots
[[ "$ITEM" == "." || "$ITEM" == ".." || "$ITEM" == ".git" || "$ITEM" == ".github" ]] && continue

moved=0
shopt -s dotglob nullglob
for item in * .*; do
[[ "$item" == "." || "$item" == ".." || "$item" == ".git" ]] && continue
if ! echo "$ITEM" | grep -Eq "^($PATTERN)$"; then
TARGET="archive/$(date +%Y-%m-%d)/auto/$ITEM"
echo "Archiving unexpected item: $ITEM → $TARGET"

keep=false
for a in "${allowed[@]}"; do
[[ "$item" == "$a" ]] && keep=true
done
mkdir -p "$(dirname "$TARGET")"
mv "$ITEM" "$TARGET"

if [ "$keep" = false ]; then
echo "Moving $item -> $target/$item"
mv "$item" "$target/$item"
moved=1
echo "Archived automatically by workflow #4: not part of v4.2 canonical layout." \
> "${TARGET}.reason"
fi
done

if [ $moved -eq 1 ]; then
echo "Archived unexpected root items."
- name: Commit & Push
run: |
git config user.name "AI-HPP Auto-Archiver"
git config user.email "actions@github.com"

if [[ -n $(git status --porcelain) ]]; then
git add -A
git commit -m "auto-archive: cleanup based on AI-HPP v4.2 layout"
git push
else
echo "No unexpected root items found."
echo "No changes detected."
fi
Loading