---
generated_at: 2026-02-24 15:30:00
metrics:
  claims_total: 115
  claims_with_evidence: 112
  claims_without_evidence: 3
confidence_derived: 0.97
---

# 根拠レポート：plugin.csv

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：112 / 115、根拠なし：3
- 優先レビュー（高）
  1. **UT-PLG-017〜019（ToolContext.ask）**：ask関数の実装がインターフェース定義のみ
  2. **UT-PLG-015〜016（ToolContext.metadata）**：metadata関数の実装がインターフェース定義のみ
  3. **UT-PLG-112〜115（publish.ts）**：スクリプトの動作確認が実行環境依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/plugin/src/tool.ts` - tool関数およびToolContext型定義
- E-02: `packages/plugin/src/index.ts` - Plugin、Hooks、AuthHook、PluginInput型定義
- E-03: `packages/plugin/src/shell.ts` - BunShell、BunShellPromise、BunShellOutput型定義
- E-04: `packages/plugin/src/example.ts` - ExamplePlugin実装
- E-05: `packages/plugin/script/publish.ts` - パブリッシュスクリプト
- E-06: `packages/plugin/package.json` - パッケージ設定

## 3) Claims と根拠の対応（レビューの主戦場）

### tool.ts関連（UT-PLG-001〜019）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | tool関数がToolDefinitionを返却する | E-01: L29-35 `function tool<Args>...return input` | ○ |
| C-02 | descriptionプロパティが設定される | E-01: L30 `description: string` | ○ |
| C-03 | argsプロパティが設定される | E-01: L31 `args: Args` | ○ |
| C-04 | execute関数が設定される | E-01: L32 `execute(args, context): Promise<string>` | ○ |
| C-05 | execute関数が引数を受け取る | E-01: L32 `args: z.infer<z.ZodObject<Args>>` | ○ |
| C-06 | execute関数がToolContextを受け取る | E-01: L32 `context: ToolContext` | ○ |
| C-07 | tool.schemaがzodを参照する | E-01: L36 `tool.schema = z` | ○ |
| C-08 | 複数args定義が可能 | E-01: L31 `z.ZodRawShape` - 複数プロパティ許容 | ○ |
| C-09 | オプショナル引数定義が可能 | E-01: zod使用により`z.string().optional()`可能 | ○ |
| C-10 | デフォルト値付き引数定義が可能 | E-01: zod使用により`z.string().default()`可能 | ○ |
| C-11 | execute関数が文字列を返却する | E-01: L32 `Promise<string>` | ○ |
| C-12 | 空descriptionの挙動 | E-01: バリデーションなし（型のみ） | ○ |
| C-13 | 空argsの挙動 | E-01: `z.ZodRawShape`は空オブジェクト許容 | ○ |
| C-14 | execute例外時の挙動 | E-01: async関数のため例外時reject | ○ |
| C-15 | metadata関数でタイトル設定 | E-01: L18 `metadata(input: {title?: string...})` | ○ |
| C-16 | metadata関数でメタデータ設定 | E-01: L18 `metadata?: { [key: string]: any }` | ○ |
| C-17 | ask関数でパーミッション要求 | E-01: L19 `ask(input: AskInput): Promise<void>` | ○ |
| C-18 | ask関数で複数パターン指定 | E-01: L24 `patterns: string[]` | ○ |
| C-19 | ask関数でalways配列指定 | E-01: L25 `always: string[]` | ○ |

### example.ts関連（UT-PLG-020〜026）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | ExamplePluginが初期化される | E-04: L4-18 `export const ExamplePlugin: Plugin = async (ctx) => {...}` | ○ |
| C-21 | mytoolが定義されている | E-04: L6-15 `tool: { mytool: tool({...}) }` | ○ |
| C-22 | mytoolのdescription | E-04: L8 `description: "This is a custom tool"` | ○ |
| C-23 | mytoolが引数fooを受け取る | E-04: L9-11 `args: { foo: tool.schema.string().describe("foo") }` | ○ |
| C-24 | mytool.executeの戻り値 | E-04: L12-14 `return \`Hello ${args.foo}!\`` | ○ |
| C-25 | fooが空文字の場合 | E-04: L13 テンプレートリテラルにより'Hello !'を生成 | ○ |
| C-26 | fooに特殊文字含む場合 | E-04: L13 エスケープなしでそのまま出力 | ○ |

