Files
project-scripts/docs/plans/2026-02-23-finish-up-implementation.md
2026-02-23 11:44:39 -05:00

5.0 KiB

/finish-up Skill Implementation Plan

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Create a /finish-up Claude Code slash command that scans all projects for uncommitted/unpushed changes, reports findings, then dispatches parallel subagents to commit and push.

Architecture: A bash scan script (git-status-check.sh) outputs structured CSV-like results. The skill file (finish-up.md) instructs Claude to run the script, parse results, present a report, confirm with the user, then spawn one Bash subagent per project for autonomous commit/push.

Tech Stack: Bash (scan script), Claude Code skill markdown (command file)


Task 1: Create the git-status-check.sh scan script

Files:

  • Create: C:/Users/aisaacs/Desktop/Projects/project-scripts/git-status-check.sh

Step 1: Write the scan script

#!/usr/bin/env bash
# git-status-check.sh - Scan git repos for uncommitted changes and unpushed commits
# Usage: git-status-check.sh [directory]
#   directory: path to scan (default: parent of script directory)
# Output: TAB-separated lines: project_name \t uncommitted_count \t unpushed_count \t branch

set -euo pipefail

SCAN_DIR="${1:-$(dirname "$(dirname "$(readlink -f "$0")")")}"

for dir in "$SCAN_DIR"/*/; do
    [ -d "$dir/.git" ] || continue

    name=$(basename "$dir")
    branch=$(git -C "$dir" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")

    # Count uncommitted changes
    uncommitted=$(git -C "$dir" status --porcelain 2>/dev/null | wc -l | tr -d ' ')

    # Count unpushed commits (0 if no upstream)
    unpushed=$(git -C "$dir" log @{u}..HEAD --oneline 2>/dev/null | wc -l | tr -d ' ' || echo "0")

    echo -e "${name}\t${uncommitted}\t${unpushed}\t${branch}"
done

Step 2: Make it executable and test

Run: chmod +x C:/Users/aisaacs/Desktop/Projects/project-scripts/git-status-check.sh Run: bash C:/Users/aisaacs/Desktop/Projects/project-scripts/git-status-check.sh C:/Users/aisaacs/Desktop/Projects

Expected: TAB-separated output with one line per git repo, showing project name, uncommitted count, unpushed count, and branch.

Step 3: Verify edge cases

Run the script and confirm:

  • Non-git directories (like loose .py/.cs files) are skipped
  • Repos with no upstream tracking show 0 for unpushed (not an error)

Step 4: Commit

cd C:/Users/aisaacs/Desktop/Projects/project-scripts
git add git-status-check.sh
git commit -m "feat: add git-status-check.sh scan script

Scans all git repos in a directory for uncommitted changes and
unpushed commits. Outputs structured TAB-separated results.
Replaces check_uncommitted.py with additional unpushed detection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"

Task 2: Create the /finish-up skill file

Files:

  • Create: C:/Users/aisaacs/.claude/commands/finish-up.md

Step 1: Write the skill file

The skill markdown instructs Claude on how to execute the /finish-up workflow:

  1. Detect context (all projects vs single project)
  2. Run git-status-check.sh and parse output
  3. Present report table
  4. Ask user which projects to process
  5. Spawn parallel Bash subagents for commit/push
  6. Collect results and present summary

Key instructions for the skill:

  • Use Task tool with subagent_type="Bash" for parallel work
  • Each subagent: git add -A && git diff --cached --stat to review, craft commit message, commit, push with retry
  • Handle Gitea cold-start (retry push after 5s on first failure)
  • Never commit .env, credentials, secrets files
  • Use conventional commit format
  • Include Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Step 2: Test the skill

Run /finish-up in a Claude Code session from C:\Users\aisaacs\Desktop\Projects and verify:

  • Script runs and output is parsed correctly
  • Report is presented clearly
  • Subagents are dispatched for selected projects

Step 3: Commit

cd C:/Users/aisaacs/Desktop/Projects/project-scripts
git add C:/Users/aisaacs/.claude/commands/finish-up.md
git commit -m "feat: add /finish-up Claude Code slash command

Scans projects for uncommitted/unpushed changes, reports findings,
then dispatches parallel subagents to commit and push.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"

Task 3: Clean up old check_uncommitted.py

Files:

  • Delete: C:/Users/aisaacs/Desktop/Projects/check_uncommitted.py (loose copy in Projects root)
  • Delete: C:/Users/aisaacs/Desktop/Projects/project-scripts/check_uncommitted.py

Step 1: Remove old scripts

rm C:/Users/aisaacs/Desktop/Projects/check_uncommitted.py
cd C:/Users/aisaacs/Desktop/Projects/project-scripts
git rm check_uncommitted.py

Step 2: Commit

git commit -m "chore: remove check_uncommitted.py (replaced by git-status-check.sh)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"

Task 4: Push project-scripts to remote

Step 1: Push

cd C:/Users/aisaacs/Desktop/Projects/project-scripts
git push

If push fails (Gitea cold-start), wait 5 seconds and retry.