eod
Use when the user runs /eod or says they're calling it a day. Scans configured project repos for uncommitted/unpushed work so nothing gets left behind. Asks once for the project list, remembers it.
SKILL.mdskills/eod/SKILL.md
GitHubEnd of Day
Quick sweep across your active repos for anything that shouldn't be left overnight. Right now the only check is git state (uncommitted + unpushed). More checks can be added later.
Workflow
1. Resolve project roots
Read the memory file eod_project_roots.md. It should contain a list of absolute (or ~-relative) directory paths, one per line, possibly bulleted.
If the memory exists and has paths, use them.
If the memory is missing or empty, ask via AskUserQuestion:
question: "Which project directories should /eod scan?"
options:
- label: "Current directory only"
description: "Just the cwd this time. Don't save."
- label: "Pick from ~ subdirs"
description: "List git repos under ~ and let me multi-select."
The "Other" option lets the user paste paths (comma-separated).
If the user picks the "pick from ~ subdirs" path, list git repos with:
find ~ -maxdepth 3 -name .git -type d 2>/dev/null | sed 's|/.git$||' | sort
Then present them via a multi-select AskUserQuestion (cap at the first ~20; tell the user to edit the memory file directly for more).
After the user picks, save the chosen roots to eod_project_roots.md:
---
name: EOD Project Roots
description: Filesystem paths scanned by /eod for uncommitted/unpushed git work.
type: reference
---
Roots:
- <path1>
- <path2>
Add a pointer line to MEMORY.md:
- [EOD Project Roots](eod_project_roots.md) — paths scanned by /eod
If the user picked "current directory only", skip the save and use pwd.
2. Run the git check
Use the pre-approved hook to avoid permission prompts:
~/.claude/hooks/eod-git-check.sh <root1> <root2> ...
Output is pipe-delimited, one line per root:
DIR|STATE|DIRTY|UNTRACKED|AHEAD|BRANCH|REMOTE
States: ok, dirty, unpushed, both, no-git, no-remote, error.
3. Render the report
Group rows by state, in this order: both → dirty → unpushed → no-remote → error → ok (collapse ok into a single tally line at the bottom).
Header:
EOD Sweep — N repos scanned
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Per-repo lines (omit empty groups):
dirty/both:⚠️ <dir> · <branch> · <D> modified, <U> untrackedunpushed/both:↑ <dir> · <branch> → <remote> · <A> aheadno-remote:◌ <dir> · <branch> · no upstream setno-git:? <dir> · not a git repoerror:✕ <dir> · git error
If a repo is in both state, render two lines (one under dirty, one under unpushed) so the user sees both signals.
Footer:
─────────────────────────────────────────
N clean · N dirty · N unpushed · N other
If everything is clean:
EOD Sweep — N repos scanned
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ All clear. Go home.
4. Suggest next step
If there are any dirty or unpushed rows, end with one short line — no checklist, no nagging:
Worth a
/commit --pushin those before you log off.
Skip the suggestion when everything is clean.
Rules
- Never commit, push, or modify any repo automatically — this skill only reports.
- Don't ask the user to confirm before running the scan; just run it.
- If the memory file lists a path that doesn't exist anymore, treat it as
no-gitand continue — don't fail the whole sweep. - To change the scanned roots, the user can edit
eod_project_roots.mdor delete it to re-prompt.