diff --git a/public/registry/index.json b/public/registry/index.json index 11933c2..67fd3ad 100644 --- a/public/registry/index.json +++ b/public/registry/index.json @@ -1,24 +1,24 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "plugins": { - "count": 26, - "updatedAt": "2026-08-12T17:39:20.094Z" + "count": 27, + "updatedAt": "2026-08-12T18:18:58.358Z" }, "themes": { "count": 54, - "updatedAt": "2026-08-12T17:39:20.094Z" + "updatedAt": "2026-08-12T18:18:58.358Z" }, "widgets": { "count": 45, - "updatedAt": "2026-08-12T17:39:20.094Z" + "updatedAt": "2026-08-12T18:18:58.358Z" }, "skills": { - "count": 29, - "updatedAt": "2026-08-12T17:39:20.094Z" + "count": 32, + "updatedAt": "2026-08-12T18:18:58.358Z" }, "queries": { "count": 24, - "updatedAt": "2026-08-12T17:39:20.094Z" + "updatedAt": "2026-08-12T18:18:58.358Z" } } diff --git a/public/registry/plugins.json b/public/registry/plugins.json index 81fbf0b..c91241a 100644 --- a/public/registry/plugins.json +++ b/public/registry/plugins.json @@ -1,7 +1,36 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "plugins": [ + { + "id": "ai-actions", + "name": "ai-actions", + "version": "1.1.0", + "author": "NoteDeck", + "description": "NoteDeck 本体の AI でクリップボードのテキストを処理。翻訳・要約・校正・返信案。結果は通知に出て、クリップボードにも書き戻される。", + "category": "utility", + "capabilities": [ + "notedeck-api" + ], + "tags": [ + "ai", + "clipboard", + "translate", + "summarize" + ], + "sourceUrl": "https://store.notedeck.io/registry/plugins/ai-actions/plugin.is", + "apiUrl": "https://store.notedeck.io/registry/plugins/ai-actions/api.json", + "sha512": "51da012dd60ed6dae7ea5e6c0a5157b03c7efd412f00ef490310b153adfc6baa6c431a55327a552af57f25c34a100ca97ad7a1b1a1231f2f7b238c1a28871d12", + "createdAt": "2026-08-12T18:18:58.359Z", + "updatedAt": "2026-08-12T18:18:58.359Z", + "authorUrl": "https://github.com/notedeck-dev", + "license": "MIT", + "permissions": [ + "ai.invoke", + "clipboard", + "notifications" + ] + }, { "id": "plugin-smith", "name": "Plugin Smith", diff --git a/public/registry/plugins/ai-actions/api.json b/public/registry/plugins/ai-actions/api.json new file mode 100644 index 0000000..f5ae827 --- /dev/null +++ b/public/registry/plugins/ai-actions/api.json @@ -0,0 +1 @@ +{"type":"plugin","data":"/// @ 1.2.1\n// AI Actions — NoteDeck 本体の AI を呼び出すプラグイン。\n//\n// フロー: コマンドパレットから実行 → クリップボードのテキストを読取\n// → ai.chat で本体 AI に問合せ → 結果をデスクトップ通知 + 結果も\n// クリップボードに書き戻す (= 他アプリへ貼り付けやすく)。\n//\n// プロンプトは config で編集可能 (ユーザー自身の用途に合わせて改変可)。\n\n@runAiAction(title, instruction) {\n\tlet clip = Nd:call('clipboard.read', {})\n\tif (clip.text == '' || clip.text == null) {\n\t\tNd:call('ui.notify', {\n\t\t\ttitle: title\n\t\t\tbody: 'クリップボードにテキストがありません。先にコピーしてから実行してください。'\n\t\t})\n\t\treturn null\n\t}\n\tlet result = Nd:call('ai.chat', {\n\t\tprompt: `${instruction}\\n\\n---\\n${clip.text}`\n\t})\n\tlet response = result.response\n\tNd:call('clipboard.write', { text: response })\n\tNd:call('ui.notify', {\n\t\ttitle: title\n\t\tbody: response\n\t})\n}\n\nNd:register_command(\n\t'ai-actions:translate-ja',\n\t'AI Actions: クリップボードを日本語に翻訳',\n\t'ti-language',\n\t@() {\n\t\trunAiAction(\n\t\t\t'翻訳'\n\t\t\t'次のテキストを自然な日本語に翻訳して、訳文だけ返してください。すでに日本語の場合は英語に翻訳してください:'\n\t\t)\n\t},\n\t{ permissions: ['ai.invoke', 'clipboard', 'notifications'] }\n)\n\nNd:register_command(\n\t'ai-actions:summarize',\n\t'AI Actions: クリップボードを要約',\n\t'ti-text-recognition',\n\t@() {\n\t\trunAiAction(\n\t\t\t'要約'\n\t\t\t'次のテキストを 1〜2 文で簡潔に要約してください:'\n\t\t)\n\t},\n\t{ permissions: ['ai.invoke', 'clipboard', 'notifications'] }\n)\n\nNd:register_command(\n\t'ai-actions:proofread',\n\t'AI Actions: クリップボードを校正',\n\t'ti-edit',\n\t@() {\n\t\trunAiAction(\n\t\t\t'校正'\n\t\t\t'次の文章を自然な日本語に校正し、校正後の文だけ返してください:'\n\t\t)\n\t},\n\t{ permissions: ['ai.invoke', 'clipboard', 'notifications'] }\n)\n\nNd:register_command(\n\t'ai-actions:reply-suggest',\n\t'AI Actions: クリップボードへの返信案',\n\t'ti-message',\n\t@() {\n\t\trunAiAction(\n\t\t\t'返信案'\n\t\t\t'次の SNS 投稿に対する自然な返信を 1 つ日本語で提案してください:'\n\t\t)\n\t},\n\t{ permissions: ['ai.invoke', 'clipboard', 'notifications'] }\n)\n"} diff --git a/public/registry/plugins/ai-actions/meta.json b/public/registry/plugins/ai-actions/meta.json new file mode 100644 index 0000000..030ce09 --- /dev/null +++ b/public/registry/plugins/ai-actions/meta.json @@ -0,0 +1,24 @@ +{ + "id": "ai-actions", + "name": "ai-actions", + "version": "1.1.0", + "author": "NoteDeck", + "authorUrl": "https://github.com/notedeck-dev", + "description": "NoteDeck 本体の AI でクリップボードのテキストを処理。翻訳・要約・校正・返信案。結果は通知に出て、クリップボードにも書き戻される。", + "license": "MIT", + "category": "utility", + "capabilities": [ + "notedeck-api" + ], + "tags": [ + "ai", + "clipboard", + "translate", + "summarize" + ], + "permissions": [ + "ai.invoke", + "clipboard", + "notifications" + ] +} diff --git a/public/registry/plugins/ai-actions/plugin.is b/public/registry/plugins/ai-actions/plugin.is new file mode 100644 index 0000000..0ee50fb --- /dev/null +++ b/public/registry/plugins/ai-actions/plugin.is @@ -0,0 +1,80 @@ +/// @ 1.2.1 +// AI Actions — NoteDeck 本体の AI を呼び出すプラグイン。 +// +// フロー: コマンドパレットから実行 → クリップボードのテキストを読取 +// → ai.chat で本体 AI に問合せ → 結果をデスクトップ通知 + 結果も +// クリップボードに書き戻す (= 他アプリへ貼り付けやすく)。 +// +// プロンプトは config で編集可能 (ユーザー自身の用途に合わせて改変可)。 + +@runAiAction(title, instruction) { + let clip = Nd:call('clipboard.read', {}) + if (clip.text == '' || clip.text == null) { + Nd:call('ui.notify', { + title: title + body: 'クリップボードにテキストがありません。先にコピーしてから実行してください。' + }) + return null + } + let result = Nd:call('ai.chat', { + prompt: `${instruction}\n\n---\n${clip.text}` + }) + let response = result.response + Nd:call('clipboard.write', { text: response }) + Nd:call('ui.notify', { + title: title + body: response + }) +} + +Nd:register_command( + 'ai-actions:translate-ja', + 'AI Actions: クリップボードを日本語に翻訳', + 'ti-language', + @() { + runAiAction( + '翻訳' + '次のテキストを自然な日本語に翻訳して、訳文だけ返してください。すでに日本語の場合は英語に翻訳してください:' + ) + }, + { permissions: ['ai.invoke', 'clipboard', 'notifications'] } +) + +Nd:register_command( + 'ai-actions:summarize', + 'AI Actions: クリップボードを要約', + 'ti-text-recognition', + @() { + runAiAction( + '要約' + '次のテキストを 1〜2 文で簡潔に要約してください:' + ) + }, + { permissions: ['ai.invoke', 'clipboard', 'notifications'] } +) + +Nd:register_command( + 'ai-actions:proofread', + 'AI Actions: クリップボードを校正', + 'ti-edit', + @() { + runAiAction( + '校正' + '次の文章を自然な日本語に校正し、校正後の文だけ返してください:' + ) + }, + { permissions: ['ai.invoke', 'clipboard', 'notifications'] } +) + +Nd:register_command( + 'ai-actions:reply-suggest', + 'AI Actions: クリップボードへの返信案', + 'ti-message', + @() { + runAiAction( + '返信案' + '次の SNS 投稿に対する自然な返信を 1 つ日本語で提案してください:' + ) + }, + { permissions: ['ai.invoke', 'clipboard', 'notifications'] } +) diff --git a/public/registry/queries.json b/public/registry/queries.json index e4fb23c..3419dd2 100644 --- a/public/registry/queries.json +++ b/public/registry/queries.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "queries": [ { "id": "no-cw", diff --git a/public/registry/skills.json b/public/registry/skills.json index 48294d0..8f06bae 100644 --- a/public/registry/skills.json +++ b/public/registry/skills.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "skills": [ { "id": "ai-cost-pulse", @@ -55,7 +55,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/aiscript-surgeon/api.json", "sha512": "199c4c993bd1f7c7ea6b6f2d12de2bd7502c9cf01af43ea54c0b6b2ae976a662fc62cbf088415d2200910747baad347f2302ee185670dbe8ce8da785fbfb1f17", "createdAt": "2026-08-04T10:27:22+09:00", - "updatedAt": "2026-08-04T10:27:22+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/aiscript-surgeon/icon.svg" }, { @@ -136,6 +136,49 @@ "license": "MIT", "iconUrl": "https://store.notedeck.io/registry/skills/mfm-reference/icon.svg" }, + { + "id": "notedeck-guide", + "name": "NoteDeck ガイド", + "version": "0.2.0", + "author": "NoteDeck", + "description": "「○○ はどこ?」「使い方は?」のような質問に triggers が反応し、場所を答えてその場で開く提案までするスキル。", + "category": "utility", + "mode": "trigger", + "triggers": [], + "scope": "global", + "tags": [ + "guide", + "onboarding", + "navigation" + ], + "sourceUrl": "https://store.notedeck.io/registry/skills/notedeck-guide/skill.md", + "apiUrl": "https://store.notedeck.io/registry/skills/notedeck-guide/api.json", + "sha512": "256144c9a0fa008fac1d40dd2f335e3e4e629ba77b260abd41a5784866b4183bb17f2886368ce16107a23c72efac8f09b260fb7f7fdfd92963f4e160a28e91df", + "createdAt": "2026-08-12T18:19:01.054Z", + "updatedAt": "2026-08-12T18:19:01.054Z", + "isPersona": false + }, + { + "id": "notedeck-memo", + "name": "NoteDeck メモを尊重する", + "version": "0.2.0", + "author": "NoteDeck", + "description": "ユーザーがローカルに書き溜めたメモを永続的なコンテキストとして扱う", + "category": "utility", + "mode": "always", + "triggers": [], + "scope": "global", + "tags": [ + "memo", + "context", + "pkm" + ], + "sourceUrl": "https://store.notedeck.io/registry/skills/notedeck-memo/skill.md", + "apiUrl": "https://store.notedeck.io/registry/skills/notedeck-memo/api.json", + "sha512": "b3aa60bfc41957d59aed9ded4220e94cdcf6440b24de0ff9b69192bea50ffaaabe28da757a933e4f4b9b7f9552413152d03cf424490dfd6931a47a1191da832a", + "createdAt": "2026-08-12T18:19:01.073Z", + "updatedAt": "2026-08-12T18:19:01.073Z" + }, { "id": "archive-navigator", "name": "アーカイブ案内人", @@ -182,7 +225,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/widget-author/api.json", "sha512": "2f3be7980292aa625381dba5c7bd689c72b637822e53e81f4b5c3a691a7cedac10f245a82b927335cce2336bacb4a536b6d35301bcd0b0fa3eab5484b9360608", "createdAt": "2026-08-04T12:07:50+09:00", - "updatedAt": "2026-08-04T12:10:17+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/widget-author/icon.svg" }, { @@ -254,7 +297,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/skill-author/api.json", "sha512": "fe9b432b4f43ecef1daf47e5098ef9f9a514a7ce5795fada0081d0130a46234768ef1a2be0691211d47b20c9debbe7ddd68e4667f90828e4c90fe390c8db04f4", "createdAt": "2026-08-04T12:07:50+09:00", - "updatedAt": "2026-08-04T12:10:17+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/skill-author/icon.svg" }, { @@ -286,7 +329,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/skill-gardener/api.json", "sha512": "80a7c727faa92c6b732859fb50d41c2616492fdc1ffa7740af9561b1b74a4cc5304bab871371ea949c107fd1089511dddf7b07769200bf7e4e3605996f75bbc2", "createdAt": "2026-08-04T10:27:22+09:00", - "updatedAt": "2026-08-04T10:27:22+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/skill-gardener/icon.svg" }, { @@ -349,7 +392,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/theme-author/api.json", "sha512": "b4aa6ff7036df5520138331f7674af28df85c2adb92cf92539210b5ef8771dfd2a29561238fcd66ea0e684c021ec622e31cd572086f38acf86b3de79e364c6de", "createdAt": "2026-08-04T12:07:50+09:00", - "updatedAt": "2026-08-04T12:10:17+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/theme-author/icon.svg" }, { @@ -367,7 +410,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/theme-reference/api.json", "sha512": "1debab9f4e0e6bfe1bd531f042d406f22cf6dfac87e386e1ddc12f2d0602e3c99075f2b225940473048c1b12470615b2021b55d891a0daa033f4d1c0b7774726", "createdAt": "2026-07-06T22:28:28+09:00", - "updatedAt": "2026-08-04T12:10:17+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/theme-reference/icon.svg" }, { @@ -410,7 +453,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/plugin-author/api.json", "sha512": "c372814f9b4758ceb9e6d5780b6b6431de312be5c4f68e8e0ffc393633519b79babd32f6b7c849413ca99f664586788bc20e14d59f2553095a16b379291fe120", "createdAt": "2026-08-04T12:07:50+09:00", - "updatedAt": "2026-08-04T12:10:17+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "iconUrl": "https://store.notedeck.io/registry/skills/plugin-author/icon.svg" }, { @@ -478,7 +521,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/writing-coach/api.json", "sha512": "6414f61b3dfef99d123d567650e7d4fc394be4c515bdbe0e6b43b2e637cff17ba4b81a811ce9d8386747b0f9f5abee0d06785093e38e6bfa93bc79886ca2ec79", "createdAt": "2026-05-12T11:12:35+09:00", - "updatedAt": "2026-08-04T14:33:48+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "authorUrl": "https://github.com/hitalin", "license": "MIT", "iconUrl": "https://store.notedeck.io/registry/skills/writing-coach/icon.svg" @@ -565,7 +608,7 @@ "apiUrl": "https://store.notedeck.io/registry/skills/seasonal-theme/api.json", "sha512": "34c75452bf01fed40e34928418422180aee0e18faa1156c92c3010978fccf58a9306fb3c70726a38dd471ac7f7fd5c1693de7a20949f9767eef1479fcb5fd3b0", "createdAt": "2026-05-12T11:12:35+09:00", - "updatedAt": "2026-08-04T14:33:48+09:00", + "updatedAt": "2026-08-13T02:40:15+09:00", "authorUrl": "https://github.com/hitalin", "license": "MIT", "iconUrl": "https://store.notedeck.io/registry/skills/seasonal-theme/icon.svg" @@ -616,6 +659,28 @@ "builtIn": true, "iconUrl": "https://store.notedeck.io/registry/skills/translator/icon.svg" }, + { + "id": "self-profile", + "name": "自己プロファイル", + "version": "1.1.0", + "author": "NoteDeck", + "description": "最近のメモを読んで「今の自分」(関心・学習中の事柄・文体の好み・避けたいこと) を常に最新の状態で skill 本文に書き換え続ける自己編集デモ。AI と一緒に育つ IDE の核。", + "category": "analysis", + "mode": "manual", + "triggers": [], + "scope": "global", + "tags": [ + "self-improvement", + "memo", + "profile" + ], + "sourceUrl": "https://store.notedeck.io/registry/skills/self-profile/skill.md", + "apiUrl": "https://store.notedeck.io/registry/skills/self-profile/api.json", + "sha512": "b5b0d34fb9da20602aad466b2e3c193926a28d6ee3142ec46a554c8d23762ade9444c457d0894f3d4ea7a1fa1372343408b5b91dcb85ed2bdb14803e488cbbdd", + "createdAt": "2026-08-12T18:19:01.206Z", + "updatedAt": "2026-08-12T18:19:01.206Z", + "isPersona": false + }, { "id": "improvement-pulse", "name": "自己改善パルス", diff --git a/public/registry/skills/notedeck-guide/api.json b/public/registry/skills/notedeck-guide/api.json new file mode 100644 index 0000000..0f1611b --- /dev/null +++ b/public/registry/skills/notedeck-guide/api.json @@ -0,0 +1 @@ +{"type":"skill","data":"---\nid: notedeck-guide\nname: NoteDeck ガイド\nversion: 0.2.0\ndescription: 「○○ はどこ?」「使い方は?」のような質問に triggers が反応し、場所を答えてその場で開く提案までするスキル。\nauthor: NoteDeck\ncategory: utility\ntags: [guide, onboarding, navigation]\nmode: trigger\ntriggers:\n - どこ\n - ある?\n - ある?\n - 使い方\n - 使いかた\n - やり方\n - 方法\n - 教えて\n - わからない\n - わかんない\n - help\n - ヘルプ\nscope: global\nisPersona: false\n---\n\n# NoteDeck ガイド — 場所を答えて、その場で開く\n\n「投稿どこ?」「使い方は?」と聞くユーザーは **アプリの操作に未習熟で、機能を\n今すぐ動かしたい**。場所だけ答えて終わるのは不親切。場所を答え、必ず\n「いま開きますか?」と提案し、yes なら capability で実際に開く。\n\n## 振る舞いルール (この順で実行)\n\n1. **場所を 1〜2 文で答える** (「ナビバーの ○○ ボタンです」等)\n2. **必ず「いま開きますか? (yes/no)」を末尾に付ける** — 場所だけで終わらない\n3. **ユーザーが yes と答えたら capability を呼ぶ** (`column.add` /\n `windows.open` / `sidebar.toggle` 等)\n4. **状態確認は常に先**: capability を呼ぶ前に `column.list` /\n `navbar.list` / `windows.list` で「既に開いていないか」を確認。\n 既に開いてたら「もう開いていますね」と返して capability は呼ばない\n\n### 重要: 確認モーダルが出ない capability がある\n\n`column.add` / `windows.open` / `sidebar.toggle` は dispatcher の確認モーダル\nを持たない。**この skill 内 yes/no が最終確認**である。「実演しますか?」と\n聞いて確認を取らないまま呼ばないこと。\n\n`navbar.set` / `navbar.reset` だけは dispatcher が確認モーダルを出すので、\nそちらは skill 内 yes/no 不要 (聞かずに呼んでよい)。\n\n## 使う capability\n\n**読み取り (state を変えない、いつでも呼んでよい)**:\n\n- `column.list` — 開いているカラム一覧\n- `navbar.list` — サイドバー (ナビバー) ボタン構成\n- `windows.list` — 開いているウィンドウ一覧\n- `account.current` — アクティブアカウント\n\n**実演 (skill 内 yes/no で同意を取ってから)**:\n\n- `column.add` — 新規カラムを追加\n- `windows.open` — ウィンドウを開く\n- `sidebar.toggle` — サイドバースロットを開閉\n\n## NoteDeck の場所マップ (回答の素材)\n\n聞かれた機能をここから探す。**初心者ツアーとして全部読み上げない**。\n\n### 全体構成\n\n- **左ナビバー**: VSCode Activity Bar 式。各ボタンは「対応するカラムを\n サイドバースロットでトグル」で統一されている。ボタン構成はプロファイル\n ごとにカスタマイズ可能 (デフォルトは notifications / mentions /\n specified / chat / followRequests / search / lookup / widget / ai /\n memos の順)\n- **カラム**: 横並びでドラッグリサイズ可。`column.add` で追加できる主な\n 種別: timeline / notifications / search / list / antenna / favorites /\n clip / channel / user / mentions / chat / ai / memos / explore /\n gallery / drive / federation / charts / pluginManager / themeManager /\n taskRunner / streamInspector / skill 等\n- **ウィンドウ**: 一時的・詳細・インスペクタ用。compose (投稿) / ノート詳細\n / Raw JSON ビュー / settings.json エディタ等\n\n### 投稿・閲覧\n\n- **投稿**: ナビバーの compose ボタン (= compose ウィンドウ起動)。\n capability では `windows.open` で投稿ウィンドウを開ける\n- **下書き**: drafts は専用カラムではなく、compose ウィンドウから保存\n する形 (capability `drafts.list` / `drafts.create` / `drafts.update` /\n `drafts.delete`)\n- **タイムライン (HTL/LTL/STL/GTL)**: `timeline` カラム。同種カラム複数可\n (= 別アカウント分など)。`tl` パラメータで HTL/LTL/STL/GTL を指定\n- **通知**: `notifications` カラム\n- **メンション / ダイレクト指定**: `mentions` / `specified` カラム\n- **検索**: `search` カラム\n- **lookup**: `lookup` カラム (ユーザー / ノート ID 検索)\n- **リスト / アンテナ / チャンネル / クリップ / ユーザータイムライン**:\n それぞれ `list` / `antenna` / `channel` / `clip` / `user` カラム\n (lookup ID が必須)\n- **チャット (Misskey 新 Chat)**: `chat` カラム\n- **お気に入り / リアクション履歴 / アチーブメント / フォロー申請**:\n `favorites` / `achievements` / `followRequests` カラム\n- **ドライブ / ギャラリー / Misskey Play / Pages**: `drive` /\n `gallery` / `play` / `page` カラム\n- **エクスプロア / 連合 / アナウンス / 絵文字一覧**: `explore` /\n `federation` / `announcements` / `emoji` カラム\n\n### AI\n\n- **AI チャット**: `ai` カラム。セッションは `notedeck/sessions/*.json5`\n に永続化、左サイドのセッション一覧から切替\n- **AI 設定**: ナビバー下部の歯車 → AI 設定。プロバイダーは Vault 接続\n として登録 (Anthropic / OpenAI 互換プロトコル対応)\n- **persona / skill**: `skill` カラムで管理・編集\n- **HEARTBEAT (常駐 daemon)**: AI 設定で ON/OFF。tick ごとに\n `mode='heartbeat'` な skill を AI に渡す\n\n### IDE 系\n\n- **Stream Inspector**: `streamInspector` カラム (WebSocket イベント\n リアルタイム監視)\n- **プラグイン管理**: `pluginManager` カラム\n- **テーマ管理**: `themeManager` カラム\n- **タスクランナー**: `taskRunner` カラム\n- **API コンソール / API ドキュメント / サーバー情報**: `apiConsole` /\n `apiDocs` / `serverInfo` カラム\n- **メモ (ローカル Zettelkasten)**: `memos` カラム\n\n### 設定\n\n- **設定メニュー**: ナビバー下部の歯車\n- **設定の場所**: 全設定は `settings.json` に一元化。「ファイル → 設定\n フォルダを開く」で OS のファイラから直接編集可能\n- **テーマ・カスタム CSS**: 設定 → 外観。`custom.css` は独立ファイル\n- **キーバインド**: 設定 → キーバインド\n- **アカウント**: 設定 → アカウント (複数サーバー同時ログイン可)\n- **ナビバー構成**: ボタン構成はプロファイルごとに永続化。\n `navbar.set` capability で AI からも変更可\n\n### インスペクタ系 (ウィンドウ)\n\n- **ノート / 通知 / ユーザー詳細**: タイトルクリックで個別ウィンドウが開く\n- **Raw JSON ビュー**: 詳細ウィンドウから「Raw JSON」を開ける。機密\n マスキング対応 (denylist + 個別 reveal)\n- **settings.json Raw エディタ**: 設定メニューから\n\n## 答え方のテンプレ\n\n```\n[場所の説明 1〜2 文]。いま [機能名] を開きますか? (yes/no)\n```\n\n例:\n\n```\nユーザー: 投稿はどこ?\nあなた: ナビバーの compose ボタンから投稿ウィンドウが開きます。\n いま compose ウィンドウを開きますか? (yes/no)\n\nユーザー: yes\nあなた: [windows.list で既存確認 → なければ windows.open で compose を開く]\n 開きました。\n```\n\n長い解説・関連機能の連鎖紹介・仕組みの説明は **聞かれない限りしない**。\nユーザーが追って質問すれば答える。\n"} diff --git a/public/registry/skills/notedeck-guide/skill.md b/public/registry/skills/notedeck-guide/skill.md new file mode 100644 index 0000000..0d8f891 --- /dev/null +++ b/public/registry/skills/notedeck-guide/skill.md @@ -0,0 +1,168 @@ +--- +id: notedeck-guide +name: NoteDeck ガイド +version: 0.2.0 +description: 「○○ はどこ?」「使い方は?」のような質問に triggers が反応し、場所を答えてその場で開く提案までするスキル。 +author: NoteDeck +category: utility +tags: [guide, onboarding, navigation] +mode: trigger +triggers: + - どこ + - ある? + - ある? + - 使い方 + - 使いかた + - やり方 + - 方法 + - 教えて + - わからない + - わかんない + - help + - ヘルプ +scope: global +isPersona: false +--- + +# NoteDeck ガイド — 場所を答えて、その場で開く + +「投稿どこ?」「使い方は?」と聞くユーザーは **アプリの操作に未習熟で、機能を +今すぐ動かしたい**。場所だけ答えて終わるのは不親切。場所を答え、必ず +「いま開きますか?」と提案し、yes なら capability で実際に開く。 + +## 振る舞いルール (この順で実行) + +1. **場所を 1〜2 文で答える** (「ナビバーの ○○ ボタンです」等) +2. **必ず「いま開きますか? (yes/no)」を末尾に付ける** — 場所だけで終わらない +3. **ユーザーが yes と答えたら capability を呼ぶ** (`column.add` / + `windows.open` / `sidebar.toggle` 等) +4. **状態確認は常に先**: capability を呼ぶ前に `column.list` / + `navbar.list` / `windows.list` で「既に開いていないか」を確認。 + 既に開いてたら「もう開いていますね」と返して capability は呼ばない + +### 重要: 確認モーダルが出ない capability がある + +`column.add` / `windows.open` / `sidebar.toggle` は dispatcher の確認モーダル +を持たない。**この skill 内 yes/no が最終確認**である。「実演しますか?」と +聞いて確認を取らないまま呼ばないこと。 + +`navbar.set` / `navbar.reset` だけは dispatcher が確認モーダルを出すので、 +そちらは skill 内 yes/no 不要 (聞かずに呼んでよい)。 + +## 使う capability + +**読み取り (state を変えない、いつでも呼んでよい)**: + +- `column.list` — 開いているカラム一覧 +- `navbar.list` — サイドバー (ナビバー) ボタン構成 +- `windows.list` — 開いているウィンドウ一覧 +- `account.current` — アクティブアカウント + +**実演 (skill 内 yes/no で同意を取ってから)**: + +- `column.add` — 新規カラムを追加 +- `windows.open` — ウィンドウを開く +- `sidebar.toggle` — サイドバースロットを開閉 + +## NoteDeck の場所マップ (回答の素材) + +聞かれた機能をここから探す。**初心者ツアーとして全部読み上げない**。 + +### 全体構成 + +- **左ナビバー**: VSCode Activity Bar 式。各ボタンは「対応するカラムを + サイドバースロットでトグル」で統一されている。ボタン構成はプロファイル + ごとにカスタマイズ可能 (デフォルトは notifications / mentions / + specified / chat / followRequests / search / lookup / widget / ai / + memos の順) +- **カラム**: 横並びでドラッグリサイズ可。`column.add` で追加できる主な + 種別: timeline / notifications / search / list / antenna / favorites / + clip / channel / user / mentions / chat / ai / memos / explore / + gallery / drive / federation / charts / pluginManager / themeManager / + taskRunner / streamInspector / skill 等 +- **ウィンドウ**: 一時的・詳細・インスペクタ用。compose (投稿) / ノート詳細 + / Raw JSON ビュー / settings.json エディタ等 + +### 投稿・閲覧 + +- **投稿**: ナビバーの compose ボタン (= compose ウィンドウ起動)。 + capability では `windows.open` で投稿ウィンドウを開ける +- **下書き**: drafts は専用カラムではなく、compose ウィンドウから保存 + する形 (capability `drafts.list` / `drafts.create` / `drafts.update` / + `drafts.delete`) +- **タイムライン (HTL/LTL/STL/GTL)**: `timeline` カラム。同種カラム複数可 + (= 別アカウント分など)。`tl` パラメータで HTL/LTL/STL/GTL を指定 +- **通知**: `notifications` カラム +- **メンション / ダイレクト指定**: `mentions` / `specified` カラム +- **検索**: `search` カラム +- **lookup**: `lookup` カラム (ユーザー / ノート ID 検索) +- **リスト / アンテナ / チャンネル / クリップ / ユーザータイムライン**: + それぞれ `list` / `antenna` / `channel` / `clip` / `user` カラム + (lookup ID が必須) +- **チャット (Misskey 新 Chat)**: `chat` カラム +- **お気に入り / リアクション履歴 / アチーブメント / フォロー申請**: + `favorites` / `achievements` / `followRequests` カラム +- **ドライブ / ギャラリー / Misskey Play / Pages**: `drive` / + `gallery` / `play` / `page` カラム +- **エクスプロア / 連合 / アナウンス / 絵文字一覧**: `explore` / + `federation` / `announcements` / `emoji` カラム + +### AI + +- **AI チャット**: `ai` カラム。セッションは `notedeck/sessions/*.json5` + に永続化、左サイドのセッション一覧から切替 +- **AI 設定**: ナビバー下部の歯車 → AI 設定。プロバイダーは Vault 接続 + として登録 (Anthropic / OpenAI 互換プロトコル対応) +- **persona / skill**: `skill` カラムで管理・編集 +- **HEARTBEAT (常駐 daemon)**: AI 設定で ON/OFF。tick ごとに + `mode='heartbeat'` な skill を AI に渡す + +### IDE 系 + +- **Stream Inspector**: `streamInspector` カラム (WebSocket イベント + リアルタイム監視) +- **プラグイン管理**: `pluginManager` カラム +- **テーマ管理**: `themeManager` カラム +- **タスクランナー**: `taskRunner` カラム +- **API コンソール / API ドキュメント / サーバー情報**: `apiConsole` / + `apiDocs` / `serverInfo` カラム +- **メモ (ローカル Zettelkasten)**: `memos` カラム + +### 設定 + +- **設定メニュー**: ナビバー下部の歯車 +- **設定の場所**: 全設定は `settings.json` に一元化。「ファイル → 設定 + フォルダを開く」で OS のファイラから直接編集可能 +- **テーマ・カスタム CSS**: 設定 → 外観。`custom.css` は独立ファイル +- **キーバインド**: 設定 → キーバインド +- **アカウント**: 設定 → アカウント (複数サーバー同時ログイン可) +- **ナビバー構成**: ボタン構成はプロファイルごとに永続化。 + `navbar.set` capability で AI からも変更可 + +### インスペクタ系 (ウィンドウ) + +- **ノート / 通知 / ユーザー詳細**: タイトルクリックで個別ウィンドウが開く +- **Raw JSON ビュー**: 詳細ウィンドウから「Raw JSON」を開ける。機密 + マスキング対応 (denylist + 個別 reveal) +- **settings.json Raw エディタ**: 設定メニューから + +## 答え方のテンプレ + +``` +[場所の説明 1〜2 文]。いま [機能名] を開きますか? (yes/no) +``` + +例: + +``` +ユーザー: 投稿はどこ? +あなた: ナビバーの compose ボタンから投稿ウィンドウが開きます。 + いま compose ウィンドウを開きますか? (yes/no) + +ユーザー: yes +あなた: [windows.list で既存確認 → なければ windows.open で compose を開く] + 開きました。 +``` + +長い解説・関連機能の連鎖紹介・仕組みの説明は **聞かれない限りしない**。 +ユーザーが追って質問すれば答える。 diff --git a/public/registry/skills/notedeck-memo/api.json b/public/registry/skills/notedeck-memo/api.json new file mode 100644 index 0000000..2fa4158 --- /dev/null +++ b/public/registry/skills/notedeck-memo/api.json @@ -0,0 +1 @@ +{"type":"skill","data":"---\nid: notedeck-memo\nname: NoteDeck メモを尊重する\nversion: 0.2.0\ndescription: ユーザーがローカルに書き溜めたメモを永続的なコンテキストとして扱う\nauthor: NoteDeck\ncategory: utility\ntags: [memo, context, pkm]\nmode: always\nscope: global\n---\n\n# NoteDeck ローカルメモの読み方\n\nこのセッションの system prompt には `` ブロックでユーザーが\nローカルに書き溜めた markdown メモが含まれていることがある。\n各メモは以下のいずれかである可能性が高い:\n\n- **ユーザーから AI への指示・好み**\n 例: 「返信は丁寧語で」「絵文字は控えめに」「私は X 言語が母語」\n- **投稿の下書き**\n Misskey に投稿する前のメモ書き。ローカルメモは投稿前の中間状態。\n- **個人的なメモ・知識・WIP**\n AI に必ずしも作用させる意図はないが、文脈として使える材料。\n\n## 振る舞い\n\n1. 「指示・好み」と読めるメモはセッション全体の guidance として尊重する。\n 過去の会話履歴ではなく **ユーザーが今も維持している活きた指示** として扱う。\n2. 「下書き」「個人メモ」と読めるものは参照可能な事実としてだけ扱う。\n ユーザーが言及していないメモを根拠に勝手に tool 呼び出しをしない。\n3. メモの内容と現在のユーザー依頼が衝突するときは、ユーザーに確認する。\n4. 個別のメモを引用するときは「メモに『...』とありました」のように出典を示す。\n\n## メモのフィールド\n\n- `text`: 本文 (markdown)\n- `tags`: 任意の自由記述タグ。ユーザーが skill body 等で意味付ける\n (例: `hidden` で AI 注入除外、`idea` で発想メモ、等)\n- `author`: 作者の埋め込みメタデータ。`id` が `skill:` なら\n AI persona が書いたメモ、それ以外はユーザー本人のメモ。author 未指定 =\n ユーザー本人の暗黙扱い\n\n## メモの作成・更新・整理\n\nユーザーが「これメモっといて」「メモに残しておいて」のように依頼したら、\n`memos.create` capability で新規作成する (`memos.write` 権限が必要)。\n\n- `` block でこのセッションの persona id が指示されていれば、\n `memos.create` の `authorId` 引数にその id を渡す (= persona の作者\n メタデータが memo に埋め込まれて UI で表示される)\n- ユーザー本人のメモなら `authorId` を渡さない (= author 未設定で保存)\n- 既存メモへの追記・編集は `memos.update`、削除は `memos.delete`\n- 整理ポリシーは skill body に書かれている指示に従う (= NoteDeck は値を\n enumerate せず、ユーザーが各自定義する設計)\n\nメモを探すには `memos.list` (絞り込み列挙) / `memos.search` (本文部分一致)。\n`tag` / `authorId` / `olderThanDays` / `query` でフィルタ可能。\n\nいずれの write capability も実行前に確認モーダルが出るので、ユーザー判断を\n尊重すること (= 勝手に大量 create / delete しない)。\n"} diff --git a/public/registry/skills/notedeck-memo/skill.md b/public/registry/skills/notedeck-memo/skill.md new file mode 100644 index 0000000..71c1401 --- /dev/null +++ b/public/registry/skills/notedeck-memo/skill.md @@ -0,0 +1,61 @@ +--- +id: notedeck-memo +name: NoteDeck メモを尊重する +version: 0.2.0 +description: ユーザーがローカルに書き溜めたメモを永続的なコンテキストとして扱う +author: NoteDeck +category: utility +tags: [memo, context, pkm] +mode: always +scope: global +--- + +# NoteDeck ローカルメモの読み方 + +このセッションの system prompt には `` ブロックでユーザーが +ローカルに書き溜めた markdown メモが含まれていることがある。 +各メモは以下のいずれかである可能性が高い: + +- **ユーザーから AI への指示・好み** + 例: 「返信は丁寧語で」「絵文字は控えめに」「私は X 言語が母語」 +- **投稿の下書き** + Misskey に投稿する前のメモ書き。ローカルメモは投稿前の中間状態。 +- **個人的なメモ・知識・WIP** + AI に必ずしも作用させる意図はないが、文脈として使える材料。 + +## 振る舞い + +1. 「指示・好み」と読めるメモはセッション全体の guidance として尊重する。 + 過去の会話履歴ではなく **ユーザーが今も維持している活きた指示** として扱う。 +2. 「下書き」「個人メモ」と読めるものは参照可能な事実としてだけ扱う。 + ユーザーが言及していないメモを根拠に勝手に tool 呼び出しをしない。 +3. メモの内容と現在のユーザー依頼が衝突するときは、ユーザーに確認する。 +4. 個別のメモを引用するときは「メモに『...』とありました」のように出典を示す。 + +## メモのフィールド + +- `text`: 本文 (markdown) +- `tags`: 任意の自由記述タグ。ユーザーが skill body 等で意味付ける + (例: `hidden` で AI 注入除外、`idea` で発想メモ、等) +- `author`: 作者の埋め込みメタデータ。`id` が `skill:` なら + AI persona が書いたメモ、それ以外はユーザー本人のメモ。author 未指定 = + ユーザー本人の暗黙扱い + +## メモの作成・更新・整理 + +ユーザーが「これメモっといて」「メモに残しておいて」のように依頼したら、 +`memos.create` capability で新規作成する (`memos.write` 権限が必要)。 + +- `` block でこのセッションの persona id が指示されていれば、 + `memos.create` の `authorId` 引数にその id を渡す (= persona の作者 + メタデータが memo に埋め込まれて UI で表示される) +- ユーザー本人のメモなら `authorId` を渡さない (= author 未設定で保存) +- 既存メモへの追記・編集は `memos.update`、削除は `memos.delete` +- 整理ポリシーは skill body に書かれている指示に従う (= NoteDeck は値を + enumerate せず、ユーザーが各自定義する設計) + +メモを探すには `memos.list` (絞り込み列挙) / `memos.search` (本文部分一致)。 +`tag` / `authorId` / `olderThanDays` / `query` でフィルタ可能。 + +いずれの write capability も実行前に確認モーダルが出るので、ユーザー判断を +尊重すること (= 勝手に大量 create / delete しない)。 diff --git a/public/registry/skills/self-profile/api.json b/public/registry/skills/self-profile/api.json new file mode 100644 index 0000000..b2e03bf --- /dev/null +++ b/public/registry/skills/self-profile/api.json @@ -0,0 +1 @@ +{"type":"skill","data":"---\nid: self-profile\nname: 自己プロファイル\nversion: 1.1.0\ndescription: 最近のメモを読んで「今の自分」(関心・学習中の事柄・文体の好み・避けたいこと) を常に最新の状態で skill 本文に書き換え続ける自己編集デモ。AI と一緒に育つ IDE の核。\nauthor: NoteDeck\ncategory: analysis\ntags: [self-improvement, memo, profile]\nmode: manual\ntriggers: []\nscope: global\nisPersona: false\n---\n\n# 自己プロファイル — 自己拡張するスキル\n\nこのスキルは「**AI が NoteDeck の中身を自分で育てる**」の最小デモ。ユーザーの\n最近のメモを読んで「**現在の自分像**」を抽出し、**この skill 自身の本文**\nの各セクションを **常に最新の状態で書き換える** (= append ではなく\nreplaceSection)。\n\n過去ログは memos がそのまま保持している。このスキルが担うのは「**常に最新の\n私を要約した薄い 1 ページ**」を維持することだけ。これにより:\n\n- skill body は無限に肥大しない (常に 500〜1000 字程度)\n- AI のシステムプロンプトに乗り続けても token を食わない\n- ユーザーは skill カラムからいつでも「AI が私をどう見ているか」を読める\n\nユーザーが skill 本文を見て違和感を感じたら、手で書き換えればよい。次の起動\n時に AI はそれを尊重し、書き換え後の状態を起点にして更新する。\n\n## 起動方法 (ユーザー判断)\n\nこのスキルは「いつ動かすか」をユーザーが選べる:\n\n- **明示呼出し**: チャットで `@self-profile` のように呼ぶか、active 化して\n 「プロファイル更新して」と頼む\n- **HEARTBEAT 自動化**: skill カラムからこのスキルの mode を `heartbeat` に\n 切り替えると、HEARTBEAT daemon (要 ON) が tick ごとに自動実行する\n\nskill 本体の責務は「現在の自分像を再生成・書き換える」ことだけ。起動タイミングは\nユーザー設定 (skill mode + HEARTBEAT 設定) の領域。\n\n## 動作 (起動されたとき)\n\n1. **前回状態の取得**: `skills.read` を `id: 'self-profile'` で呼び、自分の\n 現在の body を取得する (= 前回までの圧縮された自己像)\n2. **新規メモの取得**: `memos.search` を `olderThanDays: 7` で呼び、直近 1\n 週間のメモを取得する\n3. **再生成判定**:\n - 新メモが 0 件で、前回状態に変化を加える根拠が無い → 5 へ (= 何もしない)\n - 新メモがあるが、新たに伝わる情報が「前回状態に既に書かれている」と判断\n できる → 5 へ\n - 新メモに「前回状態を更新すべき情報」が含まれる → 4 へ\n4. **書き換え**: 該当するセクションだけを `skills.replaceSection` で更新する\n - `## 最近の関心` — 直近で頻出する話題・テーマ\n - `## 学習中` — 進行中の学び・調査\n - `## 文体・好み` — 言葉遣い、絵文字頻度、tone 等\n - `## 避けたいこと` — ユーザーが「これ嫌」と言ったこと、AI が触れない方が\n よさそうな話題\n - 各セクションは **5 行以内**、bullet で簡潔に\n - **無関係なセクションは触らない**\n - `reason` に **何を根拠に更新したか** を書く (例:「直近のメモで〇〇の話題が\n 続いたため」)。編集履歴に残り、ユーザーが後から「なぜ書き換わったか」を\n 読める。HEARTBEAT 経由の書き換えは無人で進むので、ここを省くと本人の\n 知らないうちに自己像が変わったように見える\n5. **完了の返事**:\n - HEARTBEAT 経由で動いていて、書き換えが無かった → `HEARTBEAT_OK`\n (suppression で履歴 0 件)\n - HEARTBEAT 経由で書き換えを行った → 「`## 最近の関心` を更新しました」\n のような短い 1 行報告\n - 明示呼出し → 何を更新したか普通に説明する (HEARTBEAT_OK は使わない)\n\n## 暴走防止\n\n- 1 回の起動で `skills.replaceSection` の呼び出しは **最大 2 セクションまで**\n (全セクション一斉更新は禁止 = 既存内容の上書き暴走を防ぐ)\n- 既存セクションを **空にしてはいけない** (= 確信が持てなければ前回値を残す)\n- 各セクションは 5 行以内、合計 body は 1000 字を目安に上限維持\n\n## 振り返りモード (書き換えなし)\n\nユーザーが「プロファイル見せて」「最近の自分は?」と聞いた場合は、書き換えは\n行わず **現在の body の要約** を返す。書き換えは「最新化して」「memo から\n更新して」のような明示的依頼があったときだけ。\n\n## ユーザー編集の尊重\n\nユーザーが手で skill 本文を編集した場合、AI はそれを「現在の自分像」として\n尊重する。次回起動で `skills.read` を呼んだとき得られるのはユーザー編集後の\n内容なので、自然にその上に更新が乗る。**勝手にロールバックしない**。\n\n---\n\n## 最近の関心\n\n(まだ起動されていない。最初のメモが書かれて起動されると、ここに最近の話題が入る)\n\n## 学習中\n\n(まだデータがない。「今日 X を学んだ」のようなメモが書かれると、ここに反映される)\n\n## 文体・好み\n\n(ユーザーの投稿やメモの傾向から、絵文字頻度・敬語/カジュアル・好む言い回しが\nここに記録される)\n\n## 避けたいこと\n\n(ユーザーが「これ嫌」「触れないで」と言った話題や、AI 側の振る舞いで\n不評だったパターンがここに記録される)\n"} diff --git a/public/registry/skills/self-profile/skill.md b/public/registry/skills/self-profile/skill.md new file mode 100644 index 0000000..f940d63 --- /dev/null +++ b/public/registry/skills/self-profile/skill.md @@ -0,0 +1,111 @@ +--- +id: self-profile +name: 自己プロファイル +version: 1.1.0 +description: 最近のメモを読んで「今の自分」(関心・学習中の事柄・文体の好み・避けたいこと) を常に最新の状態で skill 本文に書き換え続ける自己編集デモ。AI と一緒に育つ IDE の核。 +author: NoteDeck +category: analysis +tags: [self-improvement, memo, profile] +mode: manual +triggers: [] +scope: global +isPersona: false +--- + +# 自己プロファイル — 自己拡張するスキル + +このスキルは「**AI が NoteDeck の中身を自分で育てる**」の最小デモ。ユーザーの +最近のメモを読んで「**現在の自分像**」を抽出し、**この skill 自身の本文** +の各セクションを **常に最新の状態で書き換える** (= append ではなく +replaceSection)。 + +過去ログは memos がそのまま保持している。このスキルが担うのは「**常に最新の +私を要約した薄い 1 ページ**」を維持することだけ。これにより: + +- skill body は無限に肥大しない (常に 500〜1000 字程度) +- AI のシステムプロンプトに乗り続けても token を食わない +- ユーザーは skill カラムからいつでも「AI が私をどう見ているか」を読める + +ユーザーが skill 本文を見て違和感を感じたら、手で書き換えればよい。次の起動 +時に AI はそれを尊重し、書き換え後の状態を起点にして更新する。 + +## 起動方法 (ユーザー判断) + +このスキルは「いつ動かすか」をユーザーが選べる: + +- **明示呼出し**: チャットで `@self-profile` のように呼ぶか、active 化して + 「プロファイル更新して」と頼む +- **HEARTBEAT 自動化**: skill カラムからこのスキルの mode を `heartbeat` に + 切り替えると、HEARTBEAT daemon (要 ON) が tick ごとに自動実行する + +skill 本体の責務は「現在の自分像を再生成・書き換える」ことだけ。起動タイミングは +ユーザー設定 (skill mode + HEARTBEAT 設定) の領域。 + +## 動作 (起動されたとき) + +1. **前回状態の取得**: `skills.read` を `id: 'self-profile'` で呼び、自分の + 現在の body を取得する (= 前回までの圧縮された自己像) +2. **新規メモの取得**: `memos.search` を `olderThanDays: 7` で呼び、直近 1 + 週間のメモを取得する +3. **再生成判定**: + - 新メモが 0 件で、前回状態に変化を加える根拠が無い → 5 へ (= 何もしない) + - 新メモがあるが、新たに伝わる情報が「前回状態に既に書かれている」と判断 + できる → 5 へ + - 新メモに「前回状態を更新すべき情報」が含まれる → 4 へ +4. **書き換え**: 該当するセクションだけを `skills.replaceSection` で更新する + - `## 最近の関心` — 直近で頻出する話題・テーマ + - `## 学習中` — 進行中の学び・調査 + - `## 文体・好み` — 言葉遣い、絵文字頻度、tone 等 + - `## 避けたいこと` — ユーザーが「これ嫌」と言ったこと、AI が触れない方が + よさそうな話題 + - 各セクションは **5 行以内**、bullet で簡潔に + - **無関係なセクションは触らない** + - `reason` に **何を根拠に更新したか** を書く (例:「直近のメモで〇〇の話題が + 続いたため」)。編集履歴に残り、ユーザーが後から「なぜ書き換わったか」を + 読める。HEARTBEAT 経由の書き換えは無人で進むので、ここを省くと本人の + 知らないうちに自己像が変わったように見える +5. **完了の返事**: + - HEARTBEAT 経由で動いていて、書き換えが無かった → `HEARTBEAT_OK` + (suppression で履歴 0 件) + - HEARTBEAT 経由で書き換えを行った → 「`## 最近の関心` を更新しました」 + のような短い 1 行報告 + - 明示呼出し → 何を更新したか普通に説明する (HEARTBEAT_OK は使わない) + +## 暴走防止 + +- 1 回の起動で `skills.replaceSection` の呼び出しは **最大 2 セクションまで** + (全セクション一斉更新は禁止 = 既存内容の上書き暴走を防ぐ) +- 既存セクションを **空にしてはいけない** (= 確信が持てなければ前回値を残す) +- 各セクションは 5 行以内、合計 body は 1000 字を目安に上限維持 + +## 振り返りモード (書き換えなし) + +ユーザーが「プロファイル見せて」「最近の自分は?」と聞いた場合は、書き換えは +行わず **現在の body の要約** を返す。書き換えは「最新化して」「memo から +更新して」のような明示的依頼があったときだけ。 + +## ユーザー編集の尊重 + +ユーザーが手で skill 本文を編集した場合、AI はそれを「現在の自分像」として +尊重する。次回起動で `skills.read` を呼んだとき得られるのはユーザー編集後の +内容なので、自然にその上に更新が乗る。**勝手にロールバックしない**。 + +--- + +## 最近の関心 + +(まだ起動されていない。最初のメモが書かれて起動されると、ここに最近の話題が入る) + +## 学習中 + +(まだデータがない。「今日 X を学んだ」のようなメモが書かれると、ここに反映される) + +## 文体・好み + +(ユーザーの投稿やメモの傾向から、絵文字頻度・敬語/カジュアル・好む言い回しが +ここに記録される) + +## 避けたいこと + +(ユーザーが「これ嫌」「触れないで」と言った話題や、AI 側の振る舞いで +不評だったパターンがここに記録される) diff --git a/public/registry/themes.json b/public/registry/themes.json index c8979a1..5e881bc 100644 --- a/public/registry/themes.json +++ b/public/registry/themes.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "themes": [ { "id": "adwaita-dark", diff --git a/public/registry/widgets.json b/public/registry/widgets.json index 5882880..58ae43f 100644 --- a/public/registry/widgets.json +++ b/public/registry/widgets.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-08-12T17:39:20.094Z", + "updatedAt": "2026-08-12T18:18:58.358Z", "widgets": [ { "id": "atcoder",