Skip to content

docs: README を本質だけに絞り、サイトのヒーロー文をブランド軸の一行に揃える - #1335

Merged
hitalin merged 7 commits into
mainfrom
docs/readme-brand-line-main
Nov 3, 2026
Merged

hitalin merged 7 commits into
mainfrom
docs/readme-brand-line-main

Conversation

@hitalin

@hitalin hitalin commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

変更

  • README をバッジ 17 個 / ドキュメントリンク 11 本 / プラットフォーム表の並列から、「何か・どこで落とせるか・どこに報告するか」だけに絞る。冒頭は BRANDING.md のブランド軸「あなたの Misskey が棲む、デッキ。」+ 副題「Misskey Pro — Misskey廃人のための統合デッキ環境」
  • サイトのヒーロー文 (chip「Misskey Pro」の横) を「Misskey廃人のための 非公式クライアント。」から README と同じ一行に揃える。en / ko / zh も同じ意味で訳し直し、sourceHash を追従

なぜ

旧 README は情報が全部同じ重さで並んでいて要点が沈んでいた。旧ヒーロー文は BRANDING.md が「主張しないこと」に挙げる機能説明寄りの文で、README と食い違っていた。

備考

  • SECURITY / CODE_OF_CONDUCT は GitHub が自動表示するので README からリンクを外した
  • pnpm lint:docs / biome / typecheck は pre-commit で通過
  • develop にも同じ 2 コミットを cherry-pick 済み

🤖 Generated with Claude Code

hitalin and others added 7 commits November 4, 2026 06:04
…、column.list がそれを返す (#1242)

- column.add: `widgets` ([{ installId, accountKey? }]) / `aiscriptCode` / `flashId` / `pageId` を受け、中身を持つ種別も作れるようにする。宣言に漏れていた `roleId` / `sources` も載せる
- column.list / column.active: `widgets` と `aiscriptCode` を返し、column.add に渡せば同じカラムを作り直せる形にそろえる
- レジストリの `customAddFlow` は column.add の除外にしか使われていなかったので外す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ヘッダーの `loopback` 宣言を TS でも読む (正規化は Rust と同じ golden)
- dispatcher: `http.fetch` × plugin principal のときだけ loopback の判定 (連鎖 → 対象外 → 常に拒否するポート → 宣言 → 本文の鮮度 → 同意)。未同意 × UI 起点だけ同意ダイアログを出し、承認 = Rust への記録でその要求の確認を兼ねる。同じプラグイン × ポートのダイアログは同時に 1 枚
- 実行の起点 `origin` と動かしている本文の hash を plugin の実行文脈 (withPluginAccountContext / sandbox / Nd:http) に通し、`capabilityExecute` / `capabilityPreview` に添える
- 拒否はプラグインカラムのバッジ (理由つき、押すと詳細) / UI 起点ならトースト / 運用ログに残す。Rust の LOOPBACK_* の code も同じ理由に写す
- プラグイン詳細の設定タブ (宣言があれば出す) に許可 / 取り消し / 再起動、権限ウィンドウの AiScript 行に同意の一覧と取り消し (`useLoopbackConsent`)
- 文言・capabilities.json5・SECURITY.md・DEVELOPMENT.md・サイトのプラグイン文書 (ja / en / zh / ko)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…w-1242

feat(capability): column.add が widget / aiscript / play / page の中身を受ける (#1242)
feat(plugin): 利用者がプラグイン単位で同意した loopback ポートだけ Nd:http を通す (#1293)
公式の連携 3 つ (別リポジトリ、本体の追加なし) を 1 ページにまとめる。共通の仕組み
(永続 API トークンと権限の交差 / 書き込みは NoteDeck の画面で確認 / notedeck:// は
トークン不要 / 安全境界ではない) を先に置き、連携ごとにできることの表と、同じ API で
自分で書く入口 (API ドキュメントのカラム / SSE / MCP) を添える。3 つともストア未掲載と
実機未確認は明記する。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
公式の連携が 4 つになったので、ページの表と各連携の節にブラウザ拡張 (Chromium) を追加し、
ランディングの「外部からも動かせる」の文にもブラウザを足す。4 言語の訳と sourceHash を追従。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
AiScript のハイライトは公式 aiscript-vscode、NoteDeck 固有 (設定フォルダ / 検証 / 本体へ送る /
capability 実行) は notedeck-vscode、という役割分担で 4 言語に 1 文ずつ。sourceHash 追従。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 3, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 53 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
Commits

Reviewing files that changed from the base of the PR and between 39b7d8e and d69e2ca.

Files ignored due to path filters: 2
  • src/capabilities/declarations.generated.ts is excluded by !**/*.generated.*
  • src/i18n/locale.generated.ts is excluded by !**/*.generated.*
Files selected for processing: 71
  • CODEMAP.md
  • DEVELOPMENT.md
  • SECURITY.md
  • crates/notecore/capabilities.json5
  • crates/notecore/locales/en-US.json
  • crates/notecore/locales/ja-JP.json
  • crates/notecore/src/capabilities/generated.rs
  • crates/notecore/src/commands/http.rs
  • crates/notecore/src/commands/loopback.rs
  • crates/notecore/src/commands/mod.rs
  • crates/notecore/src/commands/table.rs
  • crates/notecore/src/lib.rs
  • crates/notecore/src/loopback_consent.rs
  • crates/notecore/src/settings_store.rs
  • crates/notecore/src/sidecar/plugin_meta.rs
  • crates/notecore/src/ssrf.rs
  • crates/notemaid/src/ai_turn/mod.rs
  • crates/notemaid/src/commands/ai_chat.rs
  • crates/notemaid/src/commands/table.rs
  • crates/notemaid/src/exec/memory.rs
  • crates/notemaid/src/exec/mod.rs
  • crates/notemaid/src/exec/net.rs
  • locales/ja-JP.yml
  • site/.vitepress/config.mts
  • site/.vitepress/theme/i18n/en.ts
  • site/.vitepress/theme/i18n/ja.ts
  • site/.vitepress/theme/i18n/ko.ts
  • site/.vitepress/theme/i18n/zh.ts
  • site/docs/dev/index.md
  • site/docs/dev/plugin.md
  • site/docs/guide/integrations.md
  • site/en/docs/dev/index.md
  • site/en/docs/dev/plugin.md
  • site/en/docs/guide/integrations.md
  • site/ko/docs/dev/index.md
  • site/ko/docs/dev/plugin.md
  • site/ko/docs/guide/integrations.md
  • site/zh/docs/dev/index.md
  • site/zh/docs/dev/plugin.md
  • site/zh/docs/guide/integrations.md
  • src-tauri/src/lib.rs
  • src/aiscript/golden/loopbackHeader.json
  • src/aiscript/notedeck-api.ts
  • src/aiscript/plugin-api.test.ts
  • src/aiscript/plugin-api.ts
  • src/aiscript/sandbox.ts
  • src/bindings.ts
  • src/capabilities/builtins/column.test.ts
  • src/capabilities/builtins/column.ts
  • src/capabilities/declare.ts
  • src/capabilities/dispatcher.loopback.test.ts
  • src/capabilities/dispatcher.ts
  • src/capabilities/golden/tools.json
  • src/capabilities/loopbackGate.test.ts
  • src/capabilities/loopbackGate.ts
  • src/capabilities/types.ts
  • src/columns/registry.ts
  • src/components/common/MkPostForm.vue
  • src/components/common/NoteMoreMenu.vue
  • src/components/deck/DeckPluginManagerColumn.vue
  • src/components/deck/PluginCard.vue
  • src/components/window/PermissionsContent.vue
  • src/components/window/PluginsContent.vue
  • src/components/window/user-profile/UserProfileMenu.vue
  • src/composables/useLoopbackConsent.ts
  • src/permissions/pluginDenials.ts
  • src/services/loopbackPorts.test.ts
  • src/services/loopbackPorts.ts
  • src/stores/aiscriptLogs.ts
  • tests/lint/moduleCaches.test.ts
  • tests/lint/rustCommandKinds.test.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown

API surface diff

外部アプリ向け API 面 (src-tauri/openapi.json / src/bindings.ts) が変更されています。
互換性への影響 (#709) をレビューしてください。

src/bindings.ts | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 122 insertions(+), 4 deletions(-)
Full diff
diff --git a/src/bindings.ts b/src/bindings.ts
index b551dbb..7d2d274 100644
--- a/src/bindings.ts
+++ b/src/bindings.ts
@@ -2664,18 +2664,18 @@ async maidTurnSystem(turnId: string) : Promise<Result<JsonValue | null, { code:
 }
 },
 /** @see crates/notemaid/src/commands/ai_chat.rs */
-async capabilityExecute(id: string, params: JsonValue, principal: string, accountId: string | null, tainted: boolean, pluginId: string | null, tokenId: string | null, tokenName: string | null) : Promise<Result<ExecOutcome, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+async capabilityExecute(id: string, params: JsonValue, principal: string, accountId: string | null, tainted: boolean, pluginId: string | null, tokenId: string | null, tokenName: string | null, bodyHash: string | null) : Promise<Result<ExecOutcome, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
     try {
-    return { status: "ok", data: await TAURI_INVOKE("capability_execute", { id, params, principal, accountId, tainted, pluginId, tokenId, tokenName }) };
+    return { status: "ok", data: await TAURI_INVOKE("capability_execute", { id, params, principal, accountId, tainted, pluginId, tokenId, tokenName, bodyHash }) };
 } catch (e) {
     if(e instanceof Error) throw e;
     else return { status: "error", error: e  as any };
 }
 },
 /** @see crates/notemaid/src/commands/ai_chat.rs */
-async capabilityPreview(id: string, params: JsonValue, principal: string, accountId: string | null, tainted: boolean, pluginId: string | null, tokenId: string | null, tokenName: string | null) : Promise<Result<JsonValue | null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+async capabilityPreview(id: string, params: JsonValue, principal: string, accountId: string | null, tainted: boolean, pluginId: string | null, tokenId: string | null, tokenName: string | null, bodyHash: string | null) : Promise<Result<JsonValue | null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
     try {
-    return { status: "ok", data: await TAURI_INVOKE("capability_preview", { id, params, principal, accountId, tainted, pluginId, tokenId, tokenName }) };
+    return { status: "ok", data: await TAURI_INVOKE("capability_preview", { id, params, principal, accountId, tainted, pluginId, tokenId, tokenName, bodyHash }) };
 } catch (e) {
     if(e instanceof Error) throw e;
     else return { status: "error", error: e  as any };
@@ -2762,6 +2762,60 @@ async httpFetch(request: HttpFetchRequest) : Promise<Result<HttpFetchResponse, {
     else return { status: "error", error: e  as any };
 }
 },
+/** @see crates/notecore/src/commands/loopback.rs */
+async loopbackConsentStatus(pluginId: string) : Promise<Result<LoopbackConsentStatus, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("loopback_consent_status", { pluginId }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/loopback.rs */
+async loopbackConsentList() : Promise<Result<LoopbackConsentRow[], { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("loopback_consent_list") };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/loopback.rs */
+async loopbackConsentGrant(pluginId: string, port: number, expectedHash: string) : Promise<Result<null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("loopback_consent_grant", { pluginId, port, expectedHash }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/loopback.rs */
+async loopbackConsentRevoke(pluginId: string, port: number) : Promise<Result<null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("loopback_consent_revoke", { pluginId, port }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/loopback.rs */
+async httpLoopbackClassify(url: string, pluginId: string, bodyHash: string) : Promise<Result<LoopbackClassification, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("http_loopback_classify", { url, pluginId, bodyHash }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/loopback.rs */
+async pluginBodyHash(content: string) : Promise<Result<string, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("plugin_body_hash", { content }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
 /** @see crates/notemaid/src/commands/heartbeat.rs */
 async heartbeatTriggerNow() : Promise<Result<null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
     try {
@@ -3866,6 +3920,70 @@ resident: ResidentStatus }
  * の形で、TS は `nativeField(line, 'text')` で表示言語の文にする
  */
 export type LocalizedLine = { text: string; i18n: JsonValue }
+/**
+ * `http.fetch` の URL の分類 (WebView の dispatcher が確認の要否を決める材料)
+ */
+export type LoopbackClassification = { 
+/**
+ * URL の host が loopback の 3 表記か。false なら他の欄は意味を持たない
+ */
+loopback: boolean; port: number | null; 
+/**
+ * 常に拒否するポート (自アプリ / ブラウザが繋がない / 危険なローカルサービス)
+ */
+alwaysDenied: boolean; 
+/**
+ * 今のソースの宣言にそのポートがある
+ */
+declared: boolean; 
+/**
+ * 同意済み (ディスクの hash と同意の hash が一致し、ポートが同意にある)
+ */
+granted: boolean; 
+/**
+ * 動かしている本文がディスクの本文と違う (再起動が要る)
+ */
+stale: boolean }
+/**
+ * 権限ウィンドウの一覧の 1 行 (実在する個体だけ)
+ */
+export type LoopbackConsentRow = ({ 
+/**
+ * 今のソースの宣言 (正規化済み)。個体が無ければ空
+ */
+declared: number[]; 
+/**
+ * ディスク上の本文の hash (grant の `expected_hash` に渡す)
+ */
+hash: string; 
+/**
+ * 同意済みのポート (宣言にあるものだけ)。stale のときは同意した当時のもの
+ */
+granted: number[]; 
+/**
+ * 同意はあるが本文が変わっていて、次の使用時に再同意になる
+ */
+stale: boolean }) & { pluginId: string; name: string }
+/**
+ * プラグイン 1 個体の宣言と同意の状態 (プラグイン詳細 / 権限ウィンドウ用)
+ */
+export type LoopbackConsentStatus = { 
+/**
+ * 今のソースの宣言 (正規化済み)。個体が無ければ空
+ */
+declared: number[]; 
+/**
+ * ディスク上の本文の hash (grant の `expected_hash` に渡す)
+ */
+hash: string; 
+/**
+ * 同意済みのポート (宣言にあるものだけ)。stale のときは同意した当時のもの
+ */
+granted: number[]; 
+/**
+ * 同意はあるが本文が変わっていて、次の使用時に再同意になる
+ */
+stale: boolean }
 /**
  * Misskey の `mutedWords` / `hardMutedWords` の 1 要素。
  * 文字列配列なら AND 語群(全語含むとマッチ)、文字列なら `/regex/flags` 形式の正規表現。

@github-actions github-actions Bot added 📖Doc Documentation related issue/PR rust Pull requests that update rust code javascript Pull requests that update javascript code labels Nov 3, 2026
@hitalin hitalin self-assigned this Nov 3, 2026
@hitalin
hitalin merged commit ce1ad62 into main Nov 3, 2026
27 of 28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📖Doc Documentation related issue/PR javascript Pull requests that update javascript code rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant