@ozzylabs/suasor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ # Assistant Skills
2
+
3
+ [ADR-0008](../adr/0008-assistant-skills.md)。自然文トリガのアシスタント skill 群。SSOT は `docs/skills/<name>/SKILL.md`、`suasor skills install` で `.claude/skills/` `.agents/skills/` に展開する。read 系はエージェント自律 OK、write 系は HITL(auto-apply なし、[ADR-0004](../adr/0004-mcp-agent-boundary-and-hitl.md))。
4
+
5
+ > 本ファイルは catalog(責務と発火条件の一覧)。各 skill の本体は `<name>/SKILL.md`(下表の skill 名からリンク)。frontmatter(`name` / 自然文トリガの `description`)+ 駆動する MCP tool flow を持つ。
6
+
7
+ ## Read 系(自律 OK・11)
8
+
9
+ | skill | 発火例 | 主な MCP tool |
10
+ |---|---|---|
11
+ | [`personal-brief`](personal-brief/SKILL.md) | 「今日のまとめ」「最近どう」 | brief / recall.search / task.list / decision.list |
12
+ | [`next-actions`](next-actions/SKILL.md) | 「次に何やる」「優先度高いのは」 | task.list / recall.search |
13
+ | [`catchup`](catchup/SKILL.md) | 「前回以降の差分」「久しぶりに確認」 | (seen-marker ベースの差分要約) |
14
+ | [`find-document`](find-document/SKILL.md) | 「あの資料」「<語>含むファイル」 | search (FTS) |
15
+ | [`research`](research/SKILL.md) | 「`<X>`について調べて」「網羅的に」 | recall.search + search + graph.related + brief |
16
+ | [`meeting-prep`](meeting-prep/SKILL.md) | 「次の会議準備」「明日のMTG前確認」 | source.list(calendar) / recall.search / graph.related |
17
+ | [`decision-rationale`](decision-rationale/SKILL.md) | 「あの決定はなぜ」「Xを選んだ理由」 | decision.list / graph.related / recall.search |
18
+ | [`external-brief`](external-brief/SKILL.md) | 「上司向け週次」「クライアント向け進捗」 | task.list(completed) / decision.list / brief |
19
+ | [`pr-review`](pr-review/SKILL.md) | 「PR #N レビューして」 | recall.search (+ gh diff) |
20
+ | [`handoff-draft`](handoff-draft/SKILL.md) | 「引き継ぎ書作って」 | task.list / decision.list / recall.search(text-only・persist なし) |
21
+ | [`announcement-draft`](announcement-draft/SKILL.md) | 「リリース告知文」 | recall.search / decision.list / brief(text-only・persist なし) |
22
+
23
+ > **MCP tool 注記:** 上表の `brief` / `graph.related` は計画中で未提供([mcp-surface.md](../design/mcp-surface.md) の「後続 Issue」)。該当 skill は当面、提供済みの read tool(`recall.search` / `search` / `*.list`)を組み合わせて動作する。
24
+
25
+ ## HITL write 系(人の承認で適用・4)
26
+
27
+ | skill | 発火例 | 主な MCP tool |
28
+ |---|---|---|
29
+ | [`reply-draft`](reply-draft/SKILL.md) | 「返信案考えて」「下書き作って」 | propose.generate(reply_draft) → propose.apply |
30
+ | [`inbox-triage`](inbox-triage/SKILL.md) | 「受信箱整理して」「未処理捌いて」 | inbox.list → propose.generate(inbox_triage) → task.create / propose.apply |
31
+ | [`source-extract`](source-extract/SKILL.md) | 「この資料からタスク抽出」 | source.get → propose.generate(source_extract) → propose.apply |
32
+ | [`meeting-followup`](meeting-followup/SKILL.md) | 「会議後のaction items」「議事録からタスク」 | source.list(calendar) → propose.generate(meeting_followup) → propose.apply |
33
+
34
+ エコシステム共通 dev skill(drive / lint / commit / ship / pr / review 等)は `@ozzylabs/skills` 経由で別供給(名前空間 disjoint)。
35
+
36
+ ## インストール
37
+
38
+ SSOT(本ディレクトリ)はパッケージに同梱され、`suasor skills install` でエージェントの skill ディレクトリに展開する([ADR-0008](../adr/0008-assistant-skills.md)・[docs/design/cli.md](../design/cli.md))。
39
+
40
+ ```bash
41
+ suasor skills install # カレントプロジェクトの .claude/skills/ + .agents/skills/ へ展開
42
+ suasor skills install --scope claude # Claude Code(.claude/skills/)のみ
43
+ suasor skills install --scope agents # Codex / Copilot / Gemini(.agents/skills/)のみ
44
+ suasor skills install --host /path/to/project # 展開先プロジェクトを指定
45
+ suasor skills install --dry-run # 書き込まず差分だけ確認
46
+ suasor skills list # 各 skill の状態(installed / missing / modified)
47
+ suasor skills list --json # 機械可読(SkillStatus[])
48
+ ```
49
+
50
+ 展開は冪等で、内容一致は `unchanged`・欠落は `created`・差分は SSOT 内容で `updated` に上書きする。`suasor init` は本コマンドを案内するのみで自動展開はしない。
51
+
52
+ ### in-repo dogfood
53
+
54
+ 本リポジトリは展開結果(`.claude/skills/` / `.agents/skills/`)を commit して dogfood する。SSOT を編集したら `suasor skills install` を再実行して mirror を更新し、両方を commit する。pre-commit の `skills-drift` フック(`scripts/skills-drift.sh`)が SSOT ↔ mirror の同期を検査し、ずれていれば commit を止める。
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: announcement-draft
3
+ description: 「リリース告知文書いて」「announcement 作って」「アナウンス文章まとめて」「release notes 草案」「お知らせ案ほしい」と頼まれたら、Suasor MCP の recall.search(関連 release / change context)+ decision.list(recorded_after=last_release)+ brief(告知 tone)を読み取り系で組み立て、ホスト LLM が告知文 text を構成して返す。persist しない(text-only)。propose 経路を持たず、ユーザーが手で SaaS に投稿する。
4
+ ---
5
+
6
+ # announcement-draft
7
+
8
+ リリース告知文 / お知らせの text を組み立てる。read-only・text-only。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「リリース告知文書いて」「announcement 作って」「アナウンス文章まとめて」
13
+ - 「release notes 草案」「お知らせ案ほしい」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. `recall.search` で関連 release / change context を引く(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
20
+ 2. `decision.list`(`recordedAfter=last_release`)で前回リリース以降に記録された決定・変更を引く
21
+ 3. `brief` で告知 tone のまとめ素材を作る(LLM 要約。委譲先で生成、[ADR-0006](../../adr/0006-ml-delegation.md))
22
+ 4. ホスト LLM が告知文 text(ハイライト / 変更点 / 影響 / 次のステップ)を構成して返す
23
+
24
+ ## 制約
25
+
26
+ - read-only。persist しない(text-only)
27
+ - `propose.generate` を経由せず候補保存 / apply 経路を持たない
28
+ - ユーザーが受け取った text を手で SaaS(Slack / Notion / GitHub release / メール 等)に投稿する
29
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: catchup
3
+ description: 「前回以降の差分」「久しぶりに確認」「最後に見てから何が変わった」「不在中の動き」と頼まれたら、ホスト側で保持する seen-marker(最終確認時刻)を since として、Suasor MCP の source.list / task.list / decision.list / inbox.list を時間フィルタで合成し、前回以降の差分だけを要約する。専用 MCP tool は使わない。
4
+ ---
5
+
6
+ # catchup
7
+
8
+ 「前回確認した時点からの差分」を組み立てる。15 skill のうち本 skill だけ専用 MCP tool を持たず、既存 read tool + host 側 seen-marker で合成する(mcp-surface レビュー D1 確定)。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「前回以降の差分」「久しぶりに確認」「最後に見てから何が変わった」「不在中の動き」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。**専用 tool は追加しない**([mcp-surface.md](../../design/mcp-surface.md) の D1 方針)。
17
+
18
+ 1. seen-marker(最終確認時刻)を `since` として取る。marker は **host(Claude Code 等)側で保持**する。server は永続 marker を持たない(local-first / stateless read surface)
19
+ 2. `since` を各 read tool の下限 inclusive 時間フィルタに渡して差分を集める:
20
+ - `source.list`(`observedAfter=since`)— 新規・更新ソース
21
+ - `task.list`(`updatedAfter=since`)— 動いた task
22
+ - `decision.list`(`recordedAfter=since`)— 記録された決定
23
+ - `inbox.list`(`updatedAfter=since`)— 仕分けの変化
24
+ 3. ホスト LLM が「前回以降に何が変わったか」として要約して返す
25
+ 4. 応答後、host 側で seen-marker を現在時刻に更新する(次回 catchup の `since`)
26
+
27
+ ## 制約
28
+
29
+ - read-only。persist しない。server 側に marker を残さない
30
+ - 時間フィルタは下限 inclusive(`>=`)/ 上限 exclusive(`<`)。`since = last_seen` を各 `*After` に渡す
31
+ - server 側 marker が必要と判断された場合に限り、別 Issue で専用 `catchup` read tool を検討する(本 skill の scope 外)
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: decision-rationale
3
+ description: 「あの決定はなぜ」「X を選んだ理由」「Y の決定経緯」「なんで A じゃなくて B にしたんだっけ」「この方針の根拠は?」と聞かれたら、Suasor MCP の decision.list(期間 / トピック絞り)+ graph.related(decision から関連 source / 先行 decision へ provenance を辿る)+ recall.search(関連 context の補強)を組み合わせ、決定 + 経緯 + 関連 source + 関連 prior decisions のサマリを返す。read-only。
4
+ ---
5
+
6
+ # decision-rationale
7
+
8
+ 過去の決定の「なぜ」を provenance を辿って組み立てる。read-only。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「あの決定はなぜ」「X を選んだ理由」「Y の決定経緯」
13
+ - 「なんで A じゃなくて B にしたんだっけ」「この方針の根拠は?」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。`decisions` projection は `rationale` + provenance(`links`)を保持する([data-model.md](../../design/data-model.md))。
18
+
19
+ 1. `decision.list`(`recordedAfter` / `recordedBefore` で期間絞り)で対象決定を引く。各 decision は `title` / `rationale` / `recorded_at`
20
+ 2. `graph.related` で当該 decision を起点に、関連 source(根拠になったやりとり)/ 先行 decision(先立つ判断)へ `links` を辿る
21
+ 3. `recall.search` で関連 context を補強する(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
22
+ 4. 決定 + 経緯(rationale)+ 関連 source + 関連 prior decisions のサマリを組み立てて返す
23
+
24
+ ## 制約
25
+
26
+ - read-only。persist しない
27
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: external-brief
3
+ description: 「上司向け週次報告」「クライアント向け進捗まとめ」「外向きステータス」「マネージャーに送る report」「お客さんに見せる進捗」と頼まれたら、Suasor MCP の task.list(state=completed, updated_after=対象期間開始)と decision.list(recorded_after=対象期間開始)を組み合わせて完了タスク + 意思決定を引き、brief で外向き tone のまとめを返す。persist なし。
4
+ ---
5
+
6
+ # external-brief
7
+
8
+ 外向き(上司 / クライアント)の進捗レポートを組み立てる。read-only。pair: 自分向けは [personal-brief](../personal-brief/SKILL.md)。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「上司向け週次報告」「クライアント向け進捗まとめ」「外向きステータス」
13
+ - 「マネージャーに送る report」「お客さんに見せる進捗」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. 対象期間の開始を ISO 8601 で決める(既定は直近 1 週間)
20
+ 2. `task.list`(`state=completed`、`updatedAfter=対象期間開始`)で完了 task を引く
21
+ 3. `decision.list`(`recordedAfter=対象期間開始`)で記録された意思決定を引く
22
+ 4. `brief` で外向き tone のまとめを生成する(LLM 要約。委譲先で生成、[ADR-0006](../../adr/0006-ml-delegation.md))。内部のみの未確定事項・生本文は外向きから落とす
23
+ 5. 外向きレポート text を返す
24
+
25
+ ## 制約
26
+
27
+ - read-only。persist しない(text-only)
28
+ - 外部 SaaS への送信はしない。ユーザーが受け取った text を手で送る
29
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: find-document
3
+ description: 「あの資料どこ」「先週共有された PDF」「<キーワード>含むファイル」「あの議事録」「あの Doc」と頼まれたら、Suasor MCP の search(FTS5 全文検索)で本文ベースに横断検索し、connector 取り込み済みの source を返す。意味検索が要るときは recall.search を補助的に併用する。外部 SaaS を直接叩かない。
4
+ ---
5
+
6
+ # find-document
7
+
8
+ 取り込み済み source を本文ベースで横断検索して「あの資料」を見つける。FTS-first([ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「あの資料どこ」「先週共有された PDF」「<キーワード>含むファイル」「あの議事録」「あの Doc」「あのメール」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。外部 SaaS は直接叩かず、local projection の保持本文([ADR-0003](../../adr/0003-local-first-and-content-minimization.md))だけを検索する。
17
+
18
+ 1. `search`(FTS5、[retrieval.md](../../design/retrieval.md))で query を本文全文検索する。返り値 `hits[]` は `externalId` / `sourceType` / `observedAt` / `score`(bm25 昇順=より関連)/ `body`、および `strategy`(`fts` | `like-fallback`)
19
+ 2. 必要なら `source.list`(`sourceType` 絞り / `observedAfter` / `observedBefore`)で source 種別・期間を絞り込む
20
+ 3. 本文全体が要れば `source.get`(`externalId`)で取得する
21
+ 4. 意味検索ハイブリッドが要る場合のみ `recall.search` を補助的に併用する(embedding 無効時は `signal: embedding_disabled` を見て `search` に寄せる)
22
+ 5. 該当 source を提示して返す
23
+
24
+ ## 制約
25
+
26
+ - read-only。本文取得は read 経路のみ。外部 SaaS API を直接呼ばない
27
+ - 短クエリは `search` が `like-fallback` に切り替わる([retrieval.md](../../design/retrieval.md))
28
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: handoff-draft
3
+ description: 「引き継ぎ書作って」「handoff 書く」「後任向け資料まとめて」「業務引継メモほしい」と頼まれたら、Suasor MCP の task.list(state=in_progress)+ decision.list + recall.search + graph.related を読み取り系で組み立て、ホスト LLM が引き継ぎ書 text を構成して返す。persist しない(text-only)。propose 経路を持たず、ユーザーが手で SaaS に貼り付ける。
4
+ ---
5
+
6
+ # handoff-draft
7
+
8
+ 後任向けの引き継ぎ書 text を組み立てる。read-only・text-only。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「引き継ぎ書作って」「handoff 書く」「後任向け資料まとめて」「業務引継メモほしい」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
17
+
18
+ 1. `task.list`(`state=in_progress`)で進行中 task を引く(=引き継ぐべき作業)
19
+ 2. `decision.list` で関連する決定・方針を引く(後任が背景を理解できるよう)
20
+ 3. `recall.search` で各 task の関連やりとりを補強する(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
21
+ 4. `graph.related` で task / decision に紐づく source を辿り、参照先をまとめる
22
+ 5. ホスト LLM が引き継ぎ書 text(進行中作業 / 背景決定 / 関連資料 / 次の一手)を構成して返す
23
+
24
+ ## 制約
25
+
26
+ - read-only。persist しない(text-only)
27
+ - `propose.generate` を経由せず候補保存 / apply 経路を持たない
28
+ - ユーザーが受け取った text を手で SaaS(Notion / Confluence / docs / Slack 等)に貼り付ける
29
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: inbox-triage
3
+ description: 「受信箱整理して」「inbox 仕分けて」「未処理アイテム捌いて」「pending を片付けて」と頼まれたら、Suasor MCP の inbox.list(state=open)で未処理アイテムを集め、propose.generate(mode=inbox_triage)で各アイテムへの action 候補(task 化 / decision 記録)を生成し、ユーザー確認後に propose.apply で承認分のみ保存する。auto-apply 経路は存在しない。
4
+ ---
5
+
6
+ # inbox-triage
7
+
8
+ 未処理 inbox を仕分ける HITL write skill。各アイテムを task 化 / decision 記録 / dismiss する action 候補を提案し、承認分のみ適用する([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「受信箱整理して」「inbox 仕分けて」「未処理アイテム捌いて」「pending を片付けて」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ read で集めて、write は HITL。**auto-apply 経路は存在しない**([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
17
+
18
+ 1. `inbox.list`(`state=open`)で未処理アイテムを集める。各 item は `source_external_id` / `state` / `updated_at`
19
+ 2. `propose.generate`(mode=`inbox_triage`)で各アイテムへの action 候補を生成する。候補は次のいずれか:
20
+ - **task 化** — `task.create`(write tool)に渡す task 候補。`TaskProposed` event に対応
21
+ - **decision 記録** — `DecisionRecorded` に対応する候補
22
+ - **仕分け** — `InboxItemTriaged`(state: snoozed / done / dismissed)に対応する候補
23
+ 3. **生成した action 候補一式をユーザーに提示して確認を取る**(native framing: ホスト側で人の承認を促す)
24
+ 4. ユーザーが承認した候補のみ `propose.apply` で保存する(idempotent)。task 化を含む場合も承認後に適用する
25
+
26
+ ## 制約
27
+
28
+ - HITL。人の承認なしに `propose.apply` / `task.create` を呼ばない。auto-apply しない
29
+ - `inbox.state` の語彙: `open` / `snoozed` / `done` / `dismissed`([data-model.md](../../design/data-model.md))
30
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: meeting-followup
3
+ description: 「会議後の action items」「ミーティングのフォローアップ」「議事録から task 抽出」「打ち合わせのフォロー」と頼まれたら、Suasor MCP の source.list(calendar source)で直近の会議を集め、source.get で議事録を読み recall.search で関連やりとりを引いた上で、propose.generate(mode=meeting_followup)で task / decision 候補を生成し、ユーザー確認後に propose.apply で承認分のみ保存する。auto-apply 経路は存在しない。
4
+ ---
5
+
6
+ # meeting-followup
7
+
8
+ 会議後に action items を抽出する HITL write skill([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。pair: 会議前は [meeting-prep](../meeting-prep/SKILL.md)。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「会議後の action items」「ミーティングのフォローアップ」「議事録から task 抽出」
13
+ - 「昨日の会議どうだった」「打ち合わせのフォロー」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read で集め、write は HITL。**auto-apply 経路は存在しない**([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. `source.list`(calendar の `sourceType`、`observedBefore=now` で直近)で対象会議を集める
20
+ 2. `source.get`(`externalId`)で議事録 / 関連やりとりを読む
21
+ 3. `recall.search` で会議トピックの関連 context を引く(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
22
+ 4. `propose.generate`(mode=`meeting_followup`)で task / decision 候補を生成する(`TaskProposed` / `DecisionRecorded` 候補に対応、[data-model.md](../../design/data-model.md))
23
+ 5. **生成した候補一式をユーザーに提示して確認を取る**(native framing: ホスト側で人の承認を促す)
24
+ 6. ユーザーが承認した候補のみ `propose.apply` で保存する(idempotent)
25
+
26
+ ## 制約
27
+
28
+ - HITL。人の承認なしに `propose.apply` を呼ばない。auto-apply しない
29
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: meeting-prep
3
+ description: 「来週の会議準備」「明日のミーティング前確認」「次の会議の context」「<会議名> の準備して」「打ち合わせ前に状況教えて」と頼まれたら、Suasor MCP の source.list(calendar source)で該当 event を引き、recall.search で過去の関連やりとり、graph.related で関連 decisions / sources を辿り、会議準備サマリ(目的 / 過去文脈 / 関連 decisions / 参考 sources)を組み立てる。read-only、persist なし。
4
+ ---
5
+
6
+ # meeting-prep
7
+
8
+ 次の会議に向けた context を組み立てる。read-only。pair: 会議後は [meeting-followup](../meeting-followup/SKILL.md)。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「来週の会議準備」「明日のミーティング前確認」「次の会議の context」
13
+ - 「<会議名> の準備して」「打ち合わせ前に状況教えて」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. `source.list`(calendar の `sourceType`、`observedAfter` / `observedBefore` で対象期間)で該当 calendar event を引く
20
+ 2. `source.get`(`externalId`)で event 本文・議題を取る
21
+ 3. `recall.search` で過去の関連やりとりを引く(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
22
+ 4. `graph.related` で関連 decisions / sources を辿る
23
+ 5. 会議準備サマリ(目的 / 過去文脈 / 関連 decisions / 参考 sources)を組み立てて返す
24
+
25
+ ## 制約
26
+
27
+ - read-only。persist しない
28
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: next-actions
3
+ description: 「次に何をする?」「やること教えて」「タスク何が残ってる?」「今日やること」「優先度高いのは?」と聞かれたら、Suasor MCP の task.list と recall.search を使って優先度順の next-actions を組み立てる。新規 task 作成は write tool(task.create)のためホスト側で人確認を促す。
4
+ ---
5
+
6
+ # next-actions
7
+
8
+ 未処理 task を優先度順に並べて「次にやること」を返す。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「次に何をする?」「やること教えて」「タスク何が残ってる?」
13
+ - 「今日やること」「今週やること」「来週やること」「優先度高いのは?」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. `task.list`(`state=open` / `state=in_progress`)で未完 task を取る。期間指定があれば `updatedAfter` / `updatedBefore`(ISO 8601、`tasks.updated_at` ベース)でフィルタする
20
+ 2. `recall.search` で各 task に関連する context を補強する(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
21
+ 3. ホスト LLM が緊急度・依存・期日から優先度順に並べて next-actions を組み立てて返す
22
+
23
+ ## 制約
24
+
25
+ - read-only。task の状態を変えない
26
+ - **新規 task の作成は `task.create`(write tool)のため、ここでは行わず、ホスト側で人の確認を促す**(HITL、auto-apply なし、[ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))
27
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: personal-brief
3
+ description: 「今日のまとめ」「今週どうなってる」「最近どう」「自分の状況」「先週の振り返り」と聞かれたら、指定期間(既定は直近 24h)の主要な動きを自分向けにまとめる。Suasor MCP の brief / recall.search / task.list / decision.list / inbox.list を読み取り系で組み合わせて要約する。
4
+ ---
5
+
6
+ # personal-brief
7
+
8
+ 自分向けの状況サマリ。「最近どうなってる」を read-only で組み立てる。pair: 外向きは [external-brief](../external-brief/SKILL.md)。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「今日のまとめ」「今週どうなってる」「今月の動き」「先週の状況」「先月の振り返り」
13
+ - 「最近どうなってる」「状況教えて」「自分の状況」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ すべて read tool([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。副作用なし・エージェント自律 OK。
18
+
19
+ 1. 期間を決める。明示がなければ直近 24h。ISO 8601(offset 付き)の `since` を作る
20
+ 2. `brief` で期間サマリを取る(LLM 要約。委譲先で生成、[ADR-0006](../../adr/0006-ml-delegation.md))
21
+ 3. 補強が要れば次を時間フィルタ付きで叩く(下限 inclusive `*After` / 上限 exclusive `*Before`):
22
+ - `task.list`(`updatedAfter=since`)— 動いた task
23
+ - `decision.list`(`recordedAfter=since`)— 記録された決定
24
+ - `inbox.list`(`state=open`)— 未処理シグナル
25
+ - `recall.search` — トピックの関連 context(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
26
+ 4. 集めた結果をホスト LLM が「主要な動き」として要約して返す
27
+
28
+ ## 制約
29
+
30
+ - read-only。persist しない(イベントを書かない)
31
+ - LLM 推論ループは外部ホスト(Claude Code 等)側。本 skill は手順書のみで実処理を持たない
32
+ - 時間窓は各 projection の自然な timestamp 列が対象(task/inbox=`updated_at`、decision=`recorded_at`)
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: pr-review
3
+ description: 「この PR レビューして」「#123 確認して」「PR どう思う」と頼まれたら、Suasor MCP の recall.search で関連 source / decision / 過去 review を引き、必要に応じて gh pr diff の出力を組み合わせてレビュー観点を提示する。read 系のみで構成し、PR への comment 投稿は外部送信扱いのため本 skill では行わない。
4
+ ---
5
+
6
+ # pr-review
7
+
8
+ PR に対し、過去の決定・関連やりとりを踏まえたレビュー観点を提示する。read-only。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「この PR レビューして」「#123 確認して」「PR どう思う」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ Suasor MCP は read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。diff は host の `gh` CLI から取る。
17
+
18
+ 1. `recall.search` で PR のトピックに関連する source / decision / 過去 review を引く(embedding 無効時は `signal: embedding_disabled` を見て `search`(FTS)へフォールバック、[ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))
19
+ 2. `decision.list` で当該領域の既存方針・決定を引き、PR がそれに沿っているか照合する
20
+ 3. 必要なら host 側で `gh pr diff <N>` の出力を組み合わせて差分を読む
21
+ 4. レビュー観点(過去決定との整合 / 関連やりとりとの矛盾 / 抜け)を提示して返す
22
+
23
+ ## 制約
24
+
25
+ - read-only。Suasor から PR を変更しない
26
+ - **PR への comment 投稿は外部送信扱いのため本 skill では行わない**(HITL、[ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。観点を提示し、投稿はユーザー / dev skill 側に委ねる
27
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: reply-draft
3
+ description: 「返信案を考えて」「下書き作って」「これに返信したい」と頼まれたら、Suasor MCP の propose.generate(reply_draft mode、reply_to_source_id 指定)で返信下書きを生成し、ユーザー確認後に propose.apply で承認分のみ保存する。外部 SaaS への送信はせず、ユーザーが下書きを確認して手で送る。HITL(auto-apply なし)。
4
+ ---
5
+
6
+ # reply-draft
7
+
8
+ 返信下書きを生成する HITL write skill。生成だけでは送信も保存もしない([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「返信案を考えて」「下書き作って」「これに返信したい」
13
+
14
+ ## 何をするか(MCP tool flow)
15
+
16
+ write tool は HITL。**auto-apply 経路は存在しない**([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
17
+
18
+ 1. 返信元 source を特定する(必要なら `source.get` / `search` で `externalId` を確定)
19
+ 2. `propose.generate`(mode=`reply_draft`、`reply_to_source_id=<externalId>`)で返信下書き候補を生成する。これは `ReplyDraftProposed` event(HITL・未適用、[data-model.md](../../design/data-model.md))に対応する候補で、まだ確定・送信されない
20
+ 3. **生成した下書きをユーザーに提示して確認を取る**(native framing: ホスト側で人の承認を促す)
21
+ 4. ユーザーが承認した候補のみ `propose.apply` で保存する(idempotent)
22
+
23
+ ## 制約
24
+
25
+ - HITL。人の承認なしに `propose.apply` を呼ばない。auto-apply しない
26
+ - 外部 SaaS への送信は行わない。ユーザーが下書きを確認して手で送る
27
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: research
3
+ description: 「<X> について調べて」「<Y> の経緯」「<Z> に関するすべての情報」「<トピック> を網羅的に教えて」と頼まれたら、Suasor MCP の recall.search(意味検索)+ search(FTS5 全文)+ graph.related(関連 entity 拡張)+ brief(統合要約)を順に叩き、sources 一覧 / 関連 entities / 経緯サマリを組み立てて返す。read-only、persist なし。
4
+ ---
5
+
6
+ # research
7
+
8
+ トピックを横断調査して「関連するすべて」を組み立てる。FTS-first([ADR-0005](../../adr/0005-fts-first-retrieval-embedding-sidecar.md))に意味検索とグラフ拡張を重ねる。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「`<X>` について調べて」「`<Y>` の経緯」「`<Z>` に関するすべての情報」
13
+ - 「`<トピック>` を網羅的に教えて」「`<キーワード>` 周りの状況」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read tool のみ([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. `recall.search` で意味的に関連する source を引く(embedding 無効時は `signal: embedding_disabled` を見て次の `search` に寄せる)
20
+ 2. `search`(FTS5)で本文全文検索を重ね、語の一致を取りこぼさないようにする
21
+ 3. `graph.related` でヒットした entity(source / decision / task)を起点に関連 entity を辿る
22
+ 4. `brief` で集めた context を統合要約する(LLM 要約。委譲先で生成、[ADR-0006](../../adr/0006-ml-delegation.md))
23
+ 5. sources 一覧 / 関連 entities / 経緯サマリを組み立てて返す
24
+
25
+ ## 制約
26
+
27
+ - read-only。persist しない
28
+ - 本 skill は手順書のみで実処理を持たない
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: source-extract
3
+ description: 「この資料から task 抽出」「これに含まれる decisions 教えて」「<source_id> から候補を」「このドキュメントから ToDo 拾って」と頼まれたら、Suasor MCP の source.get で対象 source の本文を読み、propose.generate(mode=source_extract)で task / decision / reply_draft 候補を生成し、ユーザー確認後に propose.apply で承認分のみ保存する。auto-apply 経路は存在しない。
4
+ ---
5
+
6
+ # source-extract
7
+
8
+ 特定 source の本文から task / decision / reply_draft 候補を抽出する HITL write skill([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
9
+
10
+ ## いつ発火するか
11
+
12
+ - 「この資料から task 抽出」「これに含まれる decisions 教えて」
13
+ - 「`<source_id>` から候補を」「このドキュメントから ToDo 拾って」
14
+
15
+ ## 何をするか(MCP tool flow)
16
+
17
+ read で本文を取り、write は HITL。**auto-apply 経路は存在しない**([ADR-0004](../../adr/0004-mcp-agent-boundary-and-hitl.md))。
18
+
19
+ 1. 対象 source を特定する(`externalId` 不明なら `search` / `find-document` で確定)
20
+ 2. `source.get`(`externalId`)で対象 source の本文を読む
21
+ 3. `propose.generate`(mode=`source_extract`)で task / decision / reply_draft 候補を生成する(それぞれ `TaskProposed` / `DecisionRecorded` / `ReplyDraftProposed` 候補に対応、[data-model.md](../../design/data-model.md))
22
+ 4. **生成した候補一式をユーザーに提示して確認を取る**(native framing: ホスト側で人の承認を促す)
23
+ 5. ユーザーが承認した候補のみ `propose.apply` で保存する(idempotent)
24
+
25
+ ## 制約
26
+
27
+ - HITL。人の承認なしに `propose.apply` を呼ばない。auto-apply しない
28
+ - 本 skill は手順書のみで実処理を持たない
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@ozzylabs/suasor",
3
+ "version": "0.1.0",
4
+ "description": "A local-first AI secretary that gathers your scattered work context into private memory you and your AI agents can query over MCP. It advises you, and proposes replies, tasks, and decisions, with nothing sent or saved without your approval.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "suasor": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/index.js",
12
+ "docs/skills"
13
+ ],
14
+ "engines": {
15
+ "bun": ">=1.1"
16
+ },
17
+ "devDependencies": {
18
+ "@biomejs/biome": "2.4.14",
19
+ "@types/bun": "^1.1.0",
20
+ "drizzle-kit": "^0.31.10",
21
+ "markdownlint-cli2": "0.21.0",
22
+ "typescript": "^5.6.0"
23
+ },
24
+ "scripts": {
25
+ "dev": "bun run src/index.ts",
26
+ "build": "bun build ./src/index.ts --target=bun --outdir=dist --external @slack/web-api --external @microsoft/microsoft-graph-client --external @azure/msal-node --external googleapis --external box-typescript-sdk-gen --external playwright-core --external @napi-rs/keyring",
27
+ "compile": "bun build ./src/index.ts --compile --outfile=dist/suasor --external @slack/web-api --external @microsoft/microsoft-graph-client --external @azure/msal-node --external googleapis --external box-typescript-sdk-gen --external playwright-core --external @napi-rs/keyring",
28
+ "typecheck": "tsc --noEmit",
29
+ "test": "bun test",
30
+ "lint": "biome check .",
31
+ "lint:md": "markdownlint-cli2 \"**/*.md\"",
32
+ "format": "biome format --write .",
33
+ "db:generate": "drizzle-kit generate"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/ozzy-labs/suasor.git"
38
+ },
39
+ "homepage": "https://github.com/ozzy-labs/suasor",
40
+ "mcpName": "io.github.ozzy-labs/suasor",
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "provenance": true,
44
+ "registry": "https://registry.npmjs.org/"
45
+ },
46
+ "dependencies": {
47
+ "@azure/msal-node": "5.2.4",
48
+ "@microsoft/microsoft-graph-client": "3.0.7",
49
+ "@modelcontextprotocol/sdk": "1.29.0",
50
+ "@napi-rs/keyring": "1.3.0",
51
+ "@slack/web-api": "7.17.0",
52
+ "box-typescript-sdk-gen": "1.19.1",
53
+ "clipanion": "4.0.0-rc.4",
54
+ "drizzle-orm": "^0.45.2",
55
+ "googleapis": "173.0.0",
56
+ "octokit": "5.0.5",
57
+ "playwright-core": "1.60.0",
58
+ "sqlite-vec": "^0.1.9",
59
+ "zod": "^4.4.3"
60
+ },
61
+ "overrides": {
62
+ "uuid": "^11.1.1"
63
+ }
64
+ }