mcpField
E
ecosystem

ecosystem

github.com/glebisエージェントワークフロー401111 回インストール1 日前に更新
リポジトリ

ecosystem について

Claude Code エコシステムをオンデマンドで監査するスキルです。スキルの鮮度、プロジェクトの活動状況、CLAUDE.md のずれ、Mac Mini のサービスを確認し、問題を報告して日次ノートに要約を追記します。

主な機能

  1. 01スキルの鮮度とリンク切れの確認
  2. 02プロジェクト活動の確認
  3. 03古い、未追跡の CLAUDE.md の検出
  4. 04SSH 経由の Mac Mini サービス確認
  5. 05エコシステム概要の日次ノート記録

活用シーン

  1. 01Claude Code スキルの状態確認
  2. 02休止プロジェクトや古い手順書の発見
  3. 03リモート Mac Mini のサービス状態確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/glebis/claude-skills --skill ecosystem

インストール後、Claude Code で/ecosystemを入力して読み込まれたか確認します。

詳細

エコシステム監査

Claude Code エコシステムをオンデマンドで監査します。4 つのチェックを実行し、注意事項の概要を含む完全なレポートを出力して、今日の日次ノートに概要を追記します。

ワークフロー

以下の bash ブロックを使って、4 つのチェックを順番にすべて実行します。各ブロックは新しいシェルで実行されるため、すべてのチェックが完了したら、収集したターミナル出力から日次ノートの概要と注意事項のまとめを作成します。

重要:日次ノートに書き込む前に、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:プロジェクトの動向

Git リポジトリのアクティビティと CLAUDE.md の有無を調べるため、~/ai_projects/ をスキャンします。出力を読みやすく保つため、休眠中および放棄されたプロジェクトの一覧はそれぞれ最大 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 ファイルが、プロジェクトの最新コミットに対して古くなっていないか確認します。正確性を保つため、ファイルシステムの mtime ではなく、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 の健全性

agents-mac-mini に SSH 接続して、サービスを確認します。疑似 TTY を避けるために -T を使い、出力から iTerm のエスケープコードを除外するために ECOSYS: プレフィックスを使います。

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 を先頭に追加します

コメント