关于 ecosystem
按需审计 Claude Code 生态的 Skill。它检查 Skill 新旧状态、项目活动、CLAUDE.md 偏差和 Mac Mini 服务,报告问题并将摘要追加到每日笔记。
主要功能
- 01检查 Skill 更新状态与失效链接
- 02检查项目活动情况
- 03检测过时或未跟踪的 CLAUDE.md
- 04通过 SSH 检查 Mac Mini 服务
- 05将生态摘要写入每日笔记
适用场景
- 01检查 Claude Code Skill 状态
- 02发现不活跃项目和过时指南
- 03检查远程 Mac Mini 服务状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ glebis/ claude-skills --skill ecosystem安装后在 Claude Code 中输入/ecosystem确认已加载。
详细介绍
生态系统审计
按需审计 Claude Code 生态系统。运行 4 项检查,输出包含注意事项摘要的完整报告,并将摘要追加到今天的日记中。
工作流
使用下面的 bash 代码块依次运行全部 4 项检查。每个代码块都会在全新的 shell 中运行,因此所有检查完成后,请根据收集到的终端输出编写日记摘要和注意事项汇总。
重要:写入日记前,先运行 date +"%Y%m%d"。
步骤 1:技能健康状况
扫描 ~/.claude/skills/,检查技能是否过时以及是否存在损坏的符号链接。
NOW=$(date +%s)
D30=$((NOW - 30*86400))
D90=$((NOW - 90*86400))
ACTIVE="" BROKEN=""
ACTIVE_N=0 RECENT_N=0 STALE_N=0 BROKEN_N=0 TOTAL=0
for entry in ~/.claude/skills/*/; do
[ -d "$entry" ] || continue
name=$(basename "$entry")
TOTAL=$((TOTAL + 1))
if [ -L "${entry%/}" ] && [ ! -e "${entry%/}" ]; then
target=$(readlink "${entry%/}")
BROKEN="${BROKEN} - ${name} -> ${target}\n"
BROKEN_N=$((BROKEN_N + 1))
continue
fi
real_path="$entry"
if [ -L "${entry%/}" ]; then
real_path="$(readlink "${entry%/}")/"
fi
newest=$(find "$real_path" -type f -exec stat -f %m {} + 2>/dev/null | sort -rn | head -1)
[ -z "$newest" ] && newest=0
if [ "$newest" -ge "$D30" ]; then
ACTIVE="${ACTIVE}, ${name}"
ACTIVE_N=$((ACTIVE_N + 1))
elif [ "$newest" -ge "$D90" ]; then
RECENT_N=$((RECENT_N + 1))
else
STALE_N=$((STALE_N + 1))
fi
done
echo "### Skills (${TOTAL} total)"
echo "- Active (30d): ${ACTIVE_N}${ACTIVE:+ — ${ACTIVE:2}}"
echo "- Recent (30-90d): ${RECENT_N}"
echo "- Stale (>90d): ${STALE_N}"
echo "- Broken symlinks: ${BROKEN_N}"
[ -n "$BROKEN" ] && printf "$BROKEN"
步骤 2:项目动态
扫描 ~/ai_projects/,检查 git 仓库活动情况以及是否存在 CLAUDE.md。休眠和已放弃项目列表最多显示 10 个名称,以保证输出清晰易读。
NOW=$(date +%s)
D30=$((NOW - 30*86400))
D180=$((NOW - 180*86400))
ACTIVE="" DORMANT="" ABANDONED="" DORMANT_N=0 ABANDONED_N=0 NO_CLAUDE=0
ACTIVE_N=0 GIT_TOTAL=0 DIR_TOTAL=0 NODATA=0
for dir in ~/ai_projects/*/; do
[ -d "$dir" ] || continue
DIR_TOTAL=$((DIR_TOTAL + 1))
[ -d "${dir}.git" ] || continue
GIT_TOTAL=$((GIT_TOTAL + 1))
last_commit=$(git -C "$dir" log -1 --format=%ct 2>/dev/null)
if [ -z "$last_commit" ]; then
NODATA=$((NODATA + 1))
continue
fi
name=$(basename "$dir")
if [ "$last_commit" -ge "$D30" ]; then
ACTIVE="${ACTIVE}, ${name}"
ACTIVE_N=$((ACTIVE_N + 1))
elif [ "$last_commit" -ge "$D180" ]; then
DORMANT_N=$((DORMANT_N + 1))
[ "$DORMANT_N" -le 10 ] && DORMANT="${DORMANT}, ${name}"
else
ABANDONED_N=$((ABANDONED_N + 1))
[ "$ABANDONED_N" -le 10 ] && ABANDONED="${ABANDONED}, ${name}"
fi
[ ! -f "${dir}CLAUDE.md" ] && NO_CLAUDE=$((NO_CLAUDE + 1))
done
DORMANT_SUFFIX=""
[ "$DORMANT_N" -gt 10 ] && DORMANT_SUFFIX=" and $((DORMANT_N - 10)) more"
ABANDONED_SUFFIX=""
[ "$ABANDONED_N" -gt 10 ] && ABANDONED_SUFFIX=" and $((ABANDONED_N - 10)) more"
echo ""
echo "### Projects (${DIR_TOTAL} dirs, ${GIT_TOTAL} git repos)"
echo "- Active (30d): ${ACTIVE_N}${ACTIVE:+ — ${ACTIVE:2}}"
echo "- Dormant (30-180d): ${DORMANT_N}${DORMANT:+ — ${DORMANT:2}${DORMANT_SUFFIX}}"
echo "- Abandoned (>6mo): ${ABANDONED_N}${ABANDONED:+ — ${ABANDONED:2}${ABANDONED_SUFFIX}}"
[ "$NODATA" -gt 0 ] && echo "- No data (empty/corrupt): ${NODATA}"
echo "- Missing CLAUDE.md: ${NO_CLAUDE}"
步骤 3:CLAUDE.md 漂移
检查 CLAUDE.md 文件相对于其项目最新提交是否已过时。使用 git 提交日期(而非文件系统修改时间),以确保准确性。
NOW=$(date +%s)
STALE_LIST="" STALE_N=0
UNTRACKED_LIST="" UNTRACKED_N=0
while IFS= read -r claude_file; do
project_dir=$(dirname "$claude_file")
while [ ! -d "${project_dir}/.git" ] && [ "$project_dir" != "$HOME/ai_projects" ]; do
project_dir=$(dirname "$project_dir")
done
[ -d "${project_dir}/.git" ] || continue
claude_commit=$(git -C "$project_dir" log -1 --format=%ct -- "$claude_file" 2>/dev/null)
project_commit=$(git -C "$project_dir" log -1 --format=%ct 2>/dev/null)
[ -z "$project_commit" ] && continue
if [ -z "$claude_commit" ]; then
rel_path="${claude_file#$HOME/}"
UNTRACKED_LIST="${UNTRACKED_LIST} - ~/${rel_path}\n"
UNTRACKED_N=$((UNTRACKED_N + 1))
continue
fi
diff=$((project_commit - claude_commit))
if [ "$diff" -gt $((90*86400)) ]; then
rel_path="${claude_file#$HOME/}"
claude_date=$(date -r "$claude_commit" +%Y-%m-%d)
project_date=$(date -r "$project_commit" +%Y-%m-%d)
STALE_LIST="${STALE_LIST} - ~/${rel_path} (last: ${claude_date}, project: ${project_date})\n"
STALE_N=$((STALE_N + 1))
fi
done < <(find ~/ai_projects -maxdepth 2 -name CLAUDE.md 2>/dev/null)
echo ""
echo "### CLAUDE.md Drift"
echo "- Stale instructions (>90d behind project): ${STALE_N}"
[ -n "$STALE_LIST" ] && printf "$STALE_LIST"
echo "- Untracked: ${UNTRACKED_N}"
[ -n "$UNTRACKED_LIST" ] && printf "$UNTRACKED_LIST"
步骤 4:Mac Mini 健康状况
通过 SSH 连接到 agents-mac-mini 并检查服务。使用 -T 避免伪终端,并使用 ECOSYS: 前缀过滤输出中的 iTerm 转义码。
Mac Mini 上的自定义服务使用各种前缀(com.server.*、com.telegram-agent.*、com.photopulse.*、com.health.*、com.temporal.*、ai.hermes.* 等),因此请统计所有非 Apple 的 LaunchAgents。
echo ""
echo "### Mac Mini"
MINI_OUTPUT=$(ssh -T -o ConnectTimeout=5 -o BatchMode=yes mac-mini 'export TERM=dumb; thumb=$(curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:8080/ 2>/dev/null); viz=$(curl -s --max-time 3 -o /dev/null -w "%{http_code}" http://localhost:8081/ 2>/dev/null); agents=$(launchctl list 2>/dev/null | tail -n +2 | awk "{print \$3}" | grep -cv "^com\.apple" || echo 0); hdb_size=$(stat -f %z ~/ai_projects/health-import/health.db 2>/dev/null || echo 0); echo "ECOSYS:${thumb}|${viz}|${agents}|${hdb_size}"' 2>/dev/null)
DATA=$(echo "$MINI_OUTPUT" | grep "^ECOSYS:" | sed 's/^ECOSYS://')
if [ -z "$DATA" ]; then
echo "- Status: UNREACHABLE (SSH failed)"
else
IFS='|' read -r THUMB VIZ AGENTS HDB_SIZE <<< "$DATA"
[ "$THUMB" = "200" ] && echo "- Thumb server (:8080): UP" || echo "- Thumb server (:8080): DOWN (${THUMB})"
[ "$VIZ" = "200" ] && echo "- Viz server (:8081): UP" || echo "- Viz server (:8081): DOWN (${VIZ})"
echo "- Custom LaunchAgents: ${AGENTS}"
if [ "$HDB_SIZE" -gt 0 ] 2>/dev/null; then
HDB_GB=$(echo "scale=1; ${HDB_SIZE}/1073741824" | bc)
echo "- Health DB: ${HDB_GB} GB"
else
echo "- Health DB: NOT FOUND"
fi
fi
步骤 5:注意事项摘要 + 日记
输出完整的终端报告后,添加注意事项摘要,突出显示需要采取行动的内容:
### Attention
- [list any: broken symlinks, services DOWN, stale CLAUDE.md, Mac Mini unreachable]
- If nothing needs attention: "All clear."
然后编写摘要并写入今天的日记。
先获取今天的日期:
TODAY=$(date +"%Y%m%d")
根据步骤 1-4 收集的结果构建摘要块(重新阅读上方的终端输出——变量不会在不同 bash 代码块之间保留)。格式如下:
## Ecosystem
Skills: N active / N recent / N stale / N broken
Projects: N active / N dormant / N abandoned
CLAUDE.md drift: N stale, N untracked
Mac Mini: [status summary]
_Ecosystem audit · YYYY-MM-DD_
写入 ~/Brains/brain/Daily/${TODAY}.md:
- 如果已存在
## Ecosystem小节,则替换从## Ecosystem到下一个##标题(或- - -分隔符)之间的所有内容 - 如果不存在,则插入到第一个
- - -分隔符之前 - 如果存在任何警示(损坏的符号链接 > 0、服务停机、过时的 CLAUDE.md > 3),则在前面添加
> [!warning] Ecosystem issues detected