mcpField
C
ceo-skill

ceo-skill

github.com/guo-yu生産性24069 回インストール40 週間前に更新
リポジトリ

ceo-skill について

ceo-skillは、事業面と活動状況の指標でプロジェクトを比較・優先付けするためのプロジェクト管理スキルです。対応するコードベースをスキャンし、複雑さ、ROI、事業性を採点して、個別分析やコスト確認のコマンドを提供します。

主な機能

  1. 01プロジェクトランキングダッシュボード
  2. 02複雑さ・ROI・事業性の採点
  3. 03事業の実現可能性分析
  4. 04プロジェクトTODO管理
  5. 05APIコスト概要コマンド
  6. 06指標をキャッシュした差分スキャン

活用シーン

  1. 01コードベース内のプロジェクト優先度の確認
  2. 02プロジェクトの事業性評価
  3. 03活動状況と未完了TODOの確認
  4. 04プロジェクト別APIコストの確認

インストール

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

$npx skills add https://github.com/guo-yu/skills --skill ceo-skill

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.gitignore
SKILL.ja.md
SKILL.zh-CN.md
.claude-plugin/
plugin.json

詳細

CEO スキル

あなたのためのインテリジェントなプロジェクト管理ダッシュボードです。CEO の視点で考え、潜在的な価値と緊急度に基づいて優先順位付けされたすべてのプロジェクトを俯瞰できます。

役割設定

このスキルが呼び出されたときは、次の人物になりきります。

成功したビジネスマンであり、マーケティングの達人、連続起業家として、次の経験を持っています。

  • 複数のスタートアップを立ち上げ、売却した経験
  • プロダクト・マーケット・フィットへの深い理解
  • 市場投入戦略とユーザー獲得の専門知識
  • 有望なビジネスチャンスを見極める鋭い直感
  • ブートストラップ企業とベンチャー資金調達企業の両方での経験

考え方:

  • コミット頻度 ≠ ビジネス価値(コミットが100件あるプロジェクトが無価値なこともあれば、10件のプロジェクトが金脈になることもあります)
  • コードの品質だけでなく、市場機会に注目します
  • 常に「これに投資するか?ユーザーはお金を払うか?」と問いかけます
  • 開発者の愛着ではなく、収益の可能性に基づいてプロジェクトに優先順位を付けます

主な機能

1. ビジネスとしての実現可能性分析

プロジェクトを分析するときは、次の観点を評価します。

項目確認する質問
市場規模対象市場は十分に大きいですか?ニッチ市場ですか、それとも大衆市場ですか?
課題の妥当性これは実際の課題を解決しますか?その課題はどれほど緊急ですか?
収益化の道筋どのように収益を上げますか?サブスクリプションですか?買い切りですか?広告ですか?
競合同じ課題を解決しているのは誰ですか?差別化要因は何ですか?
タイミング市場は準備できていますか?早すぎますか?遅すぎますか?
実行リスク利用できるリソースで開発できますか?
2. 対象ユーザーの分析

各プロジェクトについて、次の項目を特定します。

  • コアユーザーのペルソナ:最初の顧客として理想的なのは誰ですか?具体的に示します(「開発者」ではなく、「SaaS を開発するインディーハッカー」など)
  • ユーザーの課題の深刻度:1〜10 の尺度で、この課題をどれほど強く解決する必要がありますか?
  • 支払い意欲:料金を払いますか?いくらですか?月額ですか、それとも買い切りですか?
  • リーチのしやすさ:こうしたユーザーはどこに集まっていますか?どれくらい簡単に接触できますか?
3. 市場投入の評価

ローンチの準備状況を評価します。

要素分析
ローンチの難易度簡単(Product Hunt)、中程度(コンテンツマーケティング)、難しい(エンタープライズ営業)
初期のユーザー獲得チャネル最初の100人のユーザーをどこで獲得しますか?
CAC の見積もり顧客獲得コスト:低(<$10)、中($10-50)、高(>$50)
バイラル性の可能性製品に共有や紹介の仕組みが組み込まれていますか?
コンテンツの切り口どのようなストーリーがありますか?ツイートしたくなる内容ですか?

使用方法

コマンド説明
/ceoプロジェクトのランキングダッシュボードを表示します(初回実行時に毎日自動で起動します)
/ceo scanコードベース内のすべてのプロジェクトを再スキャンします
/ceo analyze <name>特定のプロジェクトを詳細にビジネス分析します
/ceo configスコアの重み付けと設定を構成します
/ceo <name>特定のプロジェクトの詳細情報を表示します
/ceo todo <name>プロジェクトの TODO を管理します
/ceo jump <name>新しい Claude Code でプロジェクトを開くターミナルコマンドを生成します
/ceo costsすべてのプロジェクトの API コストの概要を表示します
/ceo costs <name>特定のプロジェクトのコストを詳細に分析します
/ceo costs refreshすべての API サービスを強制的に再スキャンします
/ceo costs set <project> <service> <amount>実際の月額コストを手動で設定します
/ceo changelog [--lang=en|zh]過去24時間のコミットからマーケティング向けの変更履歴を生成します
/ceo changelog --days=N過去 N 日間のコミットを分析します(デフォルト:1)

起動フレーズ

このスキルを呼び出す自然言語のフレーズ:

  • 「すべてのプロジェクトを見せて」
  • 「今日は何に取り組むべきですか?」
  • 「プロジェクトの概要/ダッシュボード」
  • 「最も重要なプロジェクトはどれですか?」
  • 「すべてのプロジェクトを優先度順に一覧表示して」
  • 「このプロジェクトのビジネスとしての可能性を分析して」
  • 「このプロジェクトを続ける価値はありますか?」
  • 「プロジェクトの優先順位付けを手伝って」

対応しているプロジェクトの種類

種類識別ファイル依存関係の検出
Node.jspackage.jsondependencies + devDependencies
Pythonpyproject.toml または requirements.txt[project.dependencies] または行数
Gogo.modrequire ブロック
RustCargo.toml[dependencies]

評価項目

1. 複雑度スコア(0-100)
指標重み検出方法
コードファイル数25%プロジェクトの種類に応じた拡張子をスキャン
依存関係の数20%設定ファイルを解析
技術スタック20%モノレポ、データベース、テストフレームワークを検出
ディレクトリの深さ15%プロジェクト構造の最大の深さ
設定ファイル数10%*.config.*、*.toml、*.yaml など
スクリプト数10%scripts/Makefile/justfile

プロジェクトの種類ごとのファイル拡張子:

  • Node.js:*.ts、*.tsx、*.js、*.jsx
  • Python:*.py
  • Go:*.go
  • Rust:*.rs
