Skip to content

レポート機能強化 #618

@Kewton

Description

@Kewton

Note: このIssueは 2026-04-04 にStage 7レビュー結果を反映して更新されました。
詳細: dev-reports/issue/618/issue-review/

概要

レポート生成機能にテンプレートシステムを追加する。Review画面にTemplateタブを新設し、最大5件のテンプレート(件名+指示文)を管理可能にする。レポート生成時は「指示なし / テンプレートから選択 / カスタム入力」の3モードを切り替えて利用できるようにする。

背景・課題

現在のレポート生成機能(Issue #607, #612)はユーザー指示を毎回手入力するため、レポートの品質・フォーマットがばらつく。日報・週報・進捗報告など定型パターンを保存して再利用できる仕組みがなく、同じような指示を毎回書く手間が発生している。

提案する解決策

1. テンプレートデータ管理

SQLite DBに report_templates テーブルを追加し、CRUD APIで管理する。

CREATE TABLE report_templates (
  id TEXT PRIMARY KEY,             -- crypto.randomUUID() でUUID v4形式を生成
  name TEXT NOT NULL,              -- 件名(テンプレート名)最大100文字
  content TEXT NOT NULL,           -- 指示文(テンプレート本文)最大1000文字
  sort_order INTEGER NOT NULL DEFAULT 0, -- created_at順ソートで使用。将来的にドラッグ&ドロップ並び替えUIを追加する際に活用予定
  created_at INTEGER NOT NULL,
  updated_at INTEGER NOT NULL
);
  • テンプレートは最大5件まで(MAX_TEMPLATES = 5
  • フィールドは「件名」と「指示文(本文)」の2フィールド
  • IDは crypto.randomUUID() でUUID v4形式を生成
  • sort_orderはPhase 1では created_at による自動ソートとし、並び替えUIは将来拡張とする
  • /api/templates は既存の middleware.ts 認証の対象であり、認証必須とする

バリデーション仕様:

  • name: 必須、空文字不可、最大100文字(MAX_TEMPLATE_NAME_LENGTH = 100
  • content: 必須、空文字不可、最大1000文字(MAX_TEMPLATE_CONTENT_LENGTH = 1000、既存の MAX_USER_INSTRUCTION_LENGTH と同値)
  • バリデーション定数は src/config/review-config.ts に追加

2. テンプレート管理UI

Review画面にTemplateタブを追加(Review / Report / Template の3タブ構成)。

  • テンプレート一覧表示
  • 新規作成・編集・削除
  • 5件上限に達した場合はエラー表示

3. レポート生成時の3モード切替

ReportタブのUIにラジオボタンで3モードを提供:

○ 指示なし        … 従来通り、AIにおまかせ
● テンプレート選択  … ドロップダウンからテンプレートを選択
○ カスタム入力     … 従来の自由入力フィールド

テンプレート選択時は、選択したテンプレートの指示文をクライアント側で userInstruction としてレポート生成APIに渡す(POST /api/daily-summary のAPI変更は不要)。

3モード切替のstate遷移仕様:

  • テンプレート選択モードでは、選択したテンプレートの contentuserInstruction として使用される
  • モード切替時に userInstruction をリセットする(テンプレート選択 → カスタム入力 → テンプレート選択でも再選択可能)
  • テンプレート選択モードでは userInstruction は読み取り専用(編集不可)

主要な変更点

  • DB: report_templates テーブル追加(マイグレーション v25)
  • DB: migrations/index.ts へのマイグレーション登録、runner.ts のバージョン更新
  • API: /api/templates CRUD エンドポイント新設(既存 middleware.ts 認証が適用される)
  • UI: Review画面にTemplateタブ追加
  • UI: ReportタブにGeneration Mode切替UI追加
  • 既存の POST /api/daily-summary は変更不要(userInstruction パラメータをそのまま活用。テンプレートのcontentはクライアント側でuserInstructionとして送信する)

実装タスク

  • DB: src/lib/db/migrations/v25-report-templates.ts マイグレーションファイル作成
  • DB: src/lib/db/migrations/index.ts にv25マイグレーションのimportと配列追加
  • DB: src/lib/db/migrations/runner.ts の CURRENT_SCHEMA_VERSION を25に更新
  • DB: src/lib/db/migrations/runner.ts の validateSchema() の requiredTables 配列に report_templates を追加
  • DB: src/lib/db/template-db.ts CRUD実装(getAll, create, update, delete, getById)
  • API: src/app/api/templates/route.ts GET/POST エンドポイント
  • API: src/app/api/templates/[id]/route.ts PUT/DELETE エンドポイント
  • UI: src/components/review/TemplateTab.tsx テンプレート管理画面
  • UI: src/components/review/ReportTab.tsx に3モード切替UI追加
  • UI: src/app/review/page.tsx にTemplateタブ追加(3タブ構成)
  • 設定: src/config/review-config.ts にテンプレート関連定数追加(MAX_TEMPLATES = 5, MAX_TEMPLATE_NAME_LENGTH = 100, MAX_TEMPLATE_CONTENT_LENGTH = 1000)
  • テスト: tests/unit/lib/template-db.test.ts template-db のユニットテスト追加
  • テスト: tests/unit/api/templates.test.ts templates API のユニットテスト追加
  • テスト: tests/integration/auth-middleware.test.ts/api/templates の未認証アクセス拒否・AUTH_EXCLUDED_PATHS 非対象確認を追加
  • テスト: tests/unit/components/review/ReviewPage-stalled.test.tsx を3タブ構成に合わせて更新
  • テスト: tests/unit/components/review/ReportTab.test.tsx などで3モード切替・userInstruction リセット・読み取り専用制御を検証
  • テスト: tests/unit/lib/db-migrations.test.ts の CURRENT_SCHEMA_VERSION アサーション(3箇所)を25に更新

受入条件

  • テンプレートのCRUD(作成・読取・更新・削除)が動作すること
  • テンプレートの最大5件制限が機能すること(超過時にエラー表示)
  • テンプレートのname/contentバリデーションが機能すること(空文字拒否、最大文字数制限)
  • /api/templates が認証必須であり、未認証アクセスを拒否すること
  • レポート生成時に「指示なし / テンプレート選択 / カスタム入力」の3モードを切替可能
  • テンプレート選択モードで生成したレポートが、テンプレートの指示文に従った内容になること
  • テンプレート選択モードではuserInstructionが読み取り専用(テンプレートcontent表示のみ、編集不可)であること
  • モード切替時にuserInstructionがリセットされること(モード間の状態が混在しないこと)
  • 既存のレポート生成機能(指示なし・カスタム入力)に回帰がないこと
  • PC / モバイル両方でTemplateタブが表示・操作可能であり、320px幅相当でも3タブが崩れないこと
  • 関連ユニットテストが追加されていること

影響範囲

新規ファイル

ファイル 内容
src/lib/db/migrations/v25-report-templates.ts report_templates テーブルマイグレーション
src/lib/db/template-db.ts テンプレートCRUD操作
src/app/api/templates/route.ts テンプレート一覧取得・作成API
src/app/api/templates/[id]/route.ts テンプレート更新・削除API
src/components/review/TemplateTab.tsx テンプレート管理UI
tests/unit/lib/template-db.test.ts テンプレートDBユニットテスト
tests/unit/api/templates.test.ts テンプレートAPIユニットテスト
tests/unit/components/review/ReportTab.test.tsx ReportTab の3モード切替UIテスト

変更ファイル

ファイル 変更内容
src/lib/db/migrations/index.ts v25マイグレーションのimportと配列追加
src/lib/db/migrations/runner.ts CURRENT_SCHEMA_VERSION を25に更新、validateSchema() の requiredTables に report_templates 追加
src/app/review/page.tsx Templateタブ追加(3タブ構成)
src/components/review/ReportTab.tsx 3モード切替UI追加
src/config/review-config.ts テンプレート定数追加(MAX_TEMPLATES, MAX_TEMPLATE_NAME_LENGTH, MAX_TEMPLATE_CONTENT_LENGTH)
tests/integration/auth-middleware.test.ts /api/templates の認証保護確認を追加
tests/unit/components/review/ReviewPage-stalled.test.tsx Review / Report / Template の3タブ構成に合わせて更新
tests/unit/lib/db-migrations.test.ts CURRENT_SCHEMA_VERSION アサーション(3箇所)を24から25に更新

関連コンポーネント

  • src/lib/db/migrations/index.ts — マイグレーション配列登録
  • src/lib/db/migrations/runner.ts — CURRENT_SCHEMA_VERSION管理
  • src/lib/summary-prompt-builder.ts — userInstruction経由で既存連携

Note: Header.tsx / GlobalMobileNav.tsx のナビラベル("Review/Report")は変更不要。Templateタブは Review画面内の3タブ構成であり、グローバルナビゲーションへの影響はない。


レビュー履歴

Stage 1 (2026-04-04)

  • S1-001 (Must Fix): マイグレーション登録手順(migrations/index.ts, runner.ts)を実装タスクに追加
  • S1-002 (Should Fix): テンプレートID生成方式をcrypto.randomUUID()と明記
  • S1-003 (Should Fix): sort_orderはcreated_at順ソートで将来拡張とする旨を明記
  • S1-004 (Should Fix): バリデーション仕様を追記(MAX_TEMPLATE_NAME_LENGTH = 100, MAX_TEMPLATE_CONTENT_LENGTH = 1000)
  • S1-005 (Should Fix): 関連コンポーネントからdb-instance.tsを削除し、migrations/index.tsとrunner.tsを追加
  • S1-006 (Should Fix): テストファイルパスを明記(template-db.test.ts, templates.test.ts)
  • S1-007 (Nice to Have): マイグレーションファイル名をv25-report-templates.tsと確定
  • S1-009 (Nice to Have): daily-summary APIの変更は不要と明記

Stage 3 (2026-04-04)

  • S3-001 (Must Fix): 既存テスト db-migrations.test.ts の CURRENT_SCHEMA_VERSION アサーション更新を実装タスクに追加
  • S3-002 (Must Fix): validateSchema() の requiredTables に report_templates 追加を実装タスク・変更ファイルに追加
  • S3-005 (Should Fix): 関連コンポーネントから useLayoutConfig.ts を削除(変更不要のため)
  • S3-006 (Should Fix): 3モード切替のstate遷移仕様を追記(読み取り専用・リセット動作)、受入条件に反映
  • S3-007 (Nice to Have): Header.tsx/GlobalMobileNav.tsxのナビラベルは変更不要である旨をNoteとして記載

Stage 5 (2026-04-04)

  • S5-001 (Should Fix): /api/templates が既存 middleware 認証の対象であることを追記
  • S5-002 (Should Fix): 320px幅相当での3タブ表示・操作を受入条件に明記

Stage 7 (2026-04-04)

  • S7-001 (Should Fix): /api/templates の認証要件を担保する tests/integration/auth-middleware.test.ts の更新を追加
  • S7-002 (Should Fix): Review画面3タブ化とReportTab 3モード化に対するフロントエンドテスト更新・追加を実装タスクへ追加

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions