draft-message について
draft-message は、エージェント向けの Telegram メッセージ作成スキルです。草稿を送信先ではなくユーザーの Saved Messages に保存するため、送信前に確認・編集し、手動で貼り付けられます。
主な機能
- 01Saved Messages への草稿保存
- 02送信先を示すラベルの付与
- 03HTML 形式のコンテンツに対応
- 04長文メッセージの自動分割
- 05置き換えずに草稿を追加
活用シーン
- 01長文や複数段落のメッセージを送信前に確認
- 02慎重な表現が必要なメッセージの確認
- 03社外向け返信のトーンを送信前に調整
- 04緊急でない連絡に人の確認を挟む
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill draft-messageインストール後、Claude Code で/draft-messageを入力して読み込まれたか確認します。
詳細
Telegram メッセージを下書きする(保存済みメッセージ経由)
ユーザーの保存済みメッセージにメッセージを送り、ユーザーが確認して必要に応じて編集した後、送信前に目的のチャットの入力欄へコピー&ペーストできるようにします。保存済みメッセージは、すべての Telegram アカウントに備わっている自分専用のプライベートチャットで、すべてのクライアント間で自動的に同期されます。
なぜ MTProto のクラウド下書きではなく、保存済みメッセージなのですか? 公式の Telegram クライアントには、未修正の既知の競合状態(tdesktop#29111、"not planned" としてクローズ)があり、別の認証セッションから
SaveDraftRequestで送信されたクラウド下書きが、ローカルの空の下書き状態によって黙って上書きされることがあります。実際にこの問題を確認しています。サーバーでは下書きが確認されたのに、ユーザーの入力欄は空のままでした。保存済みメッセージを使えば、この問題を完全に回避できます。HTML の書式はすべて保持され、入力欄間で Telegram の標準機能を使ってコピー&ペーストすれば、iOS、Android、Desktop、Web でリッチテキストが維持されます。
自己進化するスキル:このスキルは使用を通じて改善されます。手順に誤りがあった場合、パラメーターが変わった場合、または回避策が必要だった場合は、後回しにせず、すぐにこのファイルを修正してください。実際に再現可能な問題がある場合にのみ更新してください。
下書きと送信を使い分ける場合
| 状況 | 使用する方法 |
|---|---|
| エージェントが自律的に作成した、長文または複数段落のメッセージ | 下書き — 送信前に人間が目を通せるようにします |
| 採用、解雇、契約条件など、慎重な表現が必要なメッセージ | 下書き — 誤字や名前の間違いは大きな問題につながります |
| 同僚や社外の相手への返信など、口調が重要なメッセージ | 下書き — AI が生成する口調は、微妙にずれていることがあります |
| 短い確認、状況報告、定型的な返信 | 送信 — 下書きを作る手間が得られる価値を上回ります |
| 自動通知、アラート、スケジュールされた通知 | 送信 — 人間が確認する必要はありません |
| 下書き→確認→送信の往復では間に合わない、時間的制約のあるメッセージ | 送信 — リスクを受け入れます |
判断に迷った場合のデフォルトは、下書きです。ユーザーはワンタップでいつでも送信できますが、間違ったメッセージを送信してしまうと、後から編集または削除しない限り取り消せません。
事前確認
下書きを作成する前に、ファイルが存在するだけでなく、セッションが認証済みであることを確認してください。
bun "$SCRIPT" check-auth
EXPIRED の場合は、まず /tlg:setup を実行してください。
使用方法:tg-cli.ts draft
/usr/bin/env bash << 'DRAFT_EOF'
ROOT="$(cc-plugin-root tlg)"
SCRIPT="$ROOT/scripts/tg-cli.ts"
# Draft a plain-text message labelled for a group
bun "$SCRIPT" draft -1003958083153 "Plain text draft goes here"
# Draft an HTML-formatted message
bun "$SCRIPT" draft --html -1003958083153 "<b>Bold heading</b>
Body text with <code>inline code</code> and a <a href=\"https://example.com\">link</a>."
# Draft labelled for a user
bun "$SCRIPT" draft @someusername "Quick question: does this framing land right?"
DRAFT_EOF
recipient 引数は、保存済みメッセージ内の下書きバナーにラベルを付けるためだけに使用されます。送信先ではありません。メッセージは常に、認証済みアカウント自身の保存済みメッセージに送信されます。このラベルにより、ユーザーは蓄積された各下書きがどのチャット向けかを識別できます。
保存済みメッセージでの表示
下書きごとに2つのメッセージが送信されます。
- ヘッダーバナー —
<b>下書き → <chat name></b>(チャット名を解決できない場合は、元の宛先識別子を使用します) - 本文 — 指定された書式を適用した下書きの内容
ヘッダーを分けておくことで、ユーザーは本文だけを長押ししてコピーをタップし、バナーを削除することなく、目的のチャットの入力欄に貼り付けられます。
AI エージェントのワークフローパターン
- 返信にメッセージを作成します
- 下書きコマンドを呼び出します — メッセージはユーザーの保存済みメッセージに送信され、目的のチャットには送信されません
- ユーザーに次のように伝えます:「
<chat name>宛ての下書きを保存済みメッセージに保存しました。保存済みメッセージを開く → 本文を長押し → コピー → 目的のチャットの入力欄に貼り付け → 確認 → 送信。」 - コピー&ペーストはユーザー自身が行います。送信者と最終確認者の両方をユーザーが務めます
- 編集が必要な場合は、送信前に目的のチャットの入力欄で行います
下書きは確認のための安全策です。AI が作成した内容を人間が公開するまでに、意図的な確認の間隔を設けます。
パラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
| recipient | string/int | 対象のチャット ID/ユーザー名 — 保存したメッセージのバナーのラベルにのみ使用 |
| message | string | 下書きテキスト(必須) |
--html | フラグ | メッセージを HTML(太字/コード/リンク)として解析 |
-p/--profile | string | アカウントプロフィール(デフォルトは eon) |
動作の詳細
- 下書きは追加され、置き換えられません。 各
draft呼び出しは、新しい(header, body)のペアを保存したメッセージに送信します。古い下書きは上に残るため、ユーザーは位置を見てどれが最新かを判断できます。 - 長い下書きは自動的に分割されます。 Telegram の 4096 文字の上限に合わせ、本文はプレーンテキストで約 3900 文字ごとに自動分割されます。分割位置は、まず
━━━━━━━━━━━━━━区切り、次に段落の区切り、最後に改行が優先されます。続きの各部分には<i>(Part N/M)</i>のラベルが付きます。アルゴリズムの全容については、send-messageSKILL.md の「長いメッセージの自動分割」を参照してください。 - 書式は最後まで保持されます。 HTML 入力 → 保存したメッセージとして表示 → コピー → 対象チャットの入力欄に書式を保持したまま貼り付け。
- クラウド下書きの競合状態は発生しません。 保存したメッセージは通常のチャットであるため、通常の同期経路でメッセージが伝播します。また、
SaveDraftRequestの信頼性を損なう、ローカルの空の下書きによる上書きバグの影響も受けません。 - 対象チャット側には通知されません。 対象チャットの誰にも通知や表示はされません。ユーザーが手動で貼り付けて送信した時点でのみ、相手に伝わります。
アンチパターン
| アンチパターン | うまくいかない理由 |
|---|---|
| 短く定型的なメッセージの下書きを作成する | ユーザーの時間を無駄にします。直接送信して入力欄で編集できます。 |
| 短時間に多くのメッセージの下書きを作成する | 保存したメッセージが古い下書きで埋まり、どれが最新か分かりにくくなります。 |
| 時間が重要なアラート(ダウンタイム、障害)に下書きを使う | ユーザーが保存したメッセージを開くのが数時間後になる可能性があります。 |
| 下書きを「グループに送信した」と伝える | 明確に「確認用の下書きを保存したメッセージに保存しました」と「メッセージを送信しました」を使い分けてください。 |
| 対象チャットに貼り付けるようユーザーに伝え忘れる | 次の手順をユーザーが知らなければ、下書きは保存したメッセージに残り続けます。 |
エラー処理
| エラー | 原因 | 対処 |
|---|---|---|
Cannot find any entity | ユーザー名/チャット ID が不正 | ラベルは未加工の識別子にフォールバックします。下書きは保存したメッセージに保存されます |
Session expired | セッションが無効 | /tlg:setup を実行します |
他の TLG スキルとの関係
send-message— 人による確認が不要な場合に使用します。送信済みメッセージの編集と補足の使い分けも扱います。draft-message(このスキル)— 送信前に人による確認が必要な場合に使用します。search-messages— 返信の下書きを作成する前に、既存のチャットの文脈を確認するのに便利です。
実行後の振り返り
このスキルの実行後、終了する前に確認してください。
- 下書きは保存済みメッセージに入りましたか? ユーザーに保存済みメッセージを確認するよう依頼してください。
- ユーザーは目的のチャットに正常に貼り付けられましたか? 貼り付け時に書式が崩れた場合は、具体的なクライアント(iOS/Android/Desktop/Web)を報告してもらい、再発した際に「動作の詳細」セクションをクライアント固有の注意事項で更新できるようにしてください。
- 送信ではなく下書きにしたのは適切でしたか? ユーザーが編集せずにすぐコピー&ペーストして送信した場合、下書きにしたのは過剰でした。同様のメッセージでは、次回は直接送信することを検討してください。
問題が実際に発生し、再現可能な場合に限り、この SKILL.md を更新してください。