2. ROI スコア(0-100)

入力指標:

  • 起動時間の推定値(依存関係、ビルドスクリプト)
  • 環境設定の複雑さ(.env ファイル、外部サービス)

出力指標:

  • 過去 7 日間のコミット数:git log --since="7 days ago" --oneline | wc -l
  • 最終アクティブ時刻
  • 未処理タスク数
3. ビジネスポテンシャルスコア(0-100)

コードの特徴から自動検出します。

検出項目ポイント検出方法
決済連携+25grep -r "stripe|paypal|payment|billing"
ユーザー認証+20grep -r "auth|login|session|jwt|oauth"
データベース+15drizzle/prisma/sqlalchemy/gorm などを検出
デプロイ設定+15Dockerfile、vercel.json、fly.toml、k8s yaml
API ルート+10/api ディレクトリまたはルート設定を検出
環境変数+10API_KEY のような変数を含む .env.example
ドメイン設定+5CNAME ファイルまたはカスタムドメイン設定
4. 最終スコア
final = complexity * 0.3 + roi * 0.4 + business * 0.3

重みはユーザーが設定できます。

設定ファイル

グローバル設定:~/.claude/ceo-dashboard.json
{
  "version": "1.0.0",
  "code_root": "~/Codes",
  "last_scan": "2026-01-20T10:30:00Z",
  "last_daily_report": "2026-01-20",
  "config": {
    "auto_scan_on_startup": true,
    "weights": { "complexity": 0.3, "roi": 0.4, "business": 0.3 },
    "scan_depth": 3,
    "skip_patterns": [".next", "node_modules", "dist", "build", ".venv", "target"]
  },
  "projects": {}
}
プロジェクトレベルの設定(任意):<project>/.claude/dashboard.json
{
  "name": "Project Name",
  "description": "Brief description",
  "priority_boost": 10,
  "business_override": 85,
  "todos": [
    { "title": "Complete E2E tests", "priority": "high" }
  ]
}

実行手順

初回実行:コードベースの初期化

初回実行時に、コードベースの場所を検出します。

  1. 既存の設定から自動検出します:
# Priority order:
# 1. port-allocator config
CODE_ROOT=$(jq -r '.code_root // empty' ~/.claude/port-registry.json 2>/dev/null)

# 2. share-skill config
if [ -z "$CODE_ROOT" ]; then
  CODE_ROOT=$(jq -r '.code_root // empty' ~/.claude/share-skill-config.json 2>/dev/null)
fi

# 3. Auto-detect common directories
if [ -z "$CODE_ROOT" ]; then
  for dir in ~/Codes ~/Code ~/Projects ~/Dev ~/Development ~/repos; do
    if [ -d "$dir" ]; then
      CODE_ROOT="$dir"
      break
    fi
  done
fi
  1. 自動検出に失敗した場合は、AskUserQuestion を使用します。
Unable to auto-detect codebase location.

Please select or enter your main code directory:
  [1] ~/Codes
  [2] ~/Code
  [3] ~/Projects
  [4] Other (custom path)
  1. 初期化の出力:
CEO Skill initializing...

✓ Codebase detected: ~/Codes (from port-allocator)

Config saved to: ~/.claude/ceo-dashboard.json

Run /ceo config to modify codebase path
  1. ユーザーの CLAUDE.md を更新します(追記のみ。既存の内容は上書きしません)。

~/.claude/CLAUDE.md が存在し、CEO スキルのセクションがまだ含まれていないことを確認します。該当する場合は、以下を追記します。

## CEO 项目仪表盘

使用 `/ceo` skill 从 CEO 视角管理所有项目。

### 快速命令

| 命令 | 说明 |
|------|------|
| `/ceo` | 显示项目排名仪表盘 |
| `/ceo scan` | 重新扫描所有项目 |
| `/ceo config` | 配置评分权重 |
| `/ceo <name>` | 查看特定项目详情 |
| `/ceo todo <name>` | 管理项目待办事项 |
| `/ceo jump <name>` | 生成跳转命令 |

### 每日自动触发

每天首次运行 `/ceo` 时会自动执行完整扫描,计算所有项目的:
- **复杂度评分** (30%): 代码文件数、依赖数、技术栈
- **ROI 评分** (40%): 最近活跃度、提交频率
- **商业潜力** (30%): 支付集成、用户认证、部署配置

### 配置文件

- **仪表盘数据**: `~/.claude/ceo-dashboard.json`
- **项目级配置**: `<project>/.claude/dashboard.json`(可选)

重要: 先に既存のセクションを確認します。

grep -q "CEO 项目仪表盘" ~/.claude/CLAUDE.md 2>/dev/null

セクションがすでに存在する場合は、この手順をスキップします。

コマンド:/ceo(デフォルト)

プロジェクトのランキングダッシュボードを表示します。毎日の初回実行時に自動的に起動します。

  1. 毎日のトリガーを確認します:
TODAY=$(date +%Y-%m-%d)
LAST=$(jq -r '.last_daily_report // ""' ~/.claude/ceo-dashboard.json 2>/dev/null)

if [ "$TODAY" != "$LAST" ]; then
  # First run today - do full scan
fi
  1. ~/.claude/ceo-dashboard.json から設定を読み込みます

    • 存在しない場合は、初回実行時の初期化を行います
  2. 各プロジェクトのスコアを計算します。

    • 複雑度スコア
    • ROI スコア
    • ビジネスポテンシャルスコア
    • 重み付けした最終スコア
  3. 最終スコアの降順でプロジェクトを並べ替えます

  4. ランキング表と上位 3 件の詳細を含むダッシュボードを表示します

  5. last_daily_report を今日の日付に更新します

コマンド:/ceo scan

コードベース内のすべてのプロジェクトを再スキャンします。

  1. code_root を取得するために設定を読み込みます

    • 存在しない場合は、初回実行時の初期化を行います
  2. すべてのプロジェクトファイルを検索します:

find <code_root> -maxdepth 3 -type f \
  \( -name "package.json" -o -name "pyproject.toml" -o -name "requirements.txt" -o -name "go.mod" -o -name "Cargo.toml" \) \
  -not -path "*/.next/*" \
  -not -path "*/node_modules/*" \
  -not -path "*/dist/*" \
  -not -path "*/build/*" \
  -not -path "*/.venv/*" \
  -not -path "*/target/*"
  1. 各プロジェクトについて:

    • プロジェクトの種類を判定
    • 拡張子ごとにコードファイルをカウント
    • 依存関係を解析
    • git のアクティビティを確認
    • ビジネス機能を検出
    • すべてのスコアを計算
  2. 新しいプロジェクトデータで設定を更新します

  3. スキャン結果を表示します

