Review Output Examples
River Review が生成するレビュー出力の例です。Summary / Comments / Suggestions を含み、実際の AI レビューに近いトーンで記載しています。
Upstream (設計フェーズ)
対象コード (Upstream)
// api/routes/user.ts
router.post('/users', async (req, res) => {
const user = await userService.create(req.body);
res.json(user);
});
生成されるコメント例 (Upstream)
- Summary: 新規ユーザー作成エンドポイントで入力バリデーションとエラーハンドリングが不足している。ドメイン上の制約が設計ドキュメントと不整合である。
- Comments:
- api/routes/user.ts:2 入力スキーマが未定義である。設計では
emailは必須・形式検証ありと記載されている。 - api/routes/user.ts:3 失敗時に適切なステータスコードを返していない(常に 200)。異常系の設計を反映する必要がある。
- api/routes/user.ts:2 入力スキーマが未定義である。設計では
- Suggestions:
emailの形式・必須チェックを設計に合わせて追加するtry/catchを追加し、422/500 など適切なステータスで返却する- サービス層にドメインバリデーションを寄せ、ルートは入力整形のみに留める
// api/routes/user.ts
router.post('/users', async (req, res) => {
try {
const payload = userSchema.parse(req.body); // zod 等で入力検証
const user = await userService.create(payload);
return res.status(201).json(user);
} catch (err) {
return res.status(422).json({ message: 'invalid payload', detail: err.message });
}
});
Midstream (実装フェーズ)
対象コード (Midstream)
// src/components/ProfileCard.tsx
export const ProfileCard = ({ user }) => (
<div>
<p>{user.name}</p>
<p>Age: {user.age}</p>
<button onClick={() => alert('clicked')}>Contact</button>
</div>
);
生成されるコメント例 (Midstream)
- Summary:
ProfileCardの型安全性とアクセシビリティに課題がある。クリックイベントがハードコードされており再利用性が低下している。 - Comments:
- src/components/ProfileCard.tsx:2 props に型が付与されていない。型定義がないと誤ったプロパティでもコンパイルが通る。
- src/components/ProfileCard.tsx:5 アラートのハンドラが固定でテストしづらく、ボタンに
aria-labelがない。
- Suggestions:
Propsインターフェースを定義し、userの構造を明示する- ボタンのハンドラを外から注入し、
aria-labelを付与する
// src/components/ProfileCard.tsx
type ProfileCardProps = {
user: { name: string; age: number };
onContact?: () => void;
};
export const ProfileCard: React.FC<ProfileCardProps> = ({ user, onContact }) => (
<div>
<p>{user.name}</p>
<p>Age: {user.age}</p>
<button aria-label="contact user" onClick={onContact}>
Contact
</button>
</div>
);
Downstream (テストフェーズ)
対象コード (Downstream)
// tests/order.spec.ts
describe('Order total', () => {
it('calculates total', () => {
const order = new Order([{ price: 1000 }, { price: 2000 }]);
expect(order.total()).toBeGreaterThan(0);
});
});
生成されるコメント例 (Downstream)
- Summary: テストが成功条件のみを検証しており、境界・失敗ケースが欠落している。具体的な期待値がなく、リグレッションを検知できない。
- Comments:
- tests/order.spec.ts:3 具体的な期待値がなく、値の誤差を検出できない。
- tests/order.spec.ts:4 割引・送料・空配列などのケースがカバーされていない。要件の抜け漏れを見逃す恐れがある。
- Suggestions:
- 期待値を固定値で比較し、合計計算ロジックの regressions を検知する
- 空カート・割引適用・不正入力のケースを追加する
// tests/order.spec.ts
describe('Order total', () => {
it('calculates total with items', () => {
const order = new Order([{ price: 1000 }, { price: 2000 }]);
expect(order.total()).toBe(3000);
});
it('returns zero for empty cart', () => {
const order = new Order([]);
expect(order.total()).toBe(0);
});
it('applies discount', () => {
const order = new Order([{ price: 1000 }], { discountRate: 0.1 });
expect(order.total()).toBe(900);
});
});