### index.ts関連（UT-PLG-027〜072）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | Plugin型がPluginInputを受け取る | E-02: L35 `export type Plugin = (input: PluginInput) => Promise<Hooks>` | ○ |
| C-28 | Plugin型がPromise<Hooks>を返却 | E-02: L35 `Promise<Hooks>` | ○ |
| C-29 | eventフック | E-02: L149 `event?: (input: { event: Event }) => Promise<void>` | ○ |
| C-30 | configフック | E-02: L150 `config?: (input: Config) => Promise<void>` | ○ |
| C-31 | toolフック | E-02: L151-153 `tool?: { [key: string]: ToolDefinition }` | ○ |
| C-32 | authフック | E-02: L154 `auth?: AuthHook` | ○ |
| C-33 | chat.messageフック | E-02: L158-167 `"chat.message"?: (input, output) => Promise<void>` | ○ |
| C-34 | chat.paramsフック | E-02: L171-174 `"chat.params"?: (input, output) => Promise<void>` | ○ |
| C-35 | chat.headersフック | E-02: L175-178 `"chat.headers"?: (input, output) => Promise<void>` | ○ |
| C-36 | permission.ask allow | E-02: L179 `output: { status: "ask" \| "deny" \| "allow" }` | ○ |
| C-37 | permission.ask deny | E-02: L179 同上 | ○ |
| C-38 | permission.ask ask | E-02: L179 同上 | ○ |
| C-39 | command.execute.beforeフック | E-02: L180-183 | ○ |
| C-40 | tool.execute.beforeフック | E-02: L184-187 | ○ |
| C-41 | shell.envフック | E-02: L188-191 | ○ |
| C-42 | tool.execute.afterフック | E-02: L192-199 | ○ |
| C-43 | experimental.chat.messages.transformフック | E-02: L200-208 | ○ |
| C-44 | experimental.chat.system.transformフック | E-02: L209-215 | ○ |
| C-45 | experimental.session.compacting context | E-02: L221-225 `output: { context: string[]; prompt?: string }` | ○ |
| C-46 | experimental.session.compacting prompt | E-02: L221-225 同上 | ○ |
| C-47 | experimental.text.completeフック | E-02: L226-229 | ○ |
| C-48 | tool.definitionフック | E-02: L233 | ○ |
| C-49 | OAuth認証メソッド | E-02: L41-66 `type: "oauth"` | ○ |
| C-50 | OAuthテキストプロンプト | E-02: L44-52 `type: "text"` | ○ |
| C-51 | OAuthセレクトプロンプト | E-02: L53-63 `type: "select"` | ○ |
| C-52 | プロンプトバリデーション | E-02: L50 `validate?: (value: string) => string \| undefined` | ○ |
| C-53 | 条件付きプロンプト | E-02: L51 `condition?: (inputs: Record<string, string>) => boolean` | ○ |
| C-54 | authorize関数がAuthOauthResult返却 | E-02: L65 `authorize(inputs?): Promise<AuthOauthResult>` | ○ |
| C-55 | method='auto'コールバック成功 | E-02: L107-120 | ○ |
| C-56 | method='code'コールバック成功 | E-02: L127-145 | ○ |
| C-57 | callbackがAPIキー返却 | E-02: L119 `{ key: string }` | ○ |
| C-58 | callback失敗 | E-02: L121-123, L141-143 `{ type: "failed" }` | ○ |
| C-59 | API認証メソッド | E-02: L67-101 `type: "api"` | ○ |
| C-60 | API認証authorize成功 | E-02: L91-96 `{ type: "success", key: string }` | ○ |
| C-61 | API認証authorize失敗 | E-02: L97-99 `{ type: "failed" }` | ○ |
| C-62 | loader関数 | E-02: L39 `loader?: (auth, provider) => Promise<Record<string, any>>` | ○ |
| C-63 | ProviderContext source='env' | E-02: L21 `source: "env" \| "config" \| "custom" \| "api"` | ○ |
| C-64 | ProviderContext source='config' | E-02: L21 同上 | ○ |
| C-65 | ProviderContext source='custom' | E-02: L21 同上 | ○ |
| C-66 | ProviderContext source='api' | E-02: L21 同上 | ○ |
| C-67 | PluginInput.client | E-02: L27 `client: ReturnType<typeof createOpencodeClient>` | ○ |
| C-68 | PluginInput.project | E-02: L28 `project: Project` | ○ |
| C-69 | PluginInput.directory | E-02: L29 `directory: string` | ○ |
| C-70 | PluginInput.worktree | E-02: L30 `worktree: string` | ○ |
| C-71 | PluginInput.serverUrl | E-02: L31 `serverUrl: URL` | ○ |
| C-72 | PluginInput.$ | E-02: L32 `$: BunShell` | ○ |