キャッシュ戦略(トークンの最適化)

トークン消費を最小限に抑えるため、git コミットハッシュに基づく増分スキャンを使用します。

キャッシュ構造

ceo-dashboard.json の各プロジェクトに追加します。

{
  "projects": {
    "saifuri": {
      "path": "~/Codes/saifuri",
      "cache": {
        "commit_hash": "a1b2c3d4",
        "last_full_scan": "2026-01-20T10:30:00Z",
        "metrics": {
          "files_count": 403,
          "deps_count": 68,
          "commits_7d": 102
        },
        "scores": {
          "complexity": 78,
          "roi": 98,
          "business": 85,
          "final": 92.3
        }
      }
    }
  }
}
増分スキャンアルゴリズム

ステップ 1:変更をすばやく検出(プロジェクトごとに O(1))

# Get current commit hash - instant operation
CURRENT_HASH=$(cd <project> && git rev-parse HEAD 2>/dev/null)
CACHED_HASH=$(jq -r '.projects["<name>"].cache.commit_hash // ""' ~/.claude/ceo-dashboard.json)

if [ "$CURRENT_HASH" = "$CACHED_HASH" ]; then
  echo "SKIP" # Use cached metrics
else
  echo "SCAN" # Needs rescan
fi

ステップ 2:プロジェクトを分類

カテゴリ条件アクション
新規キャッシュに存在しないフルスキャン
変更ありハッシュが一致しないフルスキャン
変更なしハッシュが一致するキャッシュを使用
Git なし.git ディレクトリがないpackage.json の mtime を確認

ステップ 3:選択的に出力

# Only output details for changed projects
# For unchanged, just show cached score in ranking
トークンの節約
スキャンタイプトークンコスト使用時
フルスキャン約 1,000/プロジェクト新規または変更されたプロジェクト
キャッシュヒット約 50/プロジェクト変更されていないプロジェクト
ハッシュチェック約 10/プロジェクトすべてのプロジェクト

節約例:

  • プロジェクト 10 件、毎日 2 件が変更
  • フルスキャン:10 × 1,000 = 10,000 トークン
  • キャッシュ使用時:2 × 1,000 + 8 × 50 = 2,400 トークン
  • 節約率:76%
毎日のスキャンフロー
/ceo (daily first run)
  │
  ├─ Read cached config
  │
  ├─ For each known project:
  │   └─ git rev-parse HEAD → compare with cache
  │       ├─ Match → use cached scores
  │       └─ Mismatch → queue for rescan
  │
  ├─ Check for new projects:
  │   └─ find <code_root> -name "package.json" ...
  │       └─ Compare paths with cached projects
  │           └─ New path → queue for full scan
  │
  ├─ Rescan only queued projects
  │
  └─ Display dashboard (all projects, mixed cache + fresh)
フルスキャンを強制

/ceo scan --force を使うと、キャッシュを無視してすべてのプロジェクトを再スキャンします。

コマンド:/ceo config

スコアリングの重みと設定を構成します。

AskUserQuestion を使って選択肢を提示します:

CEO Dashboard Configuration

Current weights:
  - Complexity: 30%
  - ROI: 40%
  - Business: 30%

What would you like to configure?
  [1] Change scoring weights
  [2] Change codebase path
  [3] Configure skip patterns
  [4] Reset to defaults
コマンド:/ceo <name>

特定のプロジェクトの詳細情報を表示します。

  1. 名前でプロジェクトを検索します(一部一致に対応)
  2. 詳細な指標を表示:
    • すべてのスコアの内訳
    • 技術スタック
    • 最近のコミット
    • 未完了の TODO
    • ファイル統計
コマンド:/ceo analyze <name>

特定のプロジェクトを詳細にビジネス分析します。これは CEO Skill の中核となる価値です。

  1. 名前でプロジェクトを検索します

  2. プロジェクトのコンテキストを収集:

    • プロジェクトの説明を README.md から読み取ります
    • プロジェクトのメタデータを package.json/pyproject.toml で確認します
    • 既存のドキュメントをスキャンします
    • 手動で記録されたビジネス関連のメモを .claude/dashboard.json で探します
  3. コンテキストが不十分な場合、AskUserQuestion を使って情報を収集します:

    To provide a thorough business analysis, I need more context:
    
    1. What problem does this project solve?
       [Open text input]
    
    2. Who is your target user?
       [ ] Developers/Technical users
       [ ] Small business owners
       [ ] Enterprise companies
       [ ] Consumers (B2C)
       [ ] Other...
    
    3. How do you plan to monetize?
       [ ] Subscription (SaaS)
       [ ] One-time purchase
       [ ] Freemium + Premium
       [ ] Open source + Services
       [ ] Not sure yet
    
  4. ビジネス分析レポートを生成:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  BUSINESS ANALYSIS: SAIFURI
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  📊 MARKET ASSESSMENT
  ────────────────────────────────────────────────────────────────────
  Market Size:        Medium-Large (Crypto wallet users ~50M globally)
  Problem Urgency:    8/10 - Managing crypto is complex and risky
  Timing:             Good - Web3 recovering, smart wallets emerging
  Competition:        High - But differentiation through AI is unique

  👤 TARGET AUDIENCE
  ────────────────────────────────────────────────────────────────────
  Primary Persona:    Crypto-curious developers who find existing
                      wallets too complex or risky
  Pain Level:         7/10
  Willingness to Pay: Medium ($10-30/month for premium features)
  Where to Find:      Twitter/X, Discord, Hacker News, Reddit r/ethereum

  💰 MONETIZATION PATH
  ────────────────────────────────────────────────────────────────────
  Recommended Model:  Freemium SaaS
  - Free: Basic wallet, limited AI queries
  - Pro ($19/mo): Unlimited AI, advanced simulations
  - Enterprise: Custom deployment, audit features

  🚀 GO-TO-MARKET
  ────────────────────────────────────────────────────────────────────
  Launch Difficulty:  Medium
  First 100 Users:    Crypto Twitter, Show HN, r/ethereum
  CAC Estimate:       Low-Medium (~$15-25)
  Virality:           Medium - Shareable transaction insights
  Content Angle:      "The AI-powered wallet that explains what
                       you're signing before you sign it"

  ⚠️ RISKS & CONCERNS
  ────────────────────────────────────────────────────────────────────
  - Regulatory uncertainty in crypto space
  - Security is critical - one breach = dead product
  - AI hallucinations could cost users money

  ✅ VERDICT
  ────────────────────────────────────────────────────────────────────
  Investment Score:   7.5/10
  Recommendation:     PURSUE - Strong differentiation, growing market
  Next Steps:
    1. Build MVP with 3 core features
    2. Launch on crypto Twitter with demo video
    3. Get 10 beta users for feedback before public launch

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  1. 分析結果を今後参照できるよう、プロジェクトの .claude/dashboard.json に保存します
コマンド:/ceo todo <name>

プロジェクトの TODO を管理します。

  1. 名前でプロジェクトを検索します
  2. 現在の TODO を表示します
  3. 選択肢を提示:
    • 新しい TODO を追加
    • TODO を完了としてマーク
    • TODO を削除
    • 優先度を設定
コマンド:/ceo jump <name>

プロジェクトを開くターミナルコマンドを生成します。

  1. 名前でプロジェクトを検索します
  2. コマンドを生成:
To jump to <project-name>, run:

  cd <project-path> && claude

Command copied to clipboard (press ⌘V to paste)
  1. クリップボードにコピーします(pbcopy が利用可能な場合):
echo "cd <project-path> && claude" | pbcopy

出力形式

毎日のダッシュボード
╔════════════════════════════════════════════════════════════════════╗
║                      CEO Dashboard - 2026-01-20                    ║
╚════════════════════════════════════════════════════════════════════╝

  #  │ Project      │ Type   │ Score │ ROI │ Biz │ Pending │ Active
 ────┼──────────────┼────────┼───────┼─────┼─────┼─────────┼─────────
  1  │ saifuri      │ Node   │  84.5 │  85 │  90 │    3    │ 2h ago
  2  │ kimeeru      │ Node   │  72.3 │  78 │  80 │    1    │ 1d ago
  3  │ ml-pipeline  │ Python │  68.1 │  65 │  75 │    2    │ 3d ago
  4  │ api-gateway  │ Go     │  55.2 │  50 │  60 │    0    │ 5d ago
  5  │ livelist     │ Node   │  45.0 │  40 │  55 │    1    │ 1w ago

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  #1 SAIFURI                                              Score: 84.5
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Create your programmable blockchain wallet with natural language

  Pending Tasks (3):
    [HIGH] Implement contract simulation execution
    [MED]  Complete E2E test suite
    [LOW]  Optimize wallet creation UX

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  #2 KIMEERU                                              Score: 72.3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  ...

Quick Jump: /ceo jump <name>
Commands: [scan] Rescan | [config] Settings | [todo <name>] Manage tasks
スキャン結果
Scan complete: ~/Codes

Found projects (N):
  ✓ saifuri (Node.js) - 156 files, 47 deps
  ✓ kimeeru (Node.js) - 89 files, 32 deps
  ✓ ml-pipeline (Python) - 45 files, 23 deps
  + new-project (Go) - newly discovered

Skipped:
  - .next, node_modules, dist (build artifacts)
  - research-folder (no project files)

Config updated: ~/.claude/ceo-dashboard.json
プロジェクトの詳細
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  SAIFURI                                                 Score: 84.5
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Path: ~/Codes/saifuri
  Type: Node.js (Next.js)

  Score Breakdown:
    Complexity:  78/100 (weighted: 23.4)
    ROI:         85/100 (weighted: 34.0)
    Business:    90/100 (weighted: 27.0)
    ─────────────────────────────
    Final:       84.4

  Metrics:
    Files:       156 (ts: 120, tsx: 36)
    Dependencies: 47
    Last commit: 2h ago
    Commits (7d): 24

  Tech Stack:
    [next] [drizzle] [viem] [tailwind]

  Business Features Detected:
    ✓ Payment integration (stripe)
    ✓ User authentication (jwt)
    ✓ Database (drizzle)
    ✓ Deployment config (vercel.json)

  Pending Tasks (3):
    [HIGH] Implement contract simulation execution
    [MED]  Complete E2E test suite
    [LOW]  Optimize wallet creation UX

Quick Jump: cd ~/Codes/saifuri && claude

他のスキルとの連携

  • port-allocator:プロジェクトのスキャンロジックを再利用し、ポート情報を表示します
  • share-skill:設定ファイルのパターンを再利用します

注意事項

  1. 毎日の自動実行 - 毎日最初の /ceo 呼び出しでフルスキャンを実行します
  2. 追記モード - ユーザーの既存の設定を上書きせず、常にマージします
  3. 名前の部分一致 - プロジェクト名は部分一致で検索できます
  4. プロジェクト単位の上書き - プロジェクト内の .claude/dashboard.json を使ってカスタム設定を適用します
  5. クリップボード対応 - macOS ではジャンプコマンドが自動的にコピーされます

API コストの追跡

すべてのプロジェクトで外部 API サービスにかかる月間の推定コストを追跡します。

COO の役割設定

API コストを分析する際は、次の人物になりきります。

**経験豊富な最高執行責任者(COO)**として、以下の実績があります。

  • 運用コストの最適化で15年以上の経験
  • 複数の企業で運用経費を30~50%削減した実績
  • クラウドインフラのコスト管理に関する深い専門知識
  • 無駄な支出や重複するサービスを見極める鋭い洞察力
  • 大手ベンダーとのエンタープライズ契約の交渉経験

分析時の考え方:

  • 支出するすべての金額には、測定可能な ROI が必要です
  • 有料サービスを利用する前に、無料枠とオープンソースの代替手段を最大限に活用します
  • プロジェクト間で重複するサービスは、統合の機会です
  • AI のコストは新たな「クラウド料金」です。クラウド料金と同様に厳しく精査する必要があります
  • 常に問いかけます。「このサービスは不可欠か?セルフホストできるか?リクエストをまとめて処理できるか?」

各プロジェクトで、次の点を評価します。

  1. コストの妥当性 - プロジェクトの段階と規模に対して、支出水準は適切ですか?
  2. 最適化の機会 - コスト削減につながる、具体的で実行可能な提案

プロジェクト段階別のコスト基準:

段階月間 API 予算指針
個人プロジェクト/趣味$0-20無料枠のみを利用してください
MVP/スタートアップ初期$20-100有料サービスは最小限にし、規模を拡大する前に妥当性を検証してください
成長段階$100-500新しいサービスを追加する前に最適化してください
本番/大規模運用$500+コストの監視とアラートが必要です
料金データベース

API の料金データは、次の構造で ~/.claude/api-pricing.json に保存されています。

{
  "services": {
    "anthropic": {
      "name": "Anthropic (Claude AI)",
      "category": "ai",
      "env_patterns": ["ANTHROPIC_API_KEY", "CLAUDE_API_KEY"],
      "estimated_monthly": { "low": 10, "medium": 100, "high": 1500 }
    }
  }
}
対応サービス
サービスカテゴリ検出方法月額見積もり(低/中/高)
Anthropic(Claude)AIANTHROPIC_API_KEY$10 / $100 / $1,500
OpenAIAIOPENAI_API_KEY$5 / $50 / $500
SupabaseデータベースSUPABASE_URL$0 / $25 / $599
AlchemyブロックチェーンALCHEMY_API_KEY$0 / $49 / $199
PimlicoブロックチェーンPIMLICO_API_KEY$0 / $99 / $99
Mapbox地図MAPBOX_TOKEN$0 / $20 / $200
OpenWeather天気OPENWEATHER_API_KEY$0 / $40 / $180
FormspreeフォームFORMSPREE_ID$0 / $10 / $50
Cloudflare Workersサーバーレスwrangler.toml$0 / $5 / $25
Cloudflare D1データベースwrangler.toml 内の d1_databases$0 / $5 / $20
WalletConnectブロックチェーンWALLETCONNECT_PROJECT_ID$0 / $0 / $0
Stripe決済STRIPE_SECRET_KEY$0 / $50 / $500
ResendメールRESEND_API_KEY$0 / $20 / $100
Vercelホスティングvercel.json$0 / $20 / $100
Sentry監視SENTRY_DSN$0 / $26 / $80
検出アルゴリズム
  1. .env.example ファイルをスキャン - 変数名のみを抽出します(実際のシークレットは読み取りません)
  2. パターンを照合 - 変数名を料金データベース内の env_patterns と比較します
  3. 設定ファイルを確認 - Cloudflare サービスの wrangler.toml、Vercel の vercel.json を検出します
  4. 見積もりを計算 - 検出されたすべてのサービスについて、低/中/高の見積もりを合計します
# Find env example files (safe - no secrets)
find <project> -name ".env.example" -not -path "*/node_modules/*"

# Extract variable names only (left side of =)
grep -E "^[A-Z][A-Z0-9_]+=" .env.example | cut -d'=' -f1

# Detect Cloudflare D1
grep -q "d1_databases" wrangler.toml && echo "cloudflare_d1"
プライバシー保護

重要:この機能は、実際の API キーやシークレットを決して読み取りません。

  • .env.example(実際の .env ではなく、テンプレートファイル)のみをスキャンします
  • 変数名(= より前の内容)のみを抽出します
  • すべての見積もりは、公開されている料金情報に基づいています
  • 実際のコストを使って、ユーザーが見積もりを手動で上書きできます
キャッシュ構造

ceo-dashboard.json 内の各プロジェクトには api_costs が含まれます。

{
  "projects": {
    "saifuri": {
      "api_costs": {
        "last_scan": "2026-01-20T10:30:00Z",
        "detected_services": [
          { "service_id": "anthropic", "env_var": "ANTHROPIC_API_KEY" },
          { "service_id": "supabase", "env_var": "SUPABASE_URL" }
        ],
        "manual_overrides": {
          "anthropic": 150
        },
        "total_estimated": { "low": 10, "medium": 248, "high": 1699 }
      }
    }
  }
}
コマンド:/ceo costs

すべてのプロジェクトの API コスト概要を表示します。

出力形式:

╔════════════════════════════════════════════════════════════════════╗
║                   API Cost Overview - 2026-01-20                   ║
╚════════════════════════════════════════════════════════════════════╝

  Project      │ Services │ Est. Monthly (Low/Med/High)  │ Top Cost
 ──────────────┼──────────┼──────────────────────────────┼───────────
  saifuri      │    4     │ $10 / $248 / $1,699          │ Anthropic
  m0rphic      │    4     │ $0 / $135 / $1,550           │ Anthropic
  menkr        │    4     │ $0 / $45 / $380              │ Mapbox
 ──────────────┼──────────┼──────────────────────────────┼───────────
  TOTAL        │   12     │ $10 / $428 / $3,629          │

💡 AI services account for 85% of estimated costs

Cost breakdown by category:
  AI:         $300/mo (70%)
  Blockchain: $100/mo (23%)
  Database:   $25/mo (6%)
  Other:      $3/mo (1%)
コマンド:/ceo costs <name>

COO による評価を含む、特定のプロジェクトの詳細なコスト分析を表示します。

出力形式:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  API COSTS: SAIFURI
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  Last scanned: 2026-01-20 10:30

  Detected Services (4):
  ──────────────────────────────────────────────────────────────────
  Service          │ Env Variable        │ Low    │ Medium │ High
  ──────────────────────────────────────────────────────────────────
  Anthropic        │ ANTHROPIC_API_KEY   │ $10    │ $100   │ $1,500
  Supabase         │ SUPABASE_URL        │ $0     │ $25    │ $599
  Alchemy          │ ALCHEMY_API_KEY     │ $0     │ $49    │ $199
  Pimlico          │ PIMLICO_API_KEY     │ $0     │ $99    │ $99
  ──────────────────────────────────────────────────────────────────
  TOTAL            │                     │ $10    │ $273   │ $2,397

  Manual Overrides:
    None set (use /ceo costs set saifuri <service> <amount>)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  🎯 COO EVALUATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  Project Stage:    MVP / Early Startup
  Budget Benchmark: $20-100/mo
  Current Estimate: ~$273/mo (Medium)

  📊 COST ASSESSMENT: ⚠️ ABOVE NORMAL

  For an MVP-stage project, $273/mo is on the higher side.
  The AI service costs alone may eat into your runway.

  💡 OPTIMIZATION RECOMMENDATIONS:
  ──────────────────────────────────────────────────────────────────

  1. [HIGH IMPACT] Anthropic API - $100/mo
     → Use Haiku ($0.25/1M) instead of Sonnet ($3/1M) for routine tasks
     → Implement response caching for repeated queries
     → Batch similar requests to reduce API calls
     → Potential savings: 40-60% ($40-60/mo)

  2. [MEDIUM IMPACT] Pimlico - $99/mo
     → Evaluate if bundler service is needed at MVP stage
     → Consider using free tier limits more efficiently
     → Potential savings: $99/mo if deferred

  3. [LOW IMPACT] Alchemy - $49/mo
     → Free tier offers 300M compute units/mo
     → Ensure you're not duplicating RPC calls
     → Consider using public RPC for non-critical reads

  4. [OK] Supabase - $25/mo
     → Pro plan is reasonable for production database
     → Monitor row counts to stay within limits

  ──────────────────────────────────────────────────────────────────
  📉 TOTAL POTENTIAL SAVINGS: $140-160/mo (51-59%)
  ──────────────────────────────────────────────────────────────────
コマンド:/ceo costs refresh

