| name | clipboard-format |
| description | TRIGGER: 「クリップボードにコピーして」「コピーして」等の依頼に、貼り付け先(Slack/Confluence等)の指定が伴うとき。貼り付け先のフォーマット仕様に合わせて太字・コードブロック等を装飾した状態でクリップボードにコピーする。現状はSlackのみ対応。 |
| user-invocable | false |
clipboard-format スキル
「◯◯に貼るからコピーして」と言われたとき、直前の回答内容(または指定された内容)を、
貼り付け先のプラットフォームで実際に装飾(太字・コードブロック等)が反映される形でクリップボードにコピーする。
前提知識(重要)
素朴に Markdown 文字列(**太字** や *太字*)をプレーンテキストとしてクリップボードにコピーしても、
貼り付け先アプリ側でその場でMarkdown記法が解釈されるとは限らない。特にSlack Desktop(Electron製)は
デフォルトでリッチテキストエディタになっており、*text* のような記法をペーストしても自動変換されず記号がそのまま表示される。
これを回避するには、最初から装飾済みのリッチテキスト(HTML)としてクリップボードに載せる必要がある。
そうすればSlack側のMarkdown変換設定に関係なく、貼り付けた瞬間に太字・コードが反映される。
検証済みの事実:
- ❌
textutil でHTML→RTF変換し «class RTF» としてクリップボードに載せる方式 → Slackには認識されず何も貼り付かなかった
- ✅ HTML(
«class HTML»)+プレーンテキストのフォールバックを両方クリップボードに載せる方式 → Slackで太字・コードブロックが正しく反映された
なのでSlack向けは必ずHTML方式を使うこと。RTF方式は使わない。
対応プラットフォーム
| プラットフォーム | 対応状況 |
|---|
| Slack | ✅ 対応済み |
| Confluence | 🚧 未対応(今後追加予定) |
| その他 | 🚧 未対応 |
指定されたプラットフォームが未対応の場合は、勝手にそれっぽい形式を推測せず「まだ対応していません」と伝える。
実行フロー
1. 貼り付け先の特定
ユーザーの発言から貼り付け先を判定する。
- 明示されていれば(例:「slackに貼るから」)それに従う
- 明示がなく文脈からも判断できない場合は、どこに貼るか確認する
- 対象がSlack以外(未対応)なら、対応状況を伝えて通常のプレーンテキストコピー(
pbcopy)で代替する
2. コピー対象content の整理
直前の回答(または指定されたテキスト)を、Slack向けに以下の要素へマッピングする:
- 見出し・強調したい箇所 →
<b>...</b>
- コードや識別子(テーブル名・カラム名・関数名等) →
<code>...</code>
- SQLやコードブロック →
<pre><code>...</code></pre>
- 箇条書き →
・ や <br> を使ったテキスト(<ul><li> は使わなくてよい。プレーンな記号+<br>で十分機能する)
- 区切り線が欲しい場合は
----------------------------------------- のようなテキスト罫線でよい
余白(改行・空行)のルール — 詰め込みすぎない
⚠️ 重要: 単に <p> を連続させたり <br><br> を入れるだけでは、Slack側のペースト処理が「中身が空のブロック」とみなして空行ごと詰めてしまい、実際には余白が入らないことが確認されている。
空行を確実に残すには、中身のない空行にも (non-breaking space)を入れて「空ではない行」として認識させること。
- 見出し(
<b>...</b>)の直後、本文に入る前に改行を入れる(見出しと文章をくっつけない)
- セクションとセクションの間には
<p> </p> を挟んで空行を作る(<p></p>や単なる連続<p>だけでは詰められてしまうので使わない)
- 箇条書きが2〜3項目を超える、または各項目が長い(一文以上ある)場合は、項目間に
<br> <br> を入れて空行を作る。短い単語的な箇条書き(例: 対象日→created_atの一覧)は詰めて<br>一つでよい
- コードブロック(
<pre><code>)の前後にも <p> </p> を入れて余白を作る。コードブロックの直前直後に文章をくっつけない
- 長い説明文は一文ごとに詰め込まず、意味の区切りで
<br>を入れて縦に読みやすくする
- 全体として「詰まっている」と感じたら、まず
スペーサーを増やす方向で調整する(減らしすぎより増やしすぎの方が安全)
3. HTMLファイルの作成
セッションのスクラッチパッドディレクトリ(無ければ /tmp)に一時HTMLファイルを作る。
文字コードは必ず <meta charset="utf-8"> を入れる。
<html><head><meta charset="utf-8"></head><body>
<p><b>結論</b><br>
本文...</p>
<p> </p>
<p><b>見出し</b><br>
・箇条書き1(短い項目は<br>一つで詰めてよい)<br>
・箇条書き2</p>
<p> </p>
<p><b>長めの説明が続く見出し</b><br>
・1つ目の項目についての説明文...<br> <br>
・2つ目の項目についての説明文...(項目が長い/文章的なときは<br> <br>で空行を作る)</p>
<p> </p>
<p>コードブロックの前後にも空行スペーサーを入れる。</p>
<p> </p>
<pre><code>select *
from table
;</code></pre>
<p> </p>
<p>コードブロックの後も同様に空行を挟んでから続ける。</p>
</body></html>
同じ内容のプレーンテキスト版(Markdown記法なしの素のテキスト)も同じディレクトリに用意する。
これはSlack側がHTMLを解釈できなかった場合のフォールバックとして使われる。
4. クリップボードへの反映(macOS)
必ずこの形(HTML + string の同時セット)を使う。RTFは使わない。
HTML_PATH="/path/to/scratch.html"
PLAIN_PATH="/path/to/scratch.txt"
osascript <<APPLESCRIPT
set htmlData to read (POSIX file "$HTML_PATH") as «class HTML»
set plainData to read (POSIX file "$PLAIN_PATH") as string
set the clipboard to {«class HTML»:htmlData, string:plainData}
APPLESCRIPT
実行後、osascript -e 'clipboard info' で «class HTML» が含まれていることを確認する。
5. ユーザーへの報告
「Slack用に装飾(太字・コードブロック)した状態でコピーしました」と一言添える。
実際にSlackに貼ってみて崩れる場合は、HTMLタグの組み方(<pre><code>の中に余計な装飾を入れていないか等)を疑って調整する。
既知の注意点
- OSは macOS 前提(
osascript を使用)。Windows/Linuxの場合は別途対応が必要(未実装)。
textutil -convert rtf を使ったRTF方式はSlackで機能しなかったため使用しない。
- 長い内容を貼るとSlack側で意図せず折り畳まれることがあるが、これはSlack側の仕様であり本スキルの範囲外。