name: post-progress description: 作業進捗をXに面白く投稿する。コミット後に使用
X 進捗投稿スキル
$ARGUMENTS を解釈:
-n <数>: 直近N件のコミットをまとめる(デフォルト: 1)--day <数>: 直近N日間のコミットをまとめる(例:--day 7で1週間分)-m "<メッセージ>": 自動生成メッセージの前に追加するユーザーメッセージ--dry-run: 投稿せずプレビューのみ--style <スタイル>: fun(デフォルト)/formal/emoji
Note:
-nと--dayを両方指定した場合は--dayが優先されます-mを指定すると、指定したメッセージが自動生成メッセージの前に追加されます(置き換えではなく追加)
実行手順
コミット情報の取得
git logで直近コミット情報を取得:-nが指定された場合:git log -n <数>(件数ベース)--dayが指定された場合:git log --since="<数> days ago"(期間ベース)- 両方指定された場合:
--dayを優先 - どちらも指定されない場合:
-n 1(最新1件)
コミット選択が必要な場合(
--select):git log -20 --onelineで直近20件を番号付きで表示:直近20件のコミット: 1. 5738147 feat(workflow): improve display format 2. 8982e4e refactor(workflow): restore Claude-based post 3. 64c972b fix(workflow): add --list option ...- 一覧の後に「投稿したいコミットの番号をカンマ区切りで入力してください(例: 1,3,7)」とテキストで表示し、ユーザーのチャット入力を待つ(AskUserQuestion は使わない)
- 選択直後に確認メッセージを表示: 「✅ 選択されたコミット: #1, #3, #7 (3件)」
- 選択されたハッシュで
git showを実行してコミットメッセージを取得
文脈の把握(投稿文生成の前に必ず実行) 選択されたコミットだけでは「何を目指しての作業か」が不明な場合がある。 以下の手順で文脈を確認し、読者に全体像を伝えられるようにする:
- 選択コミットの前後5件を
git logで確認し、関連する一連の作業を特定 - 同じスコープ(例:
workflow,control,cli)や同じ機能に関するコミットが連続していれば、それが「一連の作業」 - 一連の作業の最初のコミットから目的を読み取る(最初のコミットに動機が書かれていることが多い)
- 必要に応じて関連コミットも
git showで詳細を確認
判断基準: 選択されたコミットの subject だけを読んで「なぜこの作業が必要だったか」が明確にわからなければ、文脈確認が必要。
例:
fix(workflow): use plain text input for commit selectionだけでは何の話かわからない → 前後を見ると post-progress スキルのコミット選択UI改善の一連の作業とわかる → 冒頭で「進捗投稿スキルのコミット選択UIを改善した」と全体目的を述べる- 選択コミットの前後5件を
投稿文の生成(Claude が実行) コミットメッセージと文脈情報を元に、以下のスタイルで投稿文を生成:
共通ルール:
- 800-900文字程度を目安に詳細な技術情報を含める
- ハッシュタグを2-3個追加
- プロジェクト固有タグ: stampfly_ecosystem ディレクトリの場合は #StampFly を含める
- 技術タグ + 分野タグ(例: #制御工学 #ドローン開発)
- 構造化された情報提供を重視
- 5W1H を意識: なぜ(Why)、何が問題で(Problem)、何を(What)、どのように(How)、何が改善されたか(Impact)
スタイル別:
fun(デフォルト): ストーリー性と技術詳細を組み合わせた拡張スタイル投稿構成(800-900文字):
- 冒頭(1-3行):
-mオプション指定時: ユーザーメッセージ + 空行 + 自動生成メッセージ-mオプションなし: 課題や動機を明示(「〜するため」「〜が問題だった」)- コミット数を明記
- 実装内容(3-5項目): 主要な成果を箇条書き
- 技術用語を読みやすく説明
- 「Add XXX」→「XXXを実装し、〜が可能に」のように成果を表現
- 詳細セクション(カテゴリ別に整理、2-3セクション):
- 「◆カテゴリ名: 説明」形式
- 因果関係を説明(「〜により〜が実現」「〜することで〜を実現」)
- 具体的なシーンや使用例を含める
- 設計判断の理由を説明
- 締め(1-2行): 成果のインパクト(何が改善されたか)
- ハッシュタグ: 2-3個(技術 + 分野)
重要なポイント:
- 機械的な箇条書きではなく、ストーリーとして語る
- 読者が「なるほど」と思える因果関係を説明
- 専門用語はそのまま使わず、何を意味するか説明する
- 英語のコミットメッセージは日本語で意訳する
- 冒頭(1-3行):
formal: 絵文字なし、ビジネスライクな報告形式emoji: 絵文字多め、視覚的にインパクトのある表現
プレビュー表示 生成した投稿文を以下のフォーマットで表示:
表示フォーマット:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✅ 選択されたコミット: #5, #13 (2件) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📝 投稿プレビュー (XXX文字): [投稿文の全文をそのまま表示] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━重要なポイント:
- コミット選択直後に選択確認メッセージを表示(番号とハッシュ)
- 明確な区切り線(━)で視覚的に分離し、コミットリストと投稿文を区別
- 投稿文は改行を含めてそのまま表示(コードブロック不要、生の投稿文として見せる)
- 文字数を明記(800-900文字が目安)
- 最後にもう一度区切り線を表示して投稿文の終わりを明示
--dry-runの場合はここで終了成果画像の探索(投稿前に実行) コミットに関連する画像を探索し、添付候補を提示する:
git diff --name-only <最古コミット>^..<最新コミット>で変更ファイル一覧を取得- 以下の優先順で画像候補を探索:
- 直接変更された画像ファイル:
*.png,*.jpg,*.jpeg,*.gif,*.webp - TikZ 変更 → 同じディレクトリまたは
images/サブディレクトリの PNG を探索 - Beamer/LaTeX 変更 → 対応する
build/やimages/ディレクトリの PNG/PDF を探索 - コード変更 → 関連するスクリーンショットや図(
docs/images/,images/等)
- 直接変更された画像ファイル:
- 候補が見つかった場合、一覧を表示:
📎 画像候補: 1. docs/workshop/images/lesson4_block_diagram.png (45KB) 2. docs/workshop/images/lesson7_pid_response.png (62KB) 3. docs/workshop/build/slides_lesson4.png (128KB) 添付する画像の番号を選択してください(例: 1,2、スキップは Enter) - ユーザーのチャット入力を待つ(最大4枚まで選択可能)
- 候補がない場合はスキップして次のステップへ
注意: 画像は PNG/JPG/GIF/WebP 形式、5MB 以下のみ対応
X への投稿 承認されたら以下を実行:
画像なしの場合:
python3 .claude/skills/post-progress/scripts/post_to_x.py "<投稿文>"画像ありの場合:
python3 .claude/skills/post-progress/scripts/post_to_x.py "<投稿文>" --media "path1.png,path2.png"dry-run の場合(画像プレビュー付き):
python3 .claude/skills/post-progress/scripts/post_to_x.py "<投稿文>" --media "path1.png" --dry-run
投稿文の例
入力(コミットメッセージ):
Add user authentication with JWT tokens
Implement token refresh mechanism
Add password reset flow
出力(fun スタイル・拡張版):
ECサイトのセキュリティ強化のため、この1週間で認証基盤を全面刷新した。
実装内容:
・JWT認証(RS256署名/アクセス15分・リフレッシュ7日)
・トークン自動更新機構(HTTPOnly Cookie + CSRF対策)
・パスワードリセットフロー(有効期限付きワンタイムトークン)
・多要素認証対応(TOTP/SMS)
◆認証アーキテクチャ: ステートレスなJWT設計により、Redisなどのセッションストアが不要に。アクセストークンは短命(15分)で漏洩リスクを最小化し、リフレッシュトークン(7日)でUXを維持。水平スケールが容易になった。
◆セキュリティ強化: CSRF対策としてSameSite Cookie属性を使用。パスワードリセットは有効期限付きワンタイムトークンで、再利用攻撃を防止。多要素認証でアカウント乗っ取りリスクを大幅に低減。
◆テスト: 認証フロー全体でE2Eテスト実装(Playwright使用)。トークン更新、失効、並行アクセスのエッジケースを網羅。
ステートレスな認証基盤が整い、安全に水平スケールできる体制が完成
#Web開発 #認証 #JWT
StampFly プロジェクトの場合(ハッシュタグに #StampFly を含める・拡張版):
ドローンの開発サイクルを加速するため、この1週間でツールチェーンを大幅に強化した(54件のコミット)。
実装内容:
・システム同定/ESKFシミュレーションCLI(Bode線図/グリッドサーチ/100+パターン評価)
・ROS2統合(WebSocket→UDP移行/Phase 2完了/外部PC制御)
・Serial CLI刷新(ESP-IDF標準コンソール採用/コマンド追加容易化)
・WiFi設定の実行時変更(チャンネル/デバイスID動的設定)
◆解析ツール(6件): システム同定コマンド(sf sysid)で実機の伝達関数を推定し、Bode線図/極零点マップ/ゲイン余裕を可視化。ESKFのQ/R行列グリッドサーチで100パターン以上を自動評価し、最適なフィルタパラメータを探索可能に。pytest単体テストとJupyter可視化チュートリアルも整備。
◆ROS2統合(4件): Phase 1でWebSocket経由のテレメトリブリッジを実装し、Phase 2でUDP経由の制御指令送信に対応。外部PCからPythonでリアルタイム制御できる環境が整った。400Hzテレメトリをros2 topic echoで確認可能。
◆CLI改善(5件): 独自実装からESP-IDF標準コンソールに移行し、コマンド追加が容易に。USB CDC VFS対応でスタックサイズ問題も解決。CLI拡張ガイドも整備し、新機能の追加が高速化。
実機開発の生産性が大幅に向上し、データ駆動なパラメータ調整が可能になった
#StampFly #組込み #ROS2
-m オプションを使った場合の例:
年末年始の開発成果をまとめました。
ドローンの開発サイクルを加速するため、この1週間でツールチェーンを大幅に強化した(54件のコミット)。
実装内容:
・システム同定/ESKFシミュレーションCLI(Bode線図/グリッドサーチ/100+パターン評価)
・ROS2統合(WebSocket→UDP移行/Phase 2完了/外部PC制御)
...(以下同じ)
#StampFly #組込み #ROS2
使用例
# 基本的な使い方
/post-progress # 最新1件のコミット
/post-progress -n 5 # 直近5件のコミット
/post-progress --day 7 # 直近7日間のコミット
# 🆕 インタラクティブ選択(推奨)
/post-progress --select
# → 直近20件を表示、番号で選択(例: 1,2,5 と入力)
# 🆕 特定のコミットを指定
/post-progress --commits f3a6083,139df24
# → 指定したハッシュのコミットのみ投稿
# 🆕 範囲指定
/post-progress --range 4c8c60c..f3a6083
# → 指定範囲内の全コミット
# プレビューのみ(投稿しない)
/post-progress --select --dry-run
/post-progress -n 3 --dry-run
# ユーザーメッセージ追加
/post-progress --select -m "今週の開発成果"
/post-progress -n 7 -m "年末年始の開発成果をまとめました。"
# スタイル変更
/post-progress -n 10 --style formal
/post-progress --select --style emoji
# 画像添付(自動探索)
/post-progress --select
# → コミット選択後、変更ファイルから画像候補を自動探索して提示
必要なパッケージ
pip install requests requests-oauthlib
環境変数の設定
X API の認証情報を環境変数に設定してください:
# ~/.zshrc に追加
export X_API_KEY="your-api-key"
export X_API_SECRET="your-api-secret"
export X_ACCESS_TOKEN="your-access-token"
export X_ACCESS_TOKEN_SECRET="your-access-token-secret"
エラーハンドリング
- Git リポジトリでない場合: エラーメッセージを表示
- コミットがない場合: エラーメッセージを表示
- 環境変数が未設定の場合: 設定方法を案内
- API エラーの場合: エラー内容を表示