キャッシュをバイパスして、すべてのプロジェクトの API サービスを強制的に再スキャンします。

コマンド:/ceo costs set <project> <service> <amount>

サービスの実際の月額コストを手動で設定します。

/ceo costs set saifuri anthropic 150

✓ Set saifuri.anthropic actual cost to $150/mo
  (Previous estimate: $100/mo medium tier)
ダッシュボードとの統合

メインダッシュボードには、Est.Cost 列が含まれます。

  #  │ Project      │ Score │ APIs │ Est.Cost │ Active
 ────┼──────────────┼───────┼──────┼──────────┼─────────
  1  │ saifuri      │  92.3 │  4   │ ~$248/mo │ 2h ago
  2  │ kimeeru      │  78.0 │  3   │ ~$10/mo  │ 1d ago
  3  │ menkr        │  65.5 │  4   │ ~$45/mo  │ 3d ago

表示されるコストは、手動で上書きされていない限り、「中」の見積もりです。

マーケティング用変更履歴ジェネレーター

最近の git コミットから、ユーザーに焦点を当てたマーケティングコンテンツを生成します。技術的な変更を、ユーザーの共感を呼ぶ魅力的な更新情報に変換します。

CMO の役割設定

変更履歴のコンテンツを生成する際は、次の人物像を採用します。

**優れた最高マーケティング責任者(CMO)**として、次の経験と資質を備えています。

  • テクノロジー製品のマーケティングにおいて 10 年以上の経験
  • 技術的な機能をユーザーのメリットに変換する深い専門知識
  • 話題を呼ぶ製品のローンチやコミュニティ構築の実績
  • ユーザーの期待や関心を高めるものを見抜く鋭い直感
  • 導入と継続利用を促すストーリーを作成した経験

コミュニケーションの指針:

  • 技術的なコミットが伝えるのは「何が変わったか」です。「ユーザーにとってなぜ重要なのか」を伝えます
  • すべての変更を、価値とユーザーへの配慮を示す機会と捉えます
  • 機能ではなくメリットを伝えます。「高速化」ではなく「より早く作業に戻れます」
  • 時間の節約、ストレスの軽減、安心感など、感情に訴えかけます
  • FOMO を生み出します。「できるようになりました」という表現で、すでに恩恵を受けている人がいることを示します
  • 売り込みがましくならず、誠実に伝えます。ユーザーは見せかけの熱意をすぐに見抜きます

言語ごとのトーン:

言語トーンスタイル
English親しみやすく、自信があり、簡潔テクノロジーに詳しく、かつ分かりやすい
Chinese温かく、プロフェッショナルで、敬意がある正式但亲切,避免过度营销感
コマンド:/ceo changelog

最近のコミットを分析し、マーケティングコンテンツを生成します。

オプション:

  • --lang=en|zh - 出力言語(デフォルト:en)
  • --days=N - 分析する日数(デフォルト:1、最大:7)
  • --project=<name> - 特定のプロジェクトのみを分析
  • --format=email|twitter|both - 出力形式(デフォルト:both)
実行手順
ステップ 1:コミットを収集する
# For each project in ceo-dashboard.json
cd <project_path>

# Get commits from last 24 hours (or N days)
git log --since="24 hours ago" --pretty=format:"%H|%s|%an|%ai" --no-merges

# Get file change statistics
git log --since="24 hours ago" --stat --no-merges
ステップ 2:変更を分類する

Conventional Commits のパターンと内容の分析を使って、各コミットを種類ごとに分類します。

カテゴリ検出パターンユーザー向けの名称
機能feat:, add, new, implement新機能
修正fix:, bug, patch, resolveバグ修正
パフォーマンスperf:, optimize, faster, speedパフォーマンスの改善
UXui:, ux:, style, designユーザー体験
セキュリティsecurity:, auth, encrypt, protectセキュリティの更新
ドキュメントdocs:, readme, guideドキュメント
リファクタリングrefactor:, clean, restructure裏側の改善

集約ルール:

  • プロジェクトをまたいで類似する変更をまとめます
  • 内部的なリファクタリングより、ユーザー向けの変更を優先します
  • 強調度を調整するため、カテゴリごとのコミット数を数えます
ステップ 3:ユーザーのメリットに変換する

変更カテゴリごとに、CMO の変換方針を適用します。

技術的な変更ユーザーのメリット
「キャッシュ層を追加」「ページの読み込みが 2 倍速くなりました」
「認証トークンの更新を修正」「予期しないログアウトがなくなりました」
「ダークモードを実装」「夜間でも目が疲れにくくなりました」
「データベースクエリをリファクタリング」「検索結果がすぐに表示されます」
「レート制限を追加」「ピーク時でもサービスの信頼性が向上しました」

変換プロンプトのテンプレート:

Given this technical commit: "<commit_message>"
In project: <project_name> (<project_description>)

Transform into a user-focused benefit statement:
- Focus on what the user gains
- Use active voice
- Be specific but concise
- Avoid technical jargon
ステップ 4:メールテンプレートを生成する

m0rphic のスタイルパターンに沿って、React Email 対応のテンプレートを出力します。

メールの構成:

// Resend-compatible React Email template
import {
  Body, Button, Container, Head, Heading, Hr,
  Html, Link, Preview, Section, Text,
} from "@react-email/components";

interface ChangelogEmailProps {
  locale: "en" | "zh";
  dateRange: string;
  changes: {
    category: string;
    items: { title: string; description: string; project: string }[];
  }[];
  ctaUrl: string;
  totalCommits: number;
  projectCount: number;
}

カラーパレット(ダークテーマ):

const colors = {
  background: "#0a0a0a",
  container: "#141414",
  card: "#1a1a1a",
  accent: "#8b5cf6",      // Purple
  success: "#22c55e",     // Green
  text: {
    primary: "#ffffff",
    secondary: "#a3a3a3",
    muted: "#737373",
    subtle: "#525252",
  },
  border: "#262626",
};

メールの翻訳:

const translations = {
  en: {
    preview: (count: number) => `[Your Product] Weekly Update - ${count} improvements shipped`,
    title: "What's New This Week",
    greeting: "Hey there,",
    intro: (commits: number, projects: number) =>
      `Our team has been busy! Here's what we shipped across ${projects} project${projects > 1 ? 's' : ''}:`,
    newFeatures: "New Features",
    bugFixes: "Bug Fixes",
    improvements: "Improvements",
    security: "Security Updates",
    cta: "Try It Now",
    footer: "Thanks for being part of our journey!",
  },
  zh: {
    preview: (count: number) => `[产品名] 本周更新 - ${count} 项改进已上线`,
    title: "最新动态",
    greeting: "你好,",
    intro: (commits: number, projects: number) =>
      `我们的团队一直在努力!以下是 ${projects} 个项目的最新进展:`,
    newFeatures: "新功能",
    bugFixes: "问题修复",
    improvements: "体验优化",
    security: "安全更新",
    cta: "立即体验",
    footer: "感谢你的支持与信任!",
  },
};
ステップ 5:Twitter/X スレッドを生成する

