跳到正文
cccskills
免费在 GitHub 公开

housekeeping

Generate the weekly "🧹 Housekeeping" digest — a render-only report of repo drift that needs a human eye (stale unmerged branches, mislabeled issues, stuck in-progress tickets, epics ready to close, idle PRs, label-coverage gaps). Reports only, never mutates. Use when asked for a "housekeeping report", "repo drift", "what's stale", or to run the weekly sweep by hand.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(6)

  • SKILL.md7.7 KB
  • gather.mjs15.9 KB
  • post-comment.sh1.8 KB
  • prune-merged-branches.mjs4.3 KB
  • render.mjs8.7 KB
  • schedule.mjs4.5 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Housekeeping digest

A weekly, report-only sweep that catches the drift the event-driven jobs miss — the periodic backstop behind epic #633. It posts one rolling comment to a standing "🧹 Housekeeping" issue listing everything that needs judgment but is too risky to auto-fix. It never deletes a branch, changes a label, or edits an issue — the digest issue body is the only thing it writes.

What it reports (each section omitted when empty)

  • 🌿 Stale unmerged branches — not contained in main (still hold unmerged commits) and untouched for >N days. Merged-into-main branches are out of scope (lossless, not a human-eye item).
  • 🏷️ Issues missing labels — open issues without a type:* and/or a component (pkg:/app:/worker:/poc:) label.
  • 🏗️ Label coverage — packages/*·apps/*·pocs/*·workers/* dirs with no matching label declared in .github/labels.yml (CLAUDE.md treats a missing label as a build failure). Report-only — never auto-prune (a destructive label sync strips the label from every issue).
  • ⏳ Stuck in-progress — status:in-progress issues with no activity in >N days.
  • ✅ Epics ready to close — all sub-issues closed but the epic still open, split by the action each needs (read from the status:ready-to-close / status:needs-postmortem label the labeller stamps — see below): run the postmortem then close vs postmortem done, just close. Any entry whose epic/<number>-* branch still carries commits not on main (git cherry origin/main origin/<branch> non-empty) is annotated with a ⚠️ warning line — the exact failure mode from #1976, where four deliverables went missing because an epic branch was never merged (#1982). Report-only: it never blocks closing, it just says so.
  • 🚧 Epics with active work but not marked in-progress — a sub-issue is status:in-progress but the epic isn't, so it reads as "open, not started" (#980). The labeller reconciles this (see below); the digest just surfaces it.
  • 🧭 In-progress under a non-open-epic parent — status:in-progress issues whose parent isn't a currently-open epic: a closed epic left with unfinished work, or a parent missing the epic label (#980).
  • 🔀 Idle PRs — open PRs with no activity in >N days.
  • 📚 Skill freshness — knowledge skills (the verified: provenance contract, #1073/#1091) whose citations drifted or whose stamp aged out, via scripts/skill-freshness.mjs (fs+git, no LLM): a cited path that vanished (🔴), a cited file with commits newer than the stamp (🟡 possibly-stale), or a stamp > 90d old (🔵 re-verify due). Report-only — a re-verified, re-stamped skill drops off next run (#1100 WS3). Section dropped if the checker can't run.
  • 🗑 Retired projects — retired/ dirs with a .retired.json stamp, showing age and flagging entries past 60 days for full deletion via /retire-delete.

Pipeline (deterministic — no LLM, no secrets)

Mirrors .claude/skills/epic-digest/:

gather.mjs  → housekeeping.data.json   (git for branches + GitHub REST for issues/PRs/labels)
render.mjs  → housekeeping-<date>.md   (JSON → Markdown, sections dropped when empty)
post-comment.sh                        (upsert the one standing "🧹 Housekeeping" issue)
schedule.mjs                           (cadence-as-data: is today a send day per .github/digests.yml?)

Run it by hand

GITHUB_TOKEN=$(gh auth token) node .claude/skills/housekeeping/gather.mjs > housekeeping.data.json
node .claude/skills/housekeeping/render.mjs housekeeping.data.json --out-dir .
cp housekeeping-*.md housekeeping.md
GH_TOKEN=$(gh auth token) DIGEST_BODY_FILE=housekeeping.md bash .claude/skills/housekeeping/post-comment.sh

Branch data needs a full checkout with remote branches present (git fetch origin '+refs/heads/*:refs/remotes/origin/*'); without it the branch section is skipped, not guessed.

Scheduling & delivery — .github/digests.yml

Cadence and delivery channel are config-as-data, not workflow plumbing (#637). The workflow cron fires daily (cheap wake-up); schedule.mjs reads digests.yml and exits early when today isn't a send day — so changing "weekly → daily" or "Wed → Mon" is a one-line edit, never a cron change. Delivery is selection over rails that already exist: issue (this standing-issue path) and email (Resend, mirrors red-team-daily.yml; degrades to a green no-op when RESEND_API_KEY is unset).

housekeeping:
  schedule: daily        # daily | weekly:<dow> ; dow = mon|tue|wed|thu|fri|sat|sun
  deliver: [issue]       # issue | email
  # to: [you@example.com]  # required only when deliver includes email

Lossless branch sweep (separate workflow — the only auto-delete)

The digest is report-only. The one auto-destructive action lives in its own workflow (.github/workflows/cleanup-merged-branches.yml → prune-merged-branches.mjs), split off by blast radius so a digest bug can never delete a branch. It deletes a branch only if it is provably contained in main (git branch -r --merged origin/main, 0 commits ahead) — lossless by construction. It also skips any branch with an open PR, anything newer than BRANCH_MIN_AGE_DAYS (default 1), and main/protected refs.

Report-only until enabled: it runs dry-run (lists what it would delete) unless APPLY is on — set the repo variable CLEANUP_BRANCHES_APPLY=true, or run it via workflow_dispatch with apply: true. Confirm a dry-run looks right before flipping the variable. Complements cleanup-epic-branches.yml (which deletes epic/* on PR merge) by sweeping whatever slipped past an event trigger.

GITHUB_TOKEN=$(gh auth token) node .claude/skills/housekeeping/prune-merged-branches.mjs        # dry-run
GITHUB_TOKEN=$(gh auth token) APPLY=true node .claude/skills/housekeeping/prune-merged-branches.mjs  # delete

Epic status labels (separate workflow — the only auto-label) (#763 / #980)

The epic sections above read labels the digest does not set: status:ready-to-close, status:needs-postmortem, and status:in-progress. They're reconciled by a separate daily workflow (.github/workflows/label-ready-epics.yml → scripts/label-ready-epics.mjs), split off by blast radius exactly like the branch janitor — it's the only auto-label mutation, and the digest stays report-only. The labeller derives each open epic's status from its children (mutually-exclusive, at most one):

  • all sub-issues closed → status:ready-to-close if a <!-- postmortem:done --> marker exists on a comment (left by the postmortem skill), else status:needs-postmortem;
  • ≥1 sub-issue status:in-progress → status:in-progress (the opening side, #980);
  • otherwise (open-but-idle or no children) → none. It removes any managed label the epic no longer qualifies for. The same labels drive the daily epic-digest email's bands, so both digests agree. Dry-run by default; set repo var LABEL_READY_EPICS_APPLY=true to write.

Tuning

  • HOUSEKEEPING_STALE_DAYS (env, default 14) — the "no activity in N days" threshold.
  • HOUSEKEEPING_ISSUE_TITLE (env, default 🧹 Housekeeping) — the standing issue title.

The scheduled run lives in .github/workflows/housekeeping.yml.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

a11y

免费

Accessibility review for Vue surfaces — the code-cleaning analog of /code-review and /simplify, pointed at WCAG/ARIA. Reviews just your diff (or a package/file), rates findings by severity, and either comments inline on the PR (--comment) or applies the safe fixes for you (--fix). Steers the depth-aware `a11y` subagent. Use when asked to "check accessibility", "a11y this", "audit ARIA/keyboard", or run /a11y.

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

ask-human

免费

Emit a blocking question the owner can read in ~10 seconds and answer in one reply — the scannable, recommendation-first handoff every agent posts when it hits a fork it can't own. Leads with the one decision + a recommendation, carries the 🤖 provenance header, doubles as the

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

audit

免费

Audit packages for documentation completeness, detect drift between code and docs, and maintain documentation quality across the monorepo. Use when checking package docs, running audits, or reviewing documentation health.

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

Author a placeable layout block that looks right at ANY pane size. The one hard rule — size to the PANE with container queries (@container), never the viewport — plus list/form playbooks and the sizing contract (minWidth etc.) the viability metric reads. Use when adding/converting a croutonLayoutBlocks block, or when a block overflows/breaks in a narrow pane.

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

When a bug or regression is reported, the FIRST step — before fixing — is to research how and when it was introduced (git archaeology), then record that finding on the tracking issue/PR. Use the moment a bug, error, broken build, or "this used to work" is reported, before writing a fix. Produces a first-bad-commit (or "not a code regression") note you paste onto the issue.

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

commit

免费

Smart, granular git commits following monorepo conventions. Analyzes changes, filters to session-relevant files, groups by intent, and uses conventional commit format. Use when committing code changes.

中文简介正在准备中。当前显示原文说明。

FriendlyInternet/nuxt-crouton102026年10月20日 更新

查看 FriendlyInternet 的全部技能

报告此技能的问题