| name | presentation |
| description | Markdown ファイルを使って GitHub Copilot の canvas でスライドプレゼンを行うためのスキル。「slides.md に従ってプレゼンして」「この Markdown をプレゼンして」「@名前.md をプレゼンして」「MS っぽくプレゼンして」「このファイルをスライド化して」など、Markdown を元にスライドを 1 枚ずつ表示しながら発表を進めたいときに使う。元 Markdown のページが自然言語の文章(段落主体)のときは、AI がページごとに自動判定して見出し+箇条書きのスライド形に要約・整形して表示する。プレゼン開始時に全スライドをまとめて生成し、canvas を開くときに open の input(slides)へ一括で渡すので最初からスライドが表示され(プレースホルダーを挟まない)、ページ送りは canvas 内のボタン(◀ ▶)・矢印キー・スライド一覧(☰)、対応する Windows 環境では Surface Pen の末尾ボタン(1回押しで次へ、長押しで前へ、2回押しで外部全画面のオン・オフ)で完結する(agent の ask_user ループは不要)。発表途中の差し替えは load_deck で行う。スライドは presentation canvas 拡張機能(Node + marked/mermaid)がネイティブ canvas にレンダリングする。Use when the user wants to give a slide presentation driven by a markdown file and shown in the canvas. |
presentation スキル
Markdown ファイルを元に、プレゼン開始時に全スライド分の「小さな Markdown 断片」をまとめて生成し、canvas を開くときに open の input(slides)へ一括で渡して最初から presentation canvas 拡張機能に表示するスキルです(「スライド未読込」のプレースホルダーを挟みません)。登録後のページ送り(次へ / 前へ / 一覧)は canvas のボタン・キーボード、対応環境では Surface Pen で完結するので、agent はスライドを送るための ask_user ループを回す必要がありません。発表途中で内容やテーマを差し替えたいときだけ load_deck を呼びます。
配布と導入
このファイルは任意導入の Skill です。プレゼン表示に必要な本体は
.github/extensions/presentation/ の Extension なので、まず Extension を導入してください。
公開リポジトリからユーザースコープへ導入する場合は、Copilot に次のように依頼します。
https://github.com/runceel/github-copilot-app-presentation/tree/main/.github/extensions/presentation
から presentation canvas Extension をユーザースコープへインストールしてください。
再現可能な導入には main をリリースタグ(例: v1.0.0)または確認済みコミット SHA に
置き換えます。Extension はローカルコードを実行するため、導入前に差分とタグを確認してください。
Skill はプロジェクトの .github/skills/presentation/SKILL.md に置くか、利用者の Skill
スコープへコピーします。配布上の注意(ZIP、Gist の単一ファイル上限、Mermaid の分割配布)は
リポジトリの README と THIRD-PARTY-NOTICES.md を参照してください。
いちばん大事な原則 ⚡
- あなた(生成 AI)が書くのは、各スライド 1 枚分の「小さな Markdown 断片」だけです。HTML・CSS・テーマ・レイアウト・ページ番号・アニメーションはすべて拡張機能側(marked)が担当します。フル HTML を生成しないこと。
- 全スライドの生成は、最初にプレゼンを依頼されたときに一度だけまとめて行い、
open_canvas の input(slides)で一括登録します(発表途中で内容やテーマを変えるときだけ load_deck)。ページ送りのたびに Markdown を生成し直さないこと。
- ページ送りは canvas と入力デバイスの操作で完結します。
load_deck で登録したあとは、ユーザーが canvas 内の ◀ / ▶ ボタン、矢印キー(← →)、**スライド一覧(☰)**で自由に移動できます。対応する Windows 環境では Surface Pen の末尾ボタンも使えます。agent が ask_user でページ送りループを回す必要はありません。
スライド 1 枚は、せいぜいこの程度の Markdown です:
---
deck: プレゼンのタイトル
kicker: セクション名
page: 2
total: 6
---
## スライドの見出し
- 箇条書き **1**
- 箇条書き 2
この断片を全ページ分まとめて配列にして、open_canvas の input(slides)に渡せば、canvas を開いた瞬間に最初のスライドが表示されます。あとのページ送りは canvas 内の操作(◀ ▶・矢印キー・☰ 一覧)に任せられます。
仕組み
プレゼン開始時(1 回だけ)
あなた → 全スライド分の小さな Markdown 断片の配列を生成
│ open_canvas("presentation", { input: { slides: [...] } })
▼
拡張機能が open 時にデッキを保持し、最初から先頭スライドを表示
ページ送り(canvas 内で完結)
ユーザー → ◀ / ▶ ボタン・矢印キー・☰ 一覧 を操作
│ canvas が拡張機能に index を送信(POST /navigate)
▼
拡張機能が登録済みスライドを marked で HTML 化 → サニタイズ → テーマ適用
│ SSE
▼
ネイティブ canvas の iframe が自動更新(agent の操作不要)
- 全スライドは最初に 1 回だけ生成して
open_canvas の input で登録します(発表途中の差し替えは load_deck)。以降のページ送りは canvas 側が担当するため、Markdown の再生成も agent の操作も不要です。
- レンダリング(HTML 化・装飾・ページ番号・Mermaid 図・絵文字)とナビゲーション UIは すべて拡張機能側が担当します。外部サーバーや
localhost ポートは不要です。
- 同時に表示するデッキは 1 つ。1 人での発表を前提とします。
- 拡張機能は
.github/extensions/presentation/ にあります(project スコープ)。
主なアクション
プレゼンの開始は、open_canvas(canvasId: "presentation")の input に slides(必要なら index / theme / sourceName)を渡してデッキごと開くのが基本です。sourceName には元 Markdown ファイル名を渡してください。Canvas のプリンターアイコンから <元ファイル名>.pdf を保存できます。こうすると canvas を開いた瞬間に最初のスライドが表示され、「スライド未読込」のプレースホルダーを挟みません。下表のアクションは、開始後の操作・更新に使います。
| アクション | 用途 |
|---|
load_deck | 登録済みデッキを差し替える / 再ロードする。slides(各スライド 1 枚分の Markdown 断片の配列)、任意の index(最初に表示する 0 始まりインデックス、既定 0)、任意の theme(デッキ全体の配色テーマ、dark/light/microsoft/ms-modern、既定 dark)を渡す。発表途中で内容やテーマを変えるときに使う(開始時は通常 open の input で渡す)。 |
goto_slide | 登録済みデッキ内で表示スライドを切り替える。index(0 始まり)を渡す。範囲外は端に丸められる。通常のページ送りは canvas 内で行われるため不要だが、ユーザーがチャットで「3 ページ目に飛んで」のように特定ページを指定したときに使う。 |
show_slide | スライドを 1 枚だけ差し替える。デッキ未登録での単発表示や、その場限りの差し替え用。通常のプレゼンでは使わない。 |
open_presenter | 表示中のデッキを、canvas と同期された外部全画面ウィンドウで開く。Edge / Chrome / Chromium の app mode を使い、ページ位置・キーボード・Surface Pen 操作を共有する。Surface Pen の末尾ボタン 2 回押しでも起動 / 終了できる。 |
close_presenter | open_presenter で起動した外部プレゼン画面を閉じる。 |
export_pdf | 表示中のデッキを16:9 PDFへ書き出すAI用action。任意の outputPath はworkspaceからの相対 .pdf パス、省略時は presentation.pdf。Canvas のプリンターアイコンは sourceName から <元ファイル名>.pdf を自動保存する。任意の theme(dark/light/microsoft/ms-modern)はPDFだけに適用し、canvas表示は変えない。1スライド1ページで、背景・画像・コード強調・Mermaidを含む。show_slide による現在ページの一時差し替えも反映する。 |
reset | スライドとデッキをクリアして待機表示に戻す。 |
load_deck / goto_slide は結果に { ok, version, index, total } を返します(goto_slide は changed も返し、表示が実際に変わったかを示します)。index は現在表示中の 0 始まりインデックス、total は総スライド数です。
export_pdf は { ok, path, total, theme, bytes } を返します。PDFを書き出す前に、元Markdownが更新されている場合は最新の全スライドを load_deck で再登録してください。Canvas のプリンターアイコンは、元 Markdown のファイル名を sourceName に渡しておくと <元ファイル名>.pdf を workspace に保存します。
スライド断片のフォーマット
各スライド(load_deck の配列要素、または show_slide)に渡す Markdown は、先頭に フロントマター(--- で囲んだ key: value)を置き、その下に本文の Markdownを書きます。フロントマターは任意で、使えるキーは次のとおり(すべて省略可):
| キー | 役割 |
|---|
deck | フッター左に出すデッキ名 |
kicker | 見出し上の小さなラベル(セクション名など) |
page | 現在ページ番号(1 始まり)。total と両方あるときだけフッター右に表示 |
total | 総ページ数 |
title | ブラウザータブのタイトル(省略時は deck) |
layout | title を指定すると中央寄せの表紙レイアウト、backcover を指定すると背表紙レイアウト(テーマ色のベタ塗り/グラデーション+白文字。Microsoft 系テーマではロゴ+著作権表示も付く)になる。通常スライドは省略 |
size | コンテンツサイズ。auto(既定)/normal/large/xlarge。auto は余白の多い通常スライドだけを canvas が安全な範囲で拡大する |
theme | (任意・上書き用)このスライドだけ配色テーマを変える。dark/light/microsoft/ms-modern。通常はデッキ単位で load_deck の theme を使い、ここでは指定しない |
logo | (layout: backcover のみ)背表紙左上のワードマーク文字列。microsoft / ms-modern テーマでは省略時 Microsoft、他テーマでは明示したときだけ表示 |
copyright | (layout: backcover のみ)背表紙左下の著作権表示。microsoft / ms-modern テーマでは省略時 © Copyright Microsoft Corporation. All rights reserved.、他テーマでは明示したときだけ表示。空にすると常に非表示 |
本文では通常の Markdown が使えます(GFM 相当: marked + 表):
見出し #/##/###、箇条書き -/番号付き 1.、強調 **太字**/*色付き*、`コード`、コードブロック ```、引用 >、表 |...|、リンク、画像 、Mermaid 図 ```mermaid、絵文字 :rocket: など。HTML エスケープやタグ生成は不要で、素の Markdown をそのまま書きます。
コードフェンスに csharp / json / diff などの言語名を付けると、同梱の highlight.js がシンタックスハイライトします。
注意: フッターに page/total を出す場合は、ページ送りのたびに page の値を更新すること。
テーマ(配色テーマ)
スライドの配色は 4 つのテーマから選べます。テーマはデッキ全体に 1 つだけ適用し、load_deck の theme パラメーターで指定します(個々のスライドの front matter には書かないのが基本)。
| テーマ | 見た目 |
|---|
dark | 既定。落ち着いた紺色の背景+明るいアクセントのダークテーマ |
light | 白基調の明るく中立なテーマ(特定ブランドに寄らない汎用ライト) |
microsoft | Microsoft / Fluent 配色。上部に 4 色バー、kicker に 4 色の四角 |
ms-modern | 社内 PowerPoint テンプレート(2024-07-29-theme.thmx)風。白基調+見出しは Microsoft ブルー、表紙は右上から食い込む Fluent のファセット(多面体)背景 |
どのテーマでも、デッキの末尾に背表紙(Closing logo slide)が自動で 1 枚追加されます。 最終スライドが layout: backcover でなければ拡張機能が既定の背表紙を補います(すでにある場合は追加しません)。agent 側で背表紙を書く必要はありません。背表紙の背景はテーマごとの濃色(dark は紺〜紫、light はインディゴ〜バイオレット、microsoft / ms-modern は Microsoft ブルー)で、ロゴと著作権表示は microsoft / ms-modern のときだけ既定で表示されます。文言やロゴを変えたい・他テーマでも出したいときだけ、末尾に layout: backcover のスライドを自分で用意して logo / copyright を指定します。
テーマの選び方(ユーザーのテイストから判定)
プレゼンを依頼されたとき、ユーザーの言葉にテーマに関わるテイストが含まれていれば、それに合うテーマを選んで load_deck の theme に渡します。判断の目安:
- ms-modern … 「ms-modern」「新しい MS テーマ」「社内テンプレ(で)」など、この新テーマを名指しする表現。
- microsoft … 「マイクロソフトっぽく」「Microsoft / Fluent / Office っぽい」「あの 4 色で」など、Microsoft らしさを示す表現。
- light … 「明るい感じで」「ライトで」「白基調で」「清潔感のある」など、明るい配色を示す表現。
- dark … 「ダークで」「暗めで」「黒っぽく」「クール / かっこよく」など、暗い配色を示す表現。
- 指定なし … テーマに関する言及がなければ
dark(既定) で進めます。
どのテーマか迷うとき、または複数のテイストが混ざるときだけ、ask_user で選択肢(dark / light / microsoft / ms-modern)を尋ねます。明確なテイストがあるなら尋ねずにそのテーマで進めます。
発表の途中で「ライトにして」などテーマ変更を頼まれたら、load_deck を同じ slides と現在の index、新しい theme で呼び直せば、内容はそのまま配色だけ切り替わります。
図(ダイアグラム)と画像
図: Mermaid 記法
```mermaid のコードフェンスに Mermaid 記法を書くと、アプリが図(SVG)として描画します。フローチャート・シーケンス図・クラス図・円グラフなどが使えます。
```mermaid
flowchart LR
A[企画] --> B[実装] --> C[発表]
```
- Mermaid.js は拡張機能に同梱(
.github/extensions/presentation/vendor/)。オフラインでも描画されます。
- 記法に誤りがあってもスライドは空白になりません。エラー表示と他の本文はそのまま表示されます。
画像
- リモート URL:
 をそのまま書けます。
- ローカル画像: リポジトリ直下の
assets/ フォルダーに画像を置き、 で参照します(サブフォルダー・SVG・日本語ファイル名も可。/assets/... の絶対パスで参照すること)。
プレゼン開始の手順
1. 対象 Markdown を特定する
ユーザーの指示(例: 「slides.md に従ってプレゼンして」)から元 Markdown ファイルのパスを決めます。指定が無ければリポジトリ直下の slides.md を既定とし、無い場合は ask_user でパスを尋ねます。
2. Markdown をスライド配列にパースする
- 区切り: 行頭から行末まで完全に
---(ハイフン 3 つのみ)の行をスライド区切りとします。
- コードフェンス内は無視:
``` で囲まれたブロック内の --- は区切りにしません。
- 先頭の front matter: ファイル先頭が
--- で始まる YAML ブロックはデッキ設定(任意)でありスライドではありません。読み飛ばします。
- スライドサイズ指定: 各スライド本文の先頭に
<!-- slide-size: large --> があれば表示用ディレクティブとして扱い、本文から除いて生成する断片の front matter に size: large を設定します。値は auto / normal / large / xlarge です。
- 各スライドの前後の空白をトリムし、空スライドは捨てます。
- 各スライドのタイトル(一覧表示用)は、最初の見出し行、無ければ最初の非空行の先頭 40 文字程度を使います。
- デッキ全体のタイトルは、先頭 front matter の
title、無ければ最初のスライドの見出しを使います。
3. 全スライドの Markdown 断片を一括生成する
ここがプレゼン開始時の主作業です。パースした各ページについて、「スライド断片の生成」のルールに従って全ページ分の Markdown 断片を生成し、表示順に並べた配列を作ります。各断片には page / total のフロントマターを正しい値で埋め込みます(total は総スライド数、page はそのスライドの 1 始まり番号)。元 Markdown に slide-size ディレクティブがあるページは、その値を size として引き継ぎます。指定がなければ size は省略し、canvas の auto 判定に任せます。
このとき、ユーザーの依頼にテーマに関わるテイストがあれば「テーマの選び方」に従って dark / light / microsoft / ms-modern のどれかを決めておき、次の手順 4 で open の input の theme に渡します(言及がなければ dark)。テーマは各スライドの front matter には書かず、デッキ単位で 1 回指定します。
この一括生成はプレゼン開始時に一度だけ行います。あとのページ送りでは断片を作り直しません。
スライド一覧(☰)のタイトルは canvas 側が各断片から自動生成するため、agent が titles を会話メモリに保持する必要はありません。現在位置の管理も canvas(拡張機能)が行います。
4. canvas をデッキごと開く(最初からスライドを表示)
手順 3 で作った配列を、open_canvas の input に渡してネイティブ canvas を開きます。これで canvas を開いた瞬間に最初のスライドが表示され、「スライド未読込」のプレースホルダーを挟みません。open_canvas を 1 回呼ぶだけです:
canvasId: "presentation"
instanceId: "presentation"
input: { "slides": ["<スライド1>", "<スライド2>", ...], "index": 0, "theme": "dark" }(index は省略可・既定 0、theme は省略可・既定 dark。手順 3 で決めたテーマを渡す)
URL の指定は不要で、拡張機能が表示先を用意します。外部サーバーの起動や生存確認は不要です。これでデッキが登録され、最初のスライドが canvas に表示されます。以降のページ送りは canvas 内の操作で完結するので、agent は通常それ以上の操作をしません(次の手順 5 を参照)。
既に開いている canvas を前面に出したいだけのとき(再フォーカス)は、input を付けずに open_canvas を呼びます。同じデッキで input を付け直しても拡張機能側で現在のスライド位置は維持されますが、無用な再登録を避けるため再フォーカス時は input を省略してください。
⚠️ input は JSON です。 本文に半角ダブルクォート " やバックスラッシュ \ を含めるときは、必ず \" / \\ にエスケープしてください(下の「JSON 入力の注意」を必ず参照)。素の " が 1 つでも混ざると open(デッキ登録)全体が失敗します。
⚠️ JSON 入力の注意(最重要・デッキ登録失敗の最頻出原因)
open の input(slides 配列要素)や invoke_canvas_action の input(load_deck の slides 配列要素、show_slide の markdown)は、JSON 文字列として渡されます。つまり、あなたが書くスライド本文の Markdown はすべて JSON の文字列の中身になります。ここで JSON のエスケープを誤ると、input が壊れて正しく渡らず、次のようなエラーでデッキ登録ごと失敗します。
CanvasInputInvalidError: Invalid input for action "load_deck" ... (root): must be object
このエラーは「スキーマが違う」ように見えますが、実際の原因はほぼ常に本文中の未エスケープ文字で JSON が壊れたことです。次のルールを必ず守ってください。
- 本文中の 半角ダブルクォート
" は \" にエスケープする。
- 本文中の バックスラッシュ
\ は \\ にする。
- 改行は
\n で表す(実際の改行文字を文字列内に直接入れない)。
推奨: そもそも素の " を本文に書かない
日本語のプレゼンでは、強調や引用に素の半角 " を使わず、次のいずれかにすると見た目も良く、エスケープ事故を根本から防げます。
- かぎ括弧
「」 / 二重かぎ括弧 『』
- 曲線引用符(全角)
“ ”
Before(壊れる・NG) — 本文に素の " が入っている:
{ "slides": ["## 方針\n\n- サーバーを\"信頼の境界\"にする"] }
↑ この "信頼の境界" の " をそのまま書くと JSON が壊れて失敗します。
After(OK) — 素の " を 「」 に置き換える(推奨)か、\" にエスケープする:
{ "slides": ["## 方針\n\n- サーバーを「信頼の境界」にする"] }
{ "slides": ["## 方針\n\n- サーバーを\"信頼の境界\"にする"] }
どちらでも表示は問題ありません。まず 「」/“” への置き換えを優先し、どうしても素の " を出したいときだけ \" でエスケープしてください。
5. ページ送りはユーザー操作で完結する
canvas をデッキごと開いたら、ページ送りはユーザーが canvas または対応入力デバイスから直接操作します。agent が ask_user でループを回す必要はありません。次の操作が使えます:
- ◀ / ▶ ボタン(画面下中央のバー)… 前へ / 次へ。端ではボタンが無効化されます。
- ⛶ ボタン … Edge / Chrome / Chromium を外部全画面プレゼンとして起動。canvas とページ位置を同期します。
- キーボード …
→ PageDown Space = 次へ、← PageUp = 前へ、Home / End = 先頭 / 末尾、O または Esc = スライド一覧の開閉。
- Surface Pen(Windows) … 末尾ボタンの 1 回押し = 次へ、長押し = 前へ、2 回押し = 外部プレゼン画面(⛶)の起動 / 終了トグル。Bluetooth ペアリングされたペンが生成する
Win+F20 / Win+F18 / Win+F19 を拡張機能が受け取る。利用できない環境では通常の操作へ自動的にフォールバック。
- ☰ スライド一覧 … 全スライドのタイトル一覧を開き、クリックしたページへジャンプ(現在位置はハイライト表示)。
キーボード操作は iframe にフォーカスがあるときに効きます。canvas をクリックするとフォーカスが移ります。確実なのはボタン操作です。
プレゼン開始直後の agent の案内例:
プレゼンを開始しました。スライド送りは canvas 内の ◀ ▶ ボタン、矢印キー(← →)、対応環境では **Surface Pen の末尾ボタン(1 回押しで次へ / 長押しで前へ / 2 回押しで外部全画面のオン・オフ)**で操作できます。全体は ☰(または O キー)で一覧表示できます。
そのうえで agent はユーザーの次の指示を待ちます。ページ送りのために ask_user を繰り返し呼ばないでください。
チャットからページを指定したいとき
ユーザーがチャットで「次のスライド」「3 ページ目に飛んで」「最初に戻して」のように頼んだ場合だけ、agent が goto_slide({ index }、0 始まり)で切り替えます。canvas 側の操作と状態は同期します。
内容そのものを変えたいとき
元 Markdown を編集した・スライドを差し替えたいなど内容自体を変える場合のみ、load_deck を新しい slides(必要なら index / theme)で呼び直してデッキを更新します。
6. 終了処理
- 発表が終わったら、その旨を伝えます。ページ送りループは無いので、特別な終了操作は不要です。
- canvas はそのまま残しておけます。クリアしたい場合は
reset アクションを呼ぶと待機表示に戻ります。
- 停止すべき外部プロセスや一時ファイルはありません。
スライド断片の生成(open / load_deck に渡す配列の各要素)
各スライドは、フロントマター + 本文 Markdown の小さなテキストです。手順 3 でこれを全ページ分作り、配列にまとめて open の input(開始時)または load_deck(再ロード時)の slides 入力に渡します。
配列の各要素はこの程度の Markdown です:
---
deck: Copilot canvas でプレゼンしよう
kicker: Copilot Presentation
page: 2
total: 6
---
## このプレゼンの仕組み
- スライドは **Markdown** の小さな断片だけ
- 変換・装飾・ページ番号は **拡張機能側**が担当
- だから切り替えが **速い** ⚡
ファイルへの書き込みは不要です。open(または load_deck)でデッキ全体を保持し、goto_slide でその中を移動するだけなので、画面が真っ白になることはありません。デッキは拡張機能側でも自動保存され、extensions_reload などが起きても復元されます。
単発でその場限りの 1 枚を出したいときだけ show_slide(input: { markdown })を使えますが、通常のプレゼンでは使いません。
元 Markdown とのマッピング
元ファイル(例 slides.md)の各スライドは、ページごとに内容を判定してから配列の要素にします。
- スライド的なページ(見出し・箇条書き・番号付きリスト・コードブロック・表・Mermaid 図・画像が主体)は、その本文をほぼそのまま使い、先頭に
deck / kicker / page / total(必要なら layout: title)のフロントマターを付けるだけです。
- 自然言語の文章ページ(段落主体のプローズ)は、そのまま貼らずに AI が見出し+箇条書きのスライド形に要約・整形してから配列に入れます。詳しくは次節を参照。
表紙など見出しだけのスライドは layout: title を付けると中央寄せになります。本文は短く、箇条書き中心にすると読みやすく、生成も速くなります。
スライドサイズの明示指定(任意)
元 Markdown のスライド先頭に次のコメントを置くと、そのページだけ自動判定を上書きできます。コメント自体は表示しません。
<!-- slide-size: large -->
## 強調したいスライド
auto: 既定。コード・表・画像・Mermaidを含まない通常スライドを、余白に応じて自動拡大する。
normal: 自動拡大しない。
large: 1段階大きくする。
xlarge: 2段階大きくする。
canvas に直接渡すスライド断片では、同じ値を front matter の size: に書けます。front matter とコメントの両方がある場合は front matter を優先します。
表紙・背表紙の自動付与(既定)
- デッキの先頭スライドが表紙として機能するなら
layout: title を付ける。
- 表紙(
title)は中央寄せになり、専用の背景が付くので本文スライドと見分けられる。
- 元 Markdown のスライドに明示の
layout がある場合は上書きしない。
- デッキの締めは、テーマに関わらず背表紙(
layout: backcover)が拡張機能によって末尾へ自動追加される。agent が書く必要はない。結び/お礼/Q&A/連絡先などのスライドは通常スライドとしてそのまま書けばよく、layout: closing は使わない(廃止済み)。
自然言語の文章をスライド化する
元ページが**普通の文章(段落主体)**のときは、その文章をそのまま画面に流し込むのではなく、スライドとして読みやすい形に組み立て直してから配列に入れます。
ページの判定(自動)
各ページについて、書き込み前に次のように見分けます。
- 見出し(
#/##)・箇条書き(-/1.)・コードブロック・表(|...|)・Mermaid 図・画像が主体なら → スライド的ページ。整形せず本文をほぼそのまま使う(フロントマターのみ付与)。
- 通常の文(段落)が主体で、上記の構造がほとんど無いなら → 文章ページ。下記ルールでスライド化する。
- 迷う場合(一部だけ箇条書きなど)は、読み手にとってスライドとして見やすくなる方を選ぶ。原文の構造が活きているならそのまま、文章が長く読みにくいなら整形する。
文章ページの整形ルール
- 内容の意図・事実を保ち、原文に無い情報を捏造しない(新しい主張・数値・固有名詞を足さない)。要約と再構成のみを行う。
- 短い見出し(そのページの要点を一言で)+ 3〜6 個程度の簡潔な箇条書きにまとめる。各箇条書きは 1 行で読める長さに。
- 重要語だけ
**太字** で控えめに強調。冗長な接続詞や言い回しは削る。
- 原則 1 ページ = 1 スライドに収める。長い文章でも要約して 1 枚に収め、複数スライドへ分割しない。
- フロントマター(
deck / kicker / page / total、表紙なら layout: title)は通常どおり付ける。
- 元ファイルにそのページの見出しがあればそれを活かし、無ければ内容から短い見出しを付ける。
例(Before → After)
元ページ(文章):
私たちのチームは、毎週月曜に進捗を共有しています。各メンバーが先週やったこと、
今週やること、困っていることを順番に話します。これにより、問題の早期発見と、
メンバー間の認識合わせができ、手戻りが減ります。
書き込む断片(スライド形):
---
deck: チーム運営
kicker: 週次ミーティング
page: 3
total: 8
---
## 週次ミーティングのねらい
- 毎週**月曜**に進捗を共有
- 各自「先週 / 今週 / 困りごと」を順番に
- 問題の**早期発見**と認識合わせ
- 結果として**手戻りを削減**
文章を箇条書きへ落とすときは、原文の段落の順序と論点を保つこと。要点を選び、説明文を短いフレーズに言い換えるだけで、新しい内容は加えない。
注意・トラブルシューティング
open(input)/ load_deck / show_slide が (root): must be object(CanvasInputInvalidError / Invalid input)を返すとき: スキーマ違反のように見えても、原因はほぼ常に input の JSON が壊れていることで、本文中の未エスケープ " が最頻出です。対処:
- スライド本文をスキャンし、素の半角
" や \ を探す → 「」/“” へ置き換える(推奨)か、\" / \\ にエスケープする(→「JSON 入力の注意」参照)。
- 不安なときは、まず1 枚だけの最小デッキ(例:
open_canvas の input: { "slides": ["# テスト"] })で canvas の疎通を確認してから、全デッキを送り直す。
- 補足:
goto_slide は { "index": n } だけで本文を含まないため、このエラーは起きません。
- canvas が更新されないとき:
open(input)/ load_deck / goto_slide(または show_slide)がエラーなく { ok: true, version, ... }(open は { url })を返しているか確認。表示が崩れたときは canvas の ◀ ▶ で前後のスライドへ移動すると再描画されます。それでも崩れる場合は open_canvas(canvasId: "presentation", instanceId: "presentation")を再実行して開き直す。
- canvas のボタンやキーが効かないとき: まず canvas をクリックして iframe にフォーカスを当てる(キーボード操作はフォーカスが必要)。ボタンが無効化されているのは先頭/末尾スライドにいるため(仕様)。それでもダメなら canvas を開き直す。
- 「デッキ未登録」エラー(
goto_slide が no_deck を返す)のとき: 先に open の input(または load_deck)でスライド配列を登録する。
- 拡張機能が見つからない/アクションが無いとき:
.github/extensions/presentation/ が存在するか確認し、必要なら拡張機能を再読み込みする。canvas 一覧に presentation が出ていれば利用可能。
- 画像が出ないとき: ローカル画像はリポジトリ直下の
assets/ に置き、/assets/... の絶対パスで参照しているか確認する。
- Mermaid 図が出ないとき: 記法の誤りがあってもスライドは空白にならず、他の本文はそのまま表示される。記法を見直して再送する。