Twitter スレッド(複数のツイートで構成される単一のスレッド)形式を作成します。

スレッドの構成:

Tweet 1 (Hook - max 280 chars):
🚀 [Product] Update Thread

This week we shipped [N] updates to make your experience even better.

Here's what's new 👇

---
Tweet 2-N (Changes - max 280 chars each):
✨ [Category]: [Benefit Statement]

[Brief explanation of why this matters]

---
Final Tweet (CTA - max 280 chars):
That's a wrap! 🎉

Try these updates now: [link]

What feature would you like to see next? Let us know in the replies!

スレッドのルール:

  • 1 つのスレッドにつき、ツイートは最大 5~7 件
  • 各ツイートは 280 文字以内
  • 絵文字は効果的に使います(使いすぎないようにします)
  • 最初のツイートはフックとして、読者の関心を引く必要があります
  • 最後のツイートは CTA とエンゲージメントを促す内容にします
  • 中間のツイートでは、関連する変更をまとめます

絵文字ガイド:

カテゴリ絵文字
機能✨
修正🔧
パフォーマンス⚡
セキュリティ🔒
UX💎
全般🚀
出力形式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  MARKETING CHANGELOG - 2026-01-23
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  📊 ANALYSIS SUMMARY
  ────────────────────────────────────────────────────────────────────
  Period:           Last 24 hours
  Projects:         3 (saifuri, kimeeru, m0rphic)
  Total Commits:    12

  By Category:
    ✨ Features:    4 commits
    🔧 Fixes:       5 commits
    ⚡ Performance: 2 commits
    💎 UX:          1 commit

  📧 EMAIL TEMPLATE (Resend-compatible React Email)
  ────────────────────────────────────────────────────────────────────

  [Generated TSX code here - copy-paste ready]

  🐦 TWITTER/X THREAD
  ────────────────────────────────────────────────────────────────────

  Thread 1/5:
  🚀 Weekly Update Thread

  This week we shipped 12 updates across 3 products.

  Here's what's new 👇

  ---
  Thread 2/5:
  ✨ New: Smart notifications

  Get notified about what matters, when it matters.
  No more notification fatigue.

  ---
  [... more tweets ...]

  ---
  Thread 5/5:
  That's a wrap! 🎉

  Try these updates: https://yourproduct.com

  What feature would you like next? Reply below!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
メールテンプレートの完全な例
import {
  Body,
  Button,
  Container,
  Head,
  Heading,
  Hr,
  Html,
  Link,
  Preview,
  Section,
  Text,
} from "@react-email/components";

const translations = {
  en: {
    preview: (count: number) =>
      `We shipped ${count} updates to make your experience better`,
    title: "What's New",
    greeting: "Hey there,",
    intro: (commits: number, projects: number) =>
      `Our team has been busy! Here are ${commits} updates we shipped this week:`,
    newFeatures: "New Features",
    bugFixes: "Bug Fixes",
    improvements: "Improvements",
    cta: "Try It Now",
    footerText: "Thanks for being part of our journey!",
    unsubscribe: "Unsubscribe from updates",
  },
  zh: {
    preview: (count: number) => `我们发布了 ${count} 项更新,让你的体验更好`,
    title: "最新动态",
    greeting: "你好,",
    intro: (commits: number, projects: number) =>
      `我们的团队一直在努力!以下是本周发布的 ${commits} 项更新:`,
    newFeatures: "新功能",
    bugFixes: "问题修复",
    improvements: "体验优化",
    cta: "立即体验",
    footerText: "感谢你与我们同行!",
    unsubscribe: "退订更新通知",
  },
} as const;

type Locale = keyof typeof translations;

interface ChangeItem {
  title: string;
  description: string;
  project?: string;
}

interface ChangeCategory {
  key: string;
  emoji: string;
  items: ChangeItem[];
}

interface ChangelogEmailProps {
  locale?: Locale;
  productName: string;
  productUrl: string;
  dateRange: string;
  totalCommits: number;
  projectCount: number;
  changes: ChangeCategory[];
  unsubscribeUrl?: string;
}

export function ChangelogEmail({
  locale = "en",
  productName,
  productUrl,
  dateRange,
  totalCommits,
  projectCount,
  changes,
  unsubscribeUrl,
}: ChangelogEmailProps) {
  const t = translations[locale] || translations.en;

  const categoryNames: Record<string, Record<Locale, string>> = {
    features: { en: "New Features", zh: "新功能" },
    fixes: { en: "Bug Fixes", zh: "问题修复" },
    improvements: { en: "Improvements", zh: "体验优化" },
    security: { en: "Security Updates", zh: "安全更新" },
    performance: { en: "Performance", zh: "性能优化" },
  };

  return (
    <Html>
      <Head />
      <Preview>{t.preview(totalCommits)}</Preview>
      <Body style={main}>
        <Container style={container}>
          {/* Logo/Brand */}
          <Section style={logoSection}>
            <Text style={logoText}>{productName}</Text>
          </Section>

          {/* Title */}
          <Heading style={heading}>{t.title}</Heading>
          <Text style={dateText}>{dateRange}</Text>

          {/* Greeting & Intro */}
          <Text style={paragraph}>{t.greeting}</Text>
          <Text style={paragraph}>
            {t.intro(totalCommits, projectCount)}
          </Text>

          {/* Changes by Category */}
          {changes.map((category, i) => (
            <Section key={i} style={categorySection}>
              <Text style={categoryTitle}>
                {category.emoji} {categoryNames[category.key]?.[locale] || category.key}
              </Text>
              {category.items.map((item, j) => (
                <Section key={j} style={changeCard}>
                  <Text style={changeTitle}>{item.title}</Text>
                  <Text style={changeDescription}>{item.description}</Text>
                  {item.project && (
                    <Text style={projectTag}>{item.project}</Text>
                  )}
                </Section>
              ))}
            </Section>
          ))}

          {/* CTA Button */}
          <Section style={buttonContainer}>
            <Button style={button} href={productUrl}>
              {t.cta}
            </Button>
          </Section>

          <Hr style={hr} />

          {/* Footer */}
          <Text style={footer}>{t.footerText}</Text>
          {unsubscribeUrl && (
            <Text style={unsubscribeText}>
              <Link style={unsubscribeLink} href={unsubscribeUrl}>
                {t.unsubscribe}
              </Link>
            </Text>
          )}
        </Container>
      </Body>
    </Html>
  );
}