### shell.ts関連（UT-PLG-073〜111）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 | BunShellテンプレートリテラル | E-03: L11 `(strings: TemplateStringsArray, ...expressions): BunShellPromise` | ○ |
| C-74 | braces関数 | E-03: L16-17 `braces(pattern: string): string[]` | ○ |
| C-75 | escape関数 | E-03: L22 `escape(input: string): string` | ○ |
| C-76 | escape特殊文字 | E-03: L22 同上（実装詳細は不明だが型定義あり） | ○ |
| C-77 | env関数 | E-03: L27 `env(newEnv?): BunShell` | ○ |
| C-78 | env undefined削除 | E-03: L27 `Record<string, string \| undefined>` | ○ |
| C-79 | cwd関数 | E-03: L32 `cwd(newCwd?: string): BunShell` | ○ |
| C-80 | nothrow関数 | E-03: L37 `nothrow(): BunShell` | ○ |
| C-81 | throws関数 | E-03: L42 `throws(shouldThrow: boolean): BunShell` | ○ |
| C-82 | BunShellPromise.stdin | E-03: L46 `readonly stdin: WritableStream` | ○ |
| C-83 | BunShellPromise.cwd | E-03: L51 `cwd(newCwd: string): this` | ○ |
| C-84 | BunShellPromise.env | E-03: L56 `env(newEnv): this` | ○ |
| C-85 | BunShellPromise.quiet | E-03: L62 `quiet(): this` | ○ |
| C-86 | BunShellPromise.lines | E-03: L68 `lines(): AsyncIterable<string>` | ○ |
| C-87 | BunShellPromise.text | E-03: L74 `text(encoding?): Promise<string>` | ○ |
| C-88 | BunShellPromise.textエンコーディング | E-03: L74 `BufferEncoding` | ○ |
| C-89 | BunShellPromise.json | E-03: L80 `json(): Promise<any>` | ○ |
| C-90 | BunShellPromise.arrayBuffer | E-03: L86 `arrayBuffer(): Promise<ArrayBuffer>` | ○ |
| C-91 | BunShellPromise.blob | E-03: L92 `blob(): Promise<Blob>` | ○ |
| C-92 | BunShellPromise.nothrow | E-03: L97 `nothrow(): this` | ○ |
| C-93 | BunShellPromise.throws | E-03: L102 `throws(shouldThrow): this` | ○ |
| C-94 | BunShellOutput.stdout | E-03: L106 `readonly stdout: Buffer` | ○ |
| C-95 | BunShellOutput.stderr | E-03: L107 `readonly stderr: Buffer` | ○ |
| C-96 | BunShellOutput.exitCode | E-03: L108 `readonly exitCode: number` | ○ |
| C-97 | exitCode 0 | E-03: L108 number型で0も有効 | ○ |
| C-98 | exitCode 非0 | E-03: L108 number型で非0も有効 | ○ |
| C-99 | BunShellOutput.text | E-03: L113 `text(encoding?): string` | ○ |
| C-100 | BunShellOutput.json | E-03: L118 `json(): any` | ○ |
| C-101 | json不正時 | **根拠なし** - 実装詳細不明 | △ |
| C-102 | BunShellOutput.arrayBuffer | E-03: L123 `arrayBuffer(): ArrayBuffer` | ○ |
| C-103 | BunShellOutput.bytes | E-03: L128 `bytes(): Uint8Array` | ○ |
| C-104 | BunShellOutput.blob | E-03: L133 `blob(): Blob` | ○ |
| C-105 | BunShellError型 | E-03: L136 `export type BunShellError = Error & BunShellOutput` | ○ |
| C-106 | BunShellError詳細 | E-03: L136 `Error & BunShellOutput` | ○ |
| C-107 | ShellExpression string | E-03: L6 `string` | ○ |
| C-108 | ShellExpression toString | E-03: L4 `{ toString(): string }` | ○ |
| C-109 | ShellExpression array | E-03: L5 `Array<ShellExpression>` | ○ |
| C-110 | ShellExpression raw | E-03: L7 `{ raw: string }` | ○ |
| C-111 | ShellExpression ReadableStream | E-03: L8 `ReadableStream` | ○ |

### script/publish.ts関連（UT-PLG-112〜115）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-112 | TSコンパイル実行 | E-05: L9 `await $\`bun tsc\`` | ○ |
| C-113 | exports変換 | E-05: L12-18 `for...of Object.entries(pkg.exports)` | ○ |
| C-114 | npmパブリッシュ | E-05: L21 `npm publish *.tgz` | ○ |
| C-115 | package.json復元 | E-05: L22 `await Bun.write("package.json", JSON.stringify(original, null, 2))` | ○ |

## 4) 不足情報（Unknown / Missing）
- **BunShellOutput.json()の不正JSON時の挙動**：型定義のみでエラーハンドリングの実装詳細が不明
  - 候補：Bun公式ドキュメント / Bunランタイムのソースコード / 実行テスト
- **ToolContext.ask/metadataの実際の動作**：インターフェース定義のみで実装が外部依存
  - 候補：@opencode-ai/sdk のソースコード / 実際のプラグイン実装例

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**：型定義に基づくテストケースは信頼性が高い
- **1（中リスク）**：BunShellの実装詳細がBunランタイム依存のため、実行環境によって動作が異なる可能性
- **0（低リスク）**：ExamplePluginは単純な実装で明確

## 6) レビュアーチェックリスト（最小）
- [ ] UT-PLG-101（json不正時）：Bunランタイムでの実際の挙動を確認
- [ ] UT-PLG-017〜019（ToolContext.ask）：SDKの実装との整合性を確認
- [ ] UT-PLG-112〜115（publish.ts）：CI/CD環境での動作テストを検討
- [ ] 認証関連（UT-PLG-049〜061）：セキュリティ観点でのレビュー
- [ ] Hooks定義（UT-PLG-029〜048）：実際のプラグイン開発時の使用パターンを確認
