| name | genspark-mtg |
| description | Capture completed Genspark meeting transcripts as raw Inbox files for later core-agent curation. Supports recent-window and task-id modes. |
| version | 3.0.0 |
| author | your-org |
| license | MIT |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["vault","capture","genspark","meeting","vault-capture"],"related_skills":["obsidian"]}} |
genspark-mtg
your-vault の 任意 Genspark 議事録アダプタ(Hermes 側)。ユーザーが指示したタイミングで実行する。
MTG 終了&Genspark 側の整理が済んだ会議をできるだけ早く取得して、
1 会議 = 1 ファイルで Inbox/{capture-date}/mtgs/ に書き出す。
対象は 直近窓(today + yesterday・JST)の COMPLETED 会議に絞る。
join 可否(=文字起こし対象の選択)は Genspark Web UI 側で完結しており(CLI からは切り替え不可・後述)、
参加した会議だけが gsk meeting list に出る。本 skill は出てきたものを取り込むだけで、
「どれを文字起こすか」「どこへ置くか」の判定はしない(=「全部は文字起こさない」は Web UI の join 選択で自動的に満たされる)。
on-demand での 2 モード:本 skill は (a) 直近窓(today + yesterday)の一括取り込み(既定)と (b) --task_id での単一会議手動取得 の両方を担う。どちらも コアエージェントが hermes-query 経由で kick する。
役割境界(重要):このスキルは Inbox/{capture-date}/mtgs/ にのみ書き込む。
Daily/ / Wiki/ / Templates/ / Archive/ / 既存 curated ノート本文は触らない(single-writer)。
no-LLM-judgment:本 skill は [[.codex/rules/inbox-routing.md]] §7 の
no-LLM-judgment 原則に完全準拠する。宛先は固定(Inbox/{capture-date}/mtgs/)であり、判定そのものが存在しない
(「宛先判定のみ LLM judgment 可」のような例外も設けない)。
meetings/ への割り振りは Step 6(夜の振り返り)等で コアエージェント + ユーザーが curate する。
本文の要約・タグ推論・話者整形・編集も従来どおり全面禁止。transcript は必ず取得・保存し、
Genspark 側から summary / user_notes が返る場合のみ、その raw summary/notes も保存する
(Hermes 生成 summary で代替しない)。
Self-edit boundary:自己領域の spec/doc/config を autonomous に編集しない。drift は Inbox/{YYYY-MM-DD}/clippings/hermes-obs-genspark-mtg.md に、共通 6 fields + affected_path / observed_at / evidence / proposed_change / source: "hermes:observation:genspark-mtg:<ISO8601>" を持つ observation note として新規作成する。
single-writer / 冪等性:既存 meeting capture の source または宛先 filename、Daily の正確な source wikilink が見つかれば skip(上書きしない)。
既存ファイルはユーザー / コアエージェントが curate した可能性があるため、Hermes は再書き込みしない。
sidecar state file は持たず、raw capture の frontmatter source: genspark:meeting:<task_id> を provenance / dedupe key にする。
設計の正本:このファイル。
前提・パス解決
- 実行日 / ファイル名の日付は Asia/Tokyo 基準(
TZ=Asia/Tokyo date +%Y-%m-%d)。
- vault ルート解決順:
OBSIDIAN_VAULT_PATH
- 未設定なら
HERMES_HOME から親へ遡り、AGENTS.md + .obsidian* + Inbox/ を持つディレクトリを vault と認定。見つからなければ停止。
gsk は PATH 上にある前提(CLI 仕様は [[.hermes/skills/vault-capture/genspark-slide/SKILL.md]])。
- Python を使う場合は
uv を使う(pip 直接実行は禁止)。
- Windows / WSL どちらでも forward slash 表記で OK。
- Windows / legacy cron pitfall: Python
subprocess.run(["gsk", ...]) may not resolve the shell shim. Prefer the Windows command shim when scripting: C:/Users/<your-user>/AppData/Local/hermes/node/gsk.cmd meeting .... Existing transitional cron uses the same rule; do not create a new job. Tolerate leading log lines by scanning for the first valid JSON object.
GSK の予定取得と会議録取得の切り分け
ユーザーが「Genspark AI Meeting Notes の今後の予定」「会議予定」を求めた場合、gsk meeting list/search/get ではなく calendar 統合を使う。
gsk calendar accounts
gsk calendar list --time_min "YYYY-MM-DDT00:00:00+09:00" --time_max "YYYY-MM-DDT23:59:59+09:00" -a "<calendar-account-email>"
gsk meeting list/search/get は作成済み meeting note / transcript 取得用。
gsk calendar list / gsk google_calendar list は今後の予定取得用。
- 詳細と確認済みコマンドは
references/gsk-calendar-schedules.md を参照。
手順
1. 取得対象列挙(gsk meeting list)
gsk meeting list --output json --page_size 50
- 直近 50 件を毎回なめる方式(durable cursor は持たない)。
- そこから 取得対象=「直近窓(today + yesterday・JST)の
COMPLETED 会議」 に絞る:
status が COMPLETED 以外(処理中・失敗等)→ skip(次回 poll で再評価される)
- 会議日が直近窓より古い → skip(通常 window 外。直近分の重複は
source ID で防ぐ)
- 直近窓に残った会議だけ §2 で本体取得する
- 窓を 2 日(today + yesterday)にする理由:当日夜遅くに Genspark の処理が完了した会議を、翌日の最初の poll で取りこぼさず拾うため(filename 冪等性があるので重複は出ない)。1 日に締めたい場合は窓を today のみへ。
- 返却 JSON の各要素から最低限取り出す:
task_id — 一意 ID(idempotency と source URI の元)
title — 会議タイトル(slug の元)
created_at または会議日相当 — 窓判定と meeting_date に使う(Inbox 親日付には使わない)
status — 上記フィルタに使う
- list が空/窓内に
COMPLETED が無い → 何も書かずに正常終了。
2. 各 meeting の本体取得(gsk meeting get)
gsk meeting get --task_id "<task_id>" --detail_level full --output json
- 取得:
task_id
title
created_at(または会議メタデータ日時)
participants(名前配列。取れない場合は空)
transcription_text / transcript(raw markdown / text)— 常に取得・保存する
summary(Genspark 側の summary。返る場合のみ保存。null なら生成しない)
user_notes(Genspark 側の notes。返る場合のみ保存。null なら生成しない)
transcription_text / transcript が空 / 取得失敗 → その meeting を skip し、完了報告に理由を残す(処理は続行)。
- 会議日が取れない → 実行日の JST を fallback、完了報告に明記。
3. 保存先解決
宛先は固定:Inbox/{capture_date_jst}/mtgs/genspark-{slug}.md(日付つき親フォルダは capture-event date、ファイル名は provider prefix 付き)。判定は行わない。
- 親日付:実行時刻を Asia/Tokyo に正規化した capture-event date。会議日は frontmatter
meeting_date に別保持する。
- slug(meeting title から生成・タイトルはそのまま slug 化する):
- 元タイトルを取る
- 小文字化
- 空白・記号(
[]()/\|:;,.!?@#$%^&*+={}<>~等)を - に置換
- 連続
- を 1 個に畳む
- 先頭末尾の
- を落とす
- 50 文字超なら 50 で切る
- 空になったら
meeting-{task_id_short}(task_id 先頭 8 文字)
4. 冪等性
Inbox/*/mtgs/*.md の frontmatter に同じ source: "genspark:meeting:{task_id}" が存在 → skip(本文は読まない)。
- 宛先に同名ファイルが存在、または
Daily/{capture_date}.md に宛先の正確な wikilink が存在 → skip。Daily link は ownership handoff を意味するため、raw が移動済みでも再作成しない。
- sidecar state file は持たない。
- 同 run 内で別 meeting が同じ宛先 filename に衝突 → 先に書けた 1 件のみ残し、後続は skip + 完了報告に記録。
5. 書き出し
frontmatter + 本文 = Genspark から取得できた raw summary/user_notes(任意) + raw transcript(必須)。
Hermes は summary を生成しない。Genspark 側の summary / user_notes が null の場合は transcript のみ保存する。
Frontmatter テンプレート
宛先は Inbox なので raw-capture path override([[.codex/rules/vault-metadata.md]] §4)に固定:
---
title: "{meeting_title}"
type: "capture"
status: "inbox"
tags: ["meeting", "genspark"]
created: {capture_date_jst}
updated: {capture_date_jst}
source: "genspark:meeting:{task_id}"
genspark_task_id: "{task_id}"
meeting_title: "{meeting_title}"
meeting_date: {meeting_date_jst}
participants: [{participant1}, {participant2}, ...]
transcript_length: {character_count_of_raw_transcript}
genspark_summary_present: {true|false}
genspark_user_notes_present: {true|false}
---
- raw transcript の
type: capture / status: inbox は不変。コアが別途作る compiled meeting note だけが標準 enum を使う。
created / updated は capture 実行日。meeting_date は 会議日(別物)。
participants は表示名の配列。空なら []。
本文
frontmatter の後ろは以下の順序で書く。
summary が non-empty の場合のみ、Genspark 由来であることが分かる見出しを付けて raw summary を貼る。
user_notes が non-empty の場合のみ、Genspark 由来であることが分かる見出しを付けて raw user_notes を貼る。
- 必ず Genspark から取得した raw transcript markdown/text をそのまま貼る。
Hermes による要約・整形・タグ推論は一切行わない。summary / user_notes が null の場合、transcript から要約を作って補完しない。
6. 完了報告
run の最後に短い実行結果を返す(stdout)。
含める内容:
processed: list 件数
written: 新規作成件数
skipped_existing: 既存 filename で skip
skipped_out_of_window: 直近窓(today + yesterday)より古くて skip
skipped_empty: transcript 欠落で skip
skipped_status: COMPLETED 以外で skip
failed: 取得 / parse 失敗
- 書き込んだパス一覧
meeting 単位の失敗は集計して続行(partial success OK)。
ただし vault 解決失敗 / gsk meeting list 失敗 → run 全体を失敗扱いで停止。
あとからの割り振り(curate — Hermes の仕事ではない)
Inbox/{capture_date}/mtgs/ は未割り振りキュー。Step 6(夜の振り返り)や随時の curate で、
コアエージェント + ユーザーが内容を見て Daily/{capture_date}.md に集約しつつ Wiki/meetings/{meeting_date}-{slug}.md へ標準 enum の compiled note を作る。raw transcript 自体は compiled note に変換せず、meeting 例外の扱いに従う。
起動方法(on-demand)
既定 = on-demand:ユーザーが Daily ジョブリストからコアエージェントに指示し、コアが Hermes に委譲する。filename 冪等性があるので二重取得しない。
手動 invoke コマンド
hermes chat -q のスキル指定は -s <skill>(--skill / --workdir というフラグは無い)。vault ルートに cd してから呼ぶ。日本語 Windows では呼び出し前に PYTHONUTF8=1 を設定する(cp932 デコード起因の出力欠落防止 → [[.codex/skills/hermes-query/SKILL.md]])。
cd "<vault root>"
hermes chat -q "Load genspark-mtg and run it for the vault. List recent meetings via gsk meeting list, keep only COMPLETED ones whose meeting date is today or yesterday (JST), fetch each full transcript via gsk meeting get, and write each as RAW transcript markdown to Inbox/<capture-date>/mtgs/genspark-{slug}.md. Preserve meeting_date separately. Skip an existing source ID, filename, or Daily handoff link. No destination judgment, no summarization or body edits. Report counts." -s genspark-mtg -Q --source core-agent
- 手動・任意タイミングの「この会議だけ」取得は本 skill に
--task_id <ID> を渡して同じく hermes 経由で kick する。本 skill は直近窓の一括取り込みと task_id 指定単一取得の両方を担う。
既存環境の日中 polling / evening safety-net cron は過渡期ジョブとして現状維持する。新規登録・変更はせず、Daily ジョブリストから on-demand で実行する。
関連
- [[.codex/rules/inbox-routing.md]] — Inbox 経路の正本(本 skill は §7 に完全準拠)
- [[.codex/rules/agent-boundaries.md]] — エージェント分担・single-writer 原則
- [[.codex/rules/vault-metadata.md]] — frontmatter schema 単一の正(raw-capture path override・curate 時の enum 規則)
- [[.codex/rules/vault-tagging.md]] — tag 体系(
genspark vendor tag は本 skill で初登場)
- [[.codex/rules/wiki-management.md]] — 割り振り先
Wiki/meetings/ の標準命名
- [[.codex/rules/language.md]] — 言語規約
- [[.hermes/skills/vault-capture/genspark-slide/SKILL.md]] —
gsk CLI リファレンス
- [[.hermes/skills/vault-capture/slack-capture/SKILL.md]] — capture skill の structural 参照
- [[Inbox/README.md]]