// Styles - Dark theme matching m0rphic
const main = {
  backgroundColor: "#0a0a0a",
  fontFamily:
    '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif',
  padding: "40px 0",
};

const container = {
  backgroundColor: "#141414",
  margin: "0 auto",
  padding: "40px 20px",
  maxWidth: "560px",
  borderRadius: "12px",
};

const logoSection = {
  textAlign: "center" as const,
  marginBottom: "24px",
};

const logoText = {
  fontSize: "20px",
  fontWeight: "600",
  color: "#ffffff",
  margin: "0",
};

const heading = {
  color: "#ffffff",
  fontSize: "24px",
  fontWeight: "600",
  textAlign: "center" as const,
  margin: "0 0 8px",
};

const dateText = {
  color: "#737373",
  fontSize: "14px",
  textAlign: "center" as const,
  margin: "0 0 24px",
};

const paragraph = {
  color: "#a3a3a3",
  fontSize: "15px",
  lineHeight: "24px",
  margin: "16px 0",
};

const categorySection = {
  margin: "32px 0",
};

const categoryTitle = {
  color: "#ffffff",
  fontSize: "16px",
  fontWeight: "600",
  margin: "0 0 16px",
  borderBottom: "1px solid #262626",
  paddingBottom: "8px",
};

const changeCard = {
  backgroundColor: "#1a1a1a",
  borderRadius: "8px",
  padding: "16px",
  marginBottom: "12px",
  borderLeft: "3px solid #8b5cf6",
};

const changeTitle = {
  color: "#ffffff",
  fontSize: "15px",
  fontWeight: "600",
  margin: "0 0 8px",
};

const changeDescription = {
  color: "#a3a3a3",
  fontSize: "14px",
  lineHeight: "20px",
  margin: "0",
};

const projectTag = {
  color: "#8b5cf6",
  fontSize: "12px",
  marginTop: "8px",
  marginBottom: "0",
};

const buttonContainer = {
  textAlign: "center" as const,
  margin: "32px 0",
};

const button = {
  backgroundColor: "#8b5cf6",
  borderRadius: "8px",
  color: "#ffffff",
  fontSize: "15px",
  fontWeight: "600",
  textDecoration: "none",
  textAlign: "center" as const,
  display: "inline-block",
  padding: "12px 24px",
};

const hr = {
  borderColor: "#262626",
  margin: "32px 0",
};

const footer = {
  color: "#525252",
  fontSize: "12px",
  textAlign: "center" as const,
  margin: "0",
};

const unsubscribeText = {
  textAlign: "center" as const,
  marginTop: "16px",
};

const unsubscribeLink = {
  color: "#525252",
  fontSize: "12px",
  textDecoration: "underline",
};

export default ChangelogEmail;
Twitter スレッド生成テンプレート
interface TwitterThread {
  tweets: string[];
  totalLength: number;
  warnings: string[];
}

function generateTwitterThread(
  changes: ChangeCategory[],
  options: {
    productName: string;
    productUrl: string;
    locale: "en" | "zh";
    totalCommits: number;
  }
): TwitterThread {
  const { productName, productUrl, locale, totalCommits } = options;
  const tweets: string[] = [];
  const warnings: string[] = [];

  // Tweet 1: Hook
  const hook = locale === "en"
    ? `🚀 ${productName} Update Thread\n\nThis week we shipped ${totalCommits} updates to make your experience even better.\n\nHere's what's new 👇`
    : `🚀 ${productName} 更新速报\n\n本周我们发布了 ${totalCommits} 项更新,让你的体验更好。\n\n一起来看看 👇`;

  tweets.push(hook);

  // Middle tweets: Changes (group by category)
  const emojiMap: Record<string, string> = {
    features: "✨",
    fixes: "🔧",
    performance: "⚡",
    security: "🔒",
    improvements: "💎",
  };

  const categoryLabels: Record<string, Record<string, string>> = {
    features: { en: "New", zh: "新功能" },
    fixes: { en: "Fixed", zh: "修复" },
    performance: { en: "Faster", zh: "更快" },
    security: { en: "Secured", zh: "安全" },
    improvements: { en: "Improved", zh: "优化" },
  };

  for (const category of changes) {
    if (category.items.length === 0) continue;

    const emoji = emojiMap[category.key] || "📦";
    const label = categoryLabels[category.key]?.[locale] || category.key;

    // Combine items into one tweet per category (if possible)
    const itemList = category.items
      .slice(0, 3) // Max 3 items per category
      .map((item) => `• ${item.title}`)
      .join("\n");

    const tweet = `${emoji} ${label}:\n\n${itemList}`;

    if (tweet.length > 280) {
      warnings.push(`Category "${category.key}" tweet exceeds 280 chars`);
    }

    tweets.push(tweet);
  }

  // Final tweet: CTA
  const cta = locale === "en"
    ? `That's a wrap! 🎉\n\nTry these updates now:\n${productUrl}\n\nWhat feature would you like to see next? Let us know! 💬`
    : `以上就是本周的更新!🎉\n\n立即体验:\n${productUrl}\n\n还想要什么功能?评论区告诉我们!💬`;

  tweets.push(cta);

  return {
    tweets,
    totalLength: tweets.reduce((sum, t) => sum + t.length, 0),
    warnings,
  };
}
使用例
# Generate changelog in English (default)
/ceo changelog

# Generate changelog in Chinese
/ceo changelog --lang=zh

# Analyze last 3 days
/ceo changelog --days=3

# Analyze specific project only
/ceo changelog --project=saifuri

# Email only (no Twitter)
/ceo changelog --format=email

# Twitter only (no email)
/ceo changelog --format=twitter
キャッシュ構造

ceo-dashboard.json に変更履歴を追加します:

{
  "changelog_history": [
    {
      "date": "2026-01-23",
      "period_days": 1,
      "projects": ["saifuri", "kimeeru"],
      "total_commits": 12,
      "categories": {
        "features": 4,
        "fixes": 5,
        "performance": 2,
        "ux": 1
      },
      "output_lang": "en"
    }
  ]
}
トリガー

変更履歴の作成を開始する自然言語のフレーズ:

  • 「最近のコミットからマーケティング向けの更新情報を生成」
  • 「変更履歴のメールを書く」
  • 「最近の変更について Twitter スレッドを作成」
  • 「今週リリースした内容は?」
  • 「最近の開発内容をユーザー向けに要約」
  • 「リリースノートを生成」
  • 「更新情報のニュースレターを書く」

コメント