agent-loop-ext
Crash-resilient external agent loop with state persistence and CI/CD integration
Clean up .aiwg/working/ by promoting, archiving, or deleting temporary files
$ npx -y skills add jmagly/aiwg --skill workspace-prune-working --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/workspace-prune-workingContext preview
The summary Claude sees to decide when to auto-load this skill.
Clean up .aiwg/working/ by promoting, archiving, or deleting temporary files
namespace: aiwg name: workspace-prune-working platforms: [all] description: Clean up .aiwg/working/ by promoting, archiving, or deleting temporary files
Clean up the `.aiwg/working/` directory by intelligently handling temporary files. Promotes valuable content to the main documentation structure, archives content worth preserving, and deletes truly temporary files.
| Flag | Description | |------|-------------| | `project-directory` | Project root (default: `.`) | | `--promote-all` | Promote all promotable files without prompting | | `--archive-all` | Archive all archivable files without prompting | | `--delete-all` | Delete all deletable files without prompting | | `--dry-run` | Preview changes without modifying files | | `--interactive` | Prompt for each file decision | | `--force` | Skip confirmation prompts |
The `.aiwg/working/` directory is designated for:
It is **NOT** a permanent storage location. Files here should eventually be:
Inventory all files in `.aiwg/working/`:
# List all files with metadata
find .aiwg/working -type f -exec stat -c '%Y %s %n' {} \; | sort -rn
# Count by subdirectory
find .aiwg/working -mindepth 1 -maxdepth 1 -type d | while read dir; do
echo "$(basename "$dir"): $(find "$dir" -type f | wc -l) files"
doneReport:
Working Directory Scan ====================== Total files: 23 Total size: 145 KB By Category: architecture/ 8 files (SAD drafts, reviews) requirements/ 5 files (UC iterations) testing/ 4 files (test plan drafts) scratch/ 6 files (temporary notes) Age Distribution: < 1 day: 4 files 1-7 days: 8 files > 7 days: 11 files
Analyze each file to determine appropriate action:
**Classification Criteria:**
| Classification | Criteria | Action | |----------------|----------|--------| | PROMOTE | Final/reviewed version, high quality, no TODOs | Move to main .aiwg/ structure | | ARCHIVE | Useful history, superseded, completed work | Move to .aiwg/archive/ | | DELETE | Scratch notes, duplicates, empty, truly temp | Remove | | REVIEW | Unclear status, needs human decision | Flag for review |
**File Analysis Heuristics:**
def classify_file(filepath):
content = read_file(filepath)
filename = basename(filepath)
# Check for finalization markers
if "FINAL" in filename or "APPROVED" in filename:
return "PROMOTE"
if "BASELINED" in content or "Status: Approved" in content:
return "PROMOTE"
# Check for draft/WIP markers
if "DRAFT" in filename or "WIP" in filename:
if file_age_days(filepath) > 14:
return "ARCHIVE" # Old draft, archive for reference
return "REVIEW" # Recent draft, needs decision
# Check for review files
if "review" in filename.lower():
if "synthesized" in get_parent_files(filepath):
return "DELETE" # Reviews already synthesized
return "ARCHIVE" # Keep reviews for audit
# Check for scratch/temp patterns
if "scratch" in filepath or "temp" in filepath:
if file_age_days(filepath) > 3:
return "DELETE"
return "REVIEW"
# Check for versioned files
if re.match(r'v\d+\.\d+', filename):
if not is_latest_version(filepath):
return "ARCHIVE"
return "PROMOTE" # Latest version should be promoted
# Default: needs review
return "REVIEW"Report:
File Classification
===================
PROMOTE (4 files):
.aiwg/working/architecture/sad/v0.3-final.md
→ .aiwg/architecture/software-architecture-doc.md
Reason: Final version, approved status
.aiwg/working/requirements/uc-auth-approved.md
→ .aiwg/requirements/use-cases/uc-auth.md
Reason: Approved use case
.aiwg/working/testing/test-plan-baselined.md
→ .aiwg/testing/master-test-plan.md
Reason: Baselined marker found
.aiwg/working/architecture/adr-001-final.md
→ .aiwg/architecture/decisions/adr-001.md
Reason: Final ADR
ARCHIVE (6 files):
.aiwg/working/architecture/sad/v0.1-draft.md
→ .aiwg/archive/architecture/sad-v0.1-20251209.md
Reason: Superseded by v0.3
.aiwg/working/architecture/sad/reviews/security-review.md
→ .aiwg/archive/reviews/sad-security-review-20251209.md
Reason: Review already synthesized
.aiwg/working/architecture/sad/reviews/test-review.md
→ .aiwg/archive/reviews/sad-test-review-20251209.md
Reason: Review already synthesized
... (3 more)
DELETE (8 files):
.aiwg/working/scratch/notes.md
Reason: Scratch file, 12 days old
.aiwg/working/scratch/temp-analysis.md
Reason: Temp file prefix, empty content
.aiwg/working/architecture/sad/v0.2-draft.md
Reason: Intermediate draft, v0.3 exists
... (5 more)
REVIEW (5 files):
.aiwg/working/requirements/nfr-draft.md
Reason: Recent draft (3 days), unclear status
.aiwg/working/testing/integration-tests-wip.md
Reason: WIP marker, may be active work
... (3 more)Map working files to their correct permanent locations:
Promotion Mapping ================= .aiwg/working/architecture/ → .aiwg/architecture/ sad/*.md → software-architecture-doc.md adr-*.md → decisions/adr-*.md diagrams/ → diagrams/ .aiwg/working/requirements/ → .aiwg/requirements/ uc-*.md → use-cases/ nfr-*.md → nfrs/ user-story-*.md → user-stories/ .aiwg/working
Reusable project context and specialist workflows for the AI tools you already use. Plan software, coordinate specialist reviews, prepare campaigns, investigate incidents, organize research, curate media, and maintain operational knowledge.
Repo: jmagly/aiwg
Crash-resilient external agent loop with state persistence and CI/CD integration
Detect requests for iterative autonomous agent loops and route to the appropriate loop executor
Automatically execute tests when code-generating agents modify source files, enforcing the execute-before-return pattern
Enable agent loops to learn from similar past tasks and share patterns across loops
Query and manage the executable feedback debug memory
Execute tests on generated code and iterate until passing