こんにちは。エンジニアのhamaです。
このブログはギークフィードアドベントカレンダー2025の13日目の記事です。
他の記事もぜひチェックしてみてください!
目次
自己紹介
クラウド開発事業部所属のhamaです。
エンジニア歴は十数年で、最近は開発をあまりしていないです。
普段使ってるAIツール
日常的に以下のAIツールを活用しています。
- Claude Code:メインのプロジェクトの開発
企画概要とゴール
今回、「フルAI開発バトル」という企画に参加しました。
ルールはシンプルかつ過酷です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 禁止事項:エディタで直接コードを書く・修正すること - 許されるのは「AIへの指示」のみ。人間の役割は「Architect/Reviewer」、つまりAIをマネジメントして成果物を判断することです。 # お題 社員の生産性を上げる日々の業務管理ツールを作ってください。 ## 必須要件: - KiroとPlaywright MCPを使うこと - スペック駆動開発を行うこと(vibe codingはNG) - Todoを追加・編集・削除できること - 追加は画面上部のフォームから可能 - 編集・削除は各行の操作ボタンで行う - 一覧でTodoを確認できること - 一覧にはタイトル、担当者、期限を表示 - サクサク軽く操作できること - 画面は1ページで完結 - PlaywrightでCRUD周りのテストをすること |
詳しいルールや目的はアドベントカレンダー1日目の記事で紹介しております。
作業プロセス
要件の理解と整理
渡された要件からどのようなものをつくればいいかをイメージして、最低限の機能と、実際に使う状況を予想して必要なものを追加していきました。
運営への質問事項
kiroを使うのが初めてだったため、基本的な操作を運営ではなく参加者に質問してすすめました。
- タスクがとまっている?>Terminalの入力待ちで止まっていただけだったので入力
- Commandを一回一回許可する必要があるか?>連続実行で許可するコマンドを選択することで解消
Specs定義
指示に至るまでの思考プロセス
- 要件から全体をイメージ
- 機能の洗い出してリスト化
- 機能毎の細かい動きを想定する
- 要件で漏れている部分がないか確認
- kiroへの指示のリスト化
Kiroへの指示
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
タスク管理ツールを作って webアプリ ログイン機能はなく、1ページ完結型 画面上部にタスク入力欄(タイトル、担当者、内容、期限)+ボタンからポップアップ入力でもいいよ 画面下部に一覧リスト(タイトル、担当者、期限) リスト選択すると編集ポップアップ画面表示 一覧には削除機能もほしい データは永続化 担当者でフィルタできる機能 今日やるべきことを優先度順に表示したい 品質保証として、Playwright MCPを活用し、E2Eテストが通っていることも要件 ステータス(未着手、着手中、完了)もつけて、完了したものはデフォルトでは表示しない。完了分も表示するチェックボックス的なものをつける 期限3日前〜当日までのタスクは上位に表示する 期限当日のものを背景薄い赤で表示 期限3日前を切ったものは背景薄い黄色で表示 |
Kiroの出力
- requirements.md
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# 要件定義書 ## はじめに 本システムは、シンプルで使いやすい1ページ完結型のタスク管理Webアプリケーションです。ログイン機能を持たず、誰でもすぐに使い始められることを目指します。タスクの作成、編集、削除、フィルタリング機能を提供し、優先度順にタスクを表示することで今日やるべきことを明確にします。データは永続化されます。 ## 用語集 - **システム**: タスク管理Webアプリケーション - **タスク**: タイトル、担当者、内容、期限、優先度、ステータスを持つ管理対象項目 - **優先度**: タスクの重要度を示す値(高、中、低) - **ステータス**: タスクの進捗状態を示す値(未着手、着手中、完了) - **タスクリスト**: 登録されたタスクの一覧表示 - **入力フォーム**: タスクの情報を入力するためのUI要素 - **ポップアップ**: モーダルダイアログとして表示される入力・編集画面 - **永続化**: ブラウザのローカルストレージを使用したデータ保存 - **E2Eテスト**: エンドツーエンドテスト。ユーザーの操作フローを自動化してテストする手法 - **Playwright**: ブラウザ自動化ツール。E2Eテストの実行に使用 ## 要件 ### 要件 1 **ユーザーストーリー:** ユーザーとして、新しいタスクを追加したいので、タスク情報を入力して保存できる機能が必要です。 #### 受入基準 1. WHEN ユーザーが画面上部の入力欄にタイトル、担当者、内容、期限、優先度、ステータスを入力して追加ボタンをクリックする THEN システムは新しいタスクを作成してタスクリストに追加する 2. WHEN ユーザーが画面上部の追加ボタンをクリックする THEN システムはポップアップ入力フォームを表示する 3. WHEN ユーザーがポップアップ内でタスク情報を入力して保存ボタンをクリックする THEN システムは新しいタスクを作成してタスクリストに追加しポップアップを閉じる 4. WHEN ユーザーが必須項目(タイトル)を空のまま保存しようとする THEN システムは保存を拒否してエラーメッセージを表示する 5. WHEN タスクが追加される THEN システムは即座にローカルストレージにデータを永続化する 6. WHEN ユーザーが優先度を指定しない THEN システムはデフォルト値として中優先度を設定する 7. WHEN ユーザーがステータスを指定しない THEN システムはデフォルト値として未着手ステータスを設定する ### 要件 2 **ユーザーストーリー:** ユーザーとして、登録済みのタスクを一覧で確認したいので、タスクリストが表示される機能が必要です。 #### 受入基準 1. WHEN ユーザーがアプリケーションを開く THEN システムは画面下部にタスクリストを表示する 2. WHEN タスクリストを表示する THEN システムは各タスクのタイトル、担当者、期限、優先度、ステータスを表示する 3. WHEN ページが読み込まれる THEN システムはローカルストレージから保存済みタスクを読み込んでタスクリストに表示する 4. WHEN タスクリストが空の場合 THEN システムは適切な空状態メッセージを表示する 5. WHEN タスクリストを表示する THEN システムは優先度順(高、中、低)にタスクをソートして表示する 6. WHEN 同じ優先度のタスクが複数存在する THEN システムは期限が近い順にタスクを表示する 7. WHEN タスクの期限が3日前から当日までの範囲にある THEN システムは該当タスクを優先度に関わらず上位に表示する 8. WHEN タスクの期限が当日である THEN システムは該当タスクの背景を薄い赤色で表示する 9. WHEN タスクの期限が3日前から前日までの範囲にある THEN システムは該当タスクの背景を薄い黄色で表示する 10. WHEN タスクリストを表示する THEN システムはデフォルトで完了ステータス以外のタスクのみを表示する 11. WHEN 完了タスクも表示するチェックボックスがオンになる THEN システムは完了ステータスのタスクも含めてタスクリストに表示する 12. WHEN 完了タスクも表示するチェックボックスがオフになる THEN システムは完了ステータスのタスクを非表示にする ### 要件 3 **ユーザーストーリー:** ユーザーとして、既存のタスクを編集したいので、タスクを選択して内容を変更できる機能が必要です。 #### 受入基準 1. WHEN ユーザーがタスクリスト内のタスクをクリックする THEN システムは編集ポップアップを表示して現在のタスク情報を入力フォームに表示する 2. WHEN ユーザーが編集ポップアップ内でタスク情報を変更して保存ボタンをクリックする THEN システムはタスク情報を更新してタスクリストに反映しポップアップを閉じる 3. WHEN タスクが編集される THEN システムは即座にローカルストレージにデータを永続化する 4. WHEN ユーザーが編集ポップアップでキャンセルボタンをクリックする THEN システムは変更を破棄してポップアップを閉じる ### 要件 4 **ユーザーストーリー:** ユーザーとして、不要になったタスクを削除したいので、タスクリストから削除できる機能が必要です。 #### 受入基準 1. WHEN ユーザーがタスクリスト内の削除ボタンをクリックする THEN システムは該当タスクをタスクリストから削除する 2. WHEN タスクが削除される THEN システムは即座にローカルストレージから該当データを削除する 3. WHEN ユーザーが削除ボタンをクリックする THEN システムは削除確認ダイアログを表示する 4. WHEN ユーザーが削除確認ダイアログで確認する THEN システムはタスクを削除する 5. WHEN ユーザーが削除確認ダイアログでキャンセルする THEN システムは削除を中止する ### 要件 9 **ユーザーストーリー:** ユーザーとして、完了したタスクを未完了に戻したいので、完了タスクのステータスを変更できる機能が必要です。 #### 受入基準 1. WHEN ユーザーが完了ステータスのタスクをクリックする THEN システムは編集ポップアップを表示してステータスを変更可能にする 2. WHEN ユーザーが完了タスクのステータスを未着手または着手中に変更して保存する THEN システムはタスクのステータスを更新してタスクリストに反映する 3. WHEN 完了タスクのステータスが変更される THEN システムは即座にローカルストレージにデータを永続化する 4. WHEN 完了タスクも表示するチェックボックスがオフの状態で完了タスクを未完了に戻す THEN システムは該当タスクをタスクリストに表示する ### 要件 5 **ユーザーストーリー:** ユーザーとして、特定の担当者のタスクだけを表示したいので、担当者でフィルタリングできる機能が必要です。 #### 受入基準 1. WHEN ユーザーが担当者フィルタを選択する THEN システムは選択された担当者のタスクのみをタスクリストに表示する 2. WHEN 担当者フィルタが適用される THEN システムはフィルタ条件に一致しないタスクを非表示にする 3. WHEN ユーザーがフィルタをクリアする THEN システムはすべてのタスクをタスクリストに表示する 4. WHEN タスクリストに複数の担当者が存在する THEN システムはフィルタ選択肢として利用可能な担当者リストを表示する 5. WHEN 担当者フィルタが適用される THEN システムはフィルタ後のタスクも優先度順と期限順でソートして表示する 6. WHEN 担当者フィルタと完了タスク表示チェックボックスが両方適用される THEN システムは両方の条件を満たすタスクのみを表示する ### 要件 6 **ユーザーストーリー:** ユーザーとして、データが失われないようにしたいので、タスク情報が永続化される機能が必要です。 #### 受入基準 1. WHEN タスクが作成、編集、削除される THEN システムは即座にローカルストレージにデータを保存する 2. WHEN ページがリロードされる THEN システムはローカルストレージからタスクデータを復元してタスクリストに表示する 3. WHEN ローカルストレージへの保存が失敗する THEN システムはエラーメッセージを表示する 4. WHEN ローカルストレージのデータが破損している THEN システムは適切にエラーハンドリングして空のタスクリストを表示する ### 要件 7 **ユーザーストーリー:** ユーザーとして、使いやすいインターフェースでタスクを管理したいので、1ページ完結型のシンプルなUIが必要です。 #### 受入基準 1. WHEN ユーザーがアプリケーションを開く THEN システムは単一ページ内にすべての機能を表示する 2. WHEN 画面を表示する THEN システムは上部に入力エリア、下部にタスクリストを配置する 3. WHEN ポップアップが表示される THEN システムは背景をオーバーレイして入力フォームにフォーカスする 4. WHEN ユーザーがポップアップ外をクリックする THEN システムはポップアップを閉じる ### 要件 10 **ユーザーストーリー:** 開発者として、アプリケーションの品質を保証したいので、主要なユーザーフローをカバーするE2Eテストが必要です。 #### 受入基準 1. WHEN E2Eテストスイートが実行される THEN システムはタスク追加フローをテストして成功を確認する 2. WHEN E2Eテストスイートが実行される THEN システムはタスク編集フローをテストして成功を確認する 3. WHEN E2Eテストスイートが実行される THEN システムはタスク削除フローをテストして成功を確認する 4. WHEN E2Eテストスイートが実行される THEN システムは担当者フィルタ機能をテストして成功を確認する 5. WHEN E2Eテストスイートが実行される THEN システムは優先度ソート機能をテストして成功を確認する 6. WHEN E2Eテストスイートが実行される THEN システムはステータス変更機能をテストして成功を確認する 7. WHEN E2Eテストスイートが実行される THEN システムは完了タスク表示切替機能をテストして成功を確認する 8. WHEN E2Eテストスイートが実行される THEN システムは完了タスクを未完了に戻す機能をテストして成功を確認する 9. WHEN E2Eテストスイートが実行される THEN システムは期限に基づく表示機能をテストして成功を確認する 10. WHEN E2Eテストスイートが実行される THEN システムはデータ永続化をテストして成功を確認する 11. WHEN すべてのE2Eテストが実行される THEN システムはすべてのテストケースが合格することを確認する |
- design.md
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 |
# 設計書 ## 概要 本システムは、シンプルで使いやすい1ページ完結型のタスク管理Webアプリケーションです。フロントエンドのみで動作し、ローカルストレージを使用してデータを永続化します。React + TypeScriptで実装し、状態管理にはReactのuseStateとuseEffectフックを使用します。 ### 技術スタック - **フロントエンド**: React 18 + TypeScript - **ビルドツール**: Vite - **スタイリング**: CSS Modules - **データ永続化**: LocalStorage API - **E2Eテスト**: Playwright - **ユニットテスト**: Vitest + React Testing Library ## アーキテクチャ ### レイヤー構成 ``` ┌─────────────────────────────────────┐ │ UI Components │ │ (TaskForm, TaskList, TaskItem) │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ Application State │ │ (React State Management) │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ Business Logic │ │ (Task operations, filtering, │ │ sorting, validation) │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ Storage Layer │ │ (LocalStorage wrapper) │ └─────────────────────────────────────┘ ``` ### ディレクトリ構造 ``` src/ ├── components/ │ ├── TaskForm.tsx # タスク入力フォーム │ ├── TaskList.tsx # タスク一覧表示 │ ├── TaskItem.tsx # タスク個別アイテム │ ├── Modal.tsx # モーダルダイアログ │ └── FilterBar.tsx # フィルタ・表示切替UI ├── types/ │ └── task.ts # タスク型定義 ├── utils/ │ ├── storage.ts # LocalStorage操作 │ ├── taskOperations.ts # タスク操作ロジック │ └── validation.ts # バリデーション ├── App.tsx # メインアプリケーション └── main.tsx # エントリーポイント tests/ ├── unit/ # ユニットテスト └── e2e/ # E2Eテスト ``` ## コンポーネントとインターフェース ### データモデル #### Task型 ```typescript interface Task { id: string; // UUID title: string; // タイトル(必須) assignee: string; // 担当者 description: string; // 内容 dueDate: string | null; // 期限(ISO 8601形式) priority: 'high' | 'medium' | 'low'; // 優先度 status: 'not_started' | 'in_progress' | 'completed'; // ステータス createdAt: string; // 作成日時(ISO 8601形式) updatedAt: string; // 更新日時(ISO 8601形式) } ``` #### TaskFormData型 ```typescript interface TaskFormData { title: string; assignee: string; description: string; dueDate: string; priority: 'high' | 'medium' | 'low'; status: 'not_started' | 'in_progress' | 'completed'; } ``` #### FilterState型 ```typescript interface FilterState { assignee: string | null; // 担当者フィルタ(nullは全て) showCompleted: boolean; // 完了タスク表示フラグ } ``` ### コンポーネント設計 #### App.tsx メインアプリケーションコンポーネント。全体の状態管理とコンポーネント統合を担当。 **State:** - `tasks: Task[]` - タスクリスト - `filter: FilterState` - フィルタ状態 - `isModalOpen: boolean` - モーダル表示状態 - `editingTask: Task | null` - 編集中のタスク **主要メソッド:** - `addTask(formData: TaskFormData): void` - タスク追加 - `updateTask(id: string, formData: TaskFormData): void` - タスク更新 - `deleteTask(id: string): void` - タスク削除 - `setFilter(filter: FilterState): void` - フィルタ設定 #### TaskForm.tsx タスク入力フォームコンポーネント。新規作成と編集の両方に対応。 **Props:** - `initialData?: TaskFormData` - 初期値(編集時) - `onSubmit: (data: TaskFormData) => void` - 送信ハンドラ - `onCancel: () => void` - キャンセルハンドラ #### TaskList.tsx タスク一覧表示コンポーネント。フィルタリングとソートを適用。 **Props:** - `tasks: Task[]` - タスクリスト - `filter: FilterState` - フィルタ状態 - `onTaskClick: (task: Task) => void` - タスククリックハンドラ - `onDeleteTask: (id: string) => void` - 削除ハンドラ #### TaskItem.tsx 個別タスク表示コンポーネント。期限に基づいて背景色を変更。 **Props:** - `task: Task` - タスクデータ - `onClick: () => void` - クリックハンドラ - `onDelete: () => void` - 削除ハンドラ **スタイリング:** - 期限当日: 背景色を薄い赤色(#ffe6e6)で表示 - 期限3日前〜前日: 背景色を薄い黄色(#fff9e6)で表示 - その他: デフォルトの背景色 #### Modal.tsx 汎用モーダルダイアログコンポーネント。 **Props:** - `isOpen: boolean` - 表示状態 - `onClose: () => void` - 閉じるハンドラ - `children: ReactNode` - モーダル内容 #### FilterBar.tsx フィルタと表示切替UIコンポーネント。 **Props:** - `filter: FilterState` - 現在のフィルタ状態 - `availableAssignees: string[]` - 選択可能な担当者リスト - `onFilterChange: (filter: FilterState) => void` - フィルタ変更ハンドラ ### ユーティリティ関数 #### storage.ts ```typescript // タスクをLocalStorageに保存 function saveTasks(tasks: Task[]): void // タスクをLocalStorageから読み込み function loadTasks(): Task[] // LocalStorageをクリア function clearTasks(): void ``` #### taskOperations.ts ```typescript // タスクをフィルタリング function filterTasks(tasks: Task[], filter: FilterState): Task[] // タスクをソート(優先度→期限順、緊急タスクを上位に) function sortTasks(tasks: Task[]): Task[] // 新しいタスクを作成 function createTask(formData: TaskFormData): Task // タスクを更新 function updateTaskData(task: Task, formData: TaskFormData): Task // 担当者リストを抽出 function getUniqueAssignees(tasks: Task[]): string[] // タスクの期限状態を判定 function getDueDateStatus(dueDate: string | null): 'overdue' | 'today' | 'upcoming' | 'normal' // タスクが緊急(3日前〜当日)かどうかを判定 function isUrgentTask(dueDate: string | null): boolean ``` #### validation.ts ```typescript // タスクフォームデータのバリデーション function validateTaskForm(formData: TaskFormData): ValidationResult interface ValidationResult { isValid: boolean; errors: Record<string, string>; } ``` ## データモデル ### Task タスクは以下の属性を持ちます: - **id**: UUID形式の一意識別子。タスク作成時に自動生成 - **title**: タスクのタイトル。必須項目で空文字列は許可しない - **assignee**: 担当者名。空文字列可 - **description**: タスクの詳細説明。空文字列可 - **dueDate**: 期限。ISO 8601形式の日付文字列またはnull - **priority**: 優先度。'high', 'medium', 'low'のいずれか。デフォルトは'medium' - **status**: ステータス。'not_started', 'in_progress', 'completed'のいずれか。デフォルトは'not_started' - **createdAt**: 作成日時。ISO 8601形式のタイムスタンプ - **updatedAt**: 更新日時。ISO 8601形式のタイムスタンプ ### LocalStorage形式 タスクデータはJSON配列としてLocalStorageに保存されます。 **キー**: `tasks` **値の例**: ```json [ { "id": "550e8400-e29b-41d4-a716-446655440000", "title": "設計書を作成する", "assignee": "田中", "description": "タスク管理アプリの設計書を作成", "dueDate": "2025-11-30T00:00:00.000Z", "priority": "high", "status": "in_progress", "createdAt": "2025-11-27T10:00:00.000Z", "updatedAt": "2025-11-27T11:00:00.000Z" } ] ``` ## 正確性プロパティ *プロパティとは、システムのすべての有効な実行において真であるべき特性や動作のことです。本質的には、システムが何をすべきかについての形式的な記述です。プロパティは、人間が読める仕様と機械で検証可能な正確性保証との橋渡しとなります。* ### プロパティ 1: タスク追加でリスト増加 *任意の*有効なタスクデータに対して、タスクを追加すると、タスクリストの長さが1増加する **検証: 要件 1.1, 1.3** ### プロパティ 2: 空タイトルの拒否 *任意の*空白文字のみで構成されたタイトルに対して、タスク追加を試みると、システムはそれを拒否し、タスクリストは変更されない **検証: 要件 1.4** ### プロパティ 3: 永続化ラウンドトリップ *任意の*タスクリストに対して、LocalStorageに保存してから読み込むと、元のタスクリストと同等のデータが復元される **検証: 要件 1.5, 3.3, 4.2, 6.1, 6.2** ### プロパティ 4: タスク表示に必要情報含む *任意の*タスクに対して、そのレンダリング結果には、タイトル、担当者、期限、優先度、ステータスのすべての情報が含まれる **検証: 要件 2.2** ### プロパティ 5: 優先度と期限でソート *任意の*タスクリストに対して、ソート後のリストは緊急タスク(期限3日前〜当日)が最上位に表示され、その後は優先度順(高→中→低)で並び、同じ優先度内では期限が近い順に並ぶ **検証: 要件 2.5, 2.6, 2.7** ### プロパティ 16: 期限当日タスクの背景色 *任意の*期限が当日のタスクに対して、そのレンダリング結果には薄い赤色の背景色が適用される **検証: 要件 2.8** ### プロパティ 17: 期限3日前タスクの背景色 *任意の*期限が3日前から前日までのタスクに対して、そのレンダリング結果には薄い黄色の背景色が適用される **検証: 要件 2.9** ### プロパティ 18: 完了タスクのステータス変更 *任意の*完了ステータスのタスクに対して、ステータスを未着手または着手中に変更すると、タスクリスト内の該当タスクのステータスが更新される **検証: 要件 9.2** ### プロパティ 19: 完了タスク変更後の表示 *任意の*完了ステータスのタスクに対して、showCompletedがfalseの状態でステータスを未完了に変更すると、該当タスクがタスクリストに表示される **検証: 要件 9.4** ### プロパティ 6: デフォルトで完了タスク非表示 *任意の*タスクリストに対して、showCompletedがfalseの場合、フィルタ後のリストには完了ステータスのタスクが含まれない **検証: 要件 2.10, 2.12** ### プロパティ 7: 完了タスク表示切替 *任意の*タスクリストに対して、showCompletedがtrueの場合、フィルタ後のリストには完了ステータスのタスクも含まれる **検証: 要件 2.11** ### プロパティ 8: タスク更新の反映 *任意の*タスクと任意の有効な更新データに対して、タスクを更新すると、タスクリスト内の該当タスクが新しいデータで置き換えられる **検証: 要件 3.2** ### プロパティ 9: 編集キャンセルで状態保持 *任意の*タスクに対して、編集を開始してからキャンセルすると、タスクの状態は編集前と同じままである **検証: 要件 3.4** ### プロパティ 10: タスク削除でリスト減少 *任意の*タスクリストと任意のタスクIDに対して、そのIDのタスクを削除すると、タスクリストの長さが1減少し、該当タスクが含まれなくなる **検証: 要件 4.1, 4.2, 4.4** ### プロパティ 11: 削除キャンセルで状態保持 *任意の*タスクリストに対して、削除をキャンセルすると、タスクリストは変更されない **検証: 要件 4.5** ### プロパティ 12: 担当者フィルタの適用 *任意の*タスクリストと任意の担当者名に対して、その担当者でフィルタすると、結果リストにはその担当者のタスクのみが含まれる **検証: 要件 5.1, 5.2** ### プロパティ 13: フィルタクリアで全表示 *任意の*タスクリストに対して、担当者フィルタをnullに設定すると、showCompletedの設定に応じてすべての該当タスクが表示される **検証: 要件 5.3** ### プロパティ 14: 担当者リスト抽出 *任意の*タスクリストに対して、抽出された担当者リストには、タスクリスト内のすべてのユニークな担当者が含まれ、重複はない **検証: 要件 5.4** ### プロパティ 15: 複数フィルタの組み合わせ *任意の*タスクリストに対して、担当者フィルタとshowCompletedフィルタを両方適用すると、結果リストには両方の条件を満たすタスクのみが含まれる **検証: 要件 5.6** ## エラーハンドリング ### バリデーションエラー - タイトルが空または空白のみの場合、エラーメッセージを表示し、タスクを作成しない - エラーメッセージは入力フォーム内に表示し、ユーザーが修正できるようにする ### LocalStorageエラー - LocalStorageへの保存が失敗した場合(容量超過など)、ユーザーにエラーメッセージを表示 - LocalStorageからの読み込みが失敗した場合(データ破損など)、空のタスクリストで初期化し、警告メッセージを表示 - JSON.parseエラーをキャッチし、適切にハンドリング ### 削除確認 - タスク削除時は必ず確認ダイアログを表示 - ユーザーが確認した場合のみ削除を実行 - キャンセルした場合は何も変更しない ## テスト戦略 ### ユニットテスト ユニットテストは、個別の関数やコンポーネントの動作を検証します。以下の領域をカバーします: **ユーティリティ関数のテスト:** - `filterTasks`: 各フィルタ条件が正しく適用されることを確認 - `sortTasks`: ソートロジックが正しく動作することを確認 - `validateTaskForm`: バリデーションルールが正しく適用されることを確認 - `saveTasks/loadTasks`: LocalStorage操作が正しく動作することを確認(モック使用) **コンポーネントのテスト:** - `TaskForm`: フォーム入力とバリデーションの動作を確認 - `TaskItem`: タスク表示とイベントハンドラの動作を確認 - `FilterBar`: フィルタUIの動作を確認 **エッジケースのテスト:** - 空のタスクリスト - LocalStorageデータの破損 - 無効な日付形式 ### プロパティベーステスト プロパティベーステストは、多数のランダムな入力に対してシステムの普遍的な性質を検証します。JavaScriptのプロパティベーステストライブラリとして**fast-check**を使用します。 **テスト設定:** - 各プロパティテストは最低100回の反復を実行 - 各プロパティテストには、設計書の正確性プロパティを参照するコメントを付与 - コメント形式: `// Feature: task-manager-web, Property {番号}: {プロパティテキスト}` **実装するプロパティテスト:** 各正確性プロパティに対して、対応するプロパティベーステストを実装します: 1. **プロパティ 1のテスト**: ランダムなタスクデータを生成し、追加後にリスト長が1増加することを確認 2. **プロパティ 2のテスト**: ランダムな空白文字列を生成し、追加が拒否されることを確認 3. **プロパティ 3のテスト**: ランダムなタスクリストを生成し、保存→読み込みで同等のデータが復元されることを確認 4. **プロパティ 4のテスト**: ランダムなタスクを生成し、レンダリング結果に必要な情報が含まれることを確認 5. **プロパティ 5のテスト**: ランダムなタスクリスト(緊急タスク含む)を生成し、ソート順が正しいことを確認(緊急タスクが最上位) 6. **プロパティ 6のテスト**: ランダムなタスクリスト(完了タスク含む)を生成し、フィルタ後に完了タスクが含まれないことを確認 7. **プロパティ 7のテスト**: ランダムなタスクリスト(完了タスク含む)を生成し、フィルタ後に完了タスクが含まれることを確認 8. **プロパティ 8のテスト**: ランダムなタスクと更新データを生成し、更新が正しく反映されることを確認 9. **プロパティ 9のテスト**: ランダムなタスクを生成し、編集キャンセル後に元の状態が保持されることを確認 10. **プロパティ 10のテスト**: ランダムなタスクリストを生成し、削除後にリスト長が1減少し、該当タスクが含まれないことを確認 11. **プロパティ 11のテスト**: ランダムなタスクリストを生成し、削除キャンセル後にリストが変更されないことを確認 12. **プロパティ 12のテスト**: ランダムなタスクリストと担当者名を生成し、フィルタ後に該当担当者のタスクのみが含まれることを確認 13. **プロパティ 13のテスト**: ランダムなタスクリストを生成し、フィルタクリア後に適切なタスクが表示されることを確認 14. **プロパティ 14のテスト**: ランダムなタスクリストを生成し、担当者リストにユニークな担当者のみが含まれることを確認 15. **プロパティ 15のテスト**: ランダムなタスクリストを生成し、複数フィルタ適用後に両方の条件を満たすタスクのみが含まれることを確認 16. **プロパティ 16のテスト**: 期限が当日のタスクを生成し、レンダリング結果に薄い赤色の背景色が適用されることを確認 17. **プロパティ 17のテスト**: 期限が3日前から前日までのタスクを生成し、レンダリング結果に薄い黄色の背景色が適用されることを確認 18. **プロパティ 18のテスト**: ランダムな完了タスクを生成し、ステータスを未完了に変更して更新が正しく反映されることを確認 19. **プロパティ 19のテスト**: ランダムな完了タスクを生成し、showCompletedがfalseの状態でステータスを未完了に変更して表示されることを確認 ### E2Eテスト E2Eテストは、実際のブラウザ環境でユーザーの操作フローを自動化してテストします。**Playwright**を使用して実装します。 **テストシナリオ:** 1. **タスク追加フロー** - ページを開く - 追加ボタンをクリックしてポップアップを開く - タスク情報を入力 - 保存ボタンをクリック - タスクリストに新しいタスクが表示されることを確認 2. **タスク編集フロー** - タスクを追加 - タスクをクリックして編集ポップアップを開く - タスク情報を変更 - 保存ボタンをクリック - タスクリストに更新されたタスクが表示されることを確認 3. **タスク削除フロー** - タスクを追加 - 削除ボタンをクリック - 確認ダイアログで確認 - タスクリストからタスクが削除されることを確認 4. **担当者フィルタ機能** - 複数の担当者のタスクを追加 - 担当者フィルタを選択 - 該当担当者のタスクのみが表示されることを確認 - フィルタをクリア - すべてのタスクが表示されることを確認 5. **優先度ソート機能** - 異なる優先度のタスクを追加 - タスクリストが優先度順に表示されることを確認 6. **ステータス変更機能** - タスクを追加 - タスクを編集してステータスを変更 - 変更が反映されることを確認 7. **完了タスク表示切替機能** - 完了タスクを追加 - デフォルトで完了タスクが非表示であることを確認 - 「完了タスクも表示」チェックボックスをオン - 完了タスクが表示されることを確認 - チェックボックスをオフ - 完了タスクが非表示になることを確認 8. **データ永続化** - タスクを追加 - ページをリロード - タスクが保持されていることを確認 9. **期限に基づく表示機能** - 期限が当日、3日前、1週間後のタスクを追加 - 緊急タスク(3日前〜当日)が上位に表示されることを確認 - 期限当日のタスクが薄い赤色の背景で表示されることを確認 - 期限3日前のタスクが薄い黄色の背景で表示されることを確認 10. **完了タスクを未完了に戻す機能** - 完了ステータスのタスクを追加 - 完了タスクも表示するチェックボックスをオン - 完了タスクをクリックして編集ポップアップを開く - ステータスを未着手または着手中に変更 - 保存ボタンをクリック - タスクリストに未完了タスクとして表示されることを確認 **テスト環境:** - ブラウザ: Chromium, Firefox, WebKit(クロスブラウザテスト) - ビューポート: デスクトップサイズ(1280x720) - LocalStorageのクリーンアップを各テスト前に実行 ## 実装の考慮事項 ### パフォーマンス - タスク数が増えても快適に動作するよう、リストレンダリングを最適化 - LocalStorageへの書き込みは必要最小限に(デバウンスは不要、即座に保存) - フィルタとソートは効率的なアルゴリズムを使用 ### アクセシビリティ - セマンティックHTMLを使用 - キーボード操作をサポート(Tab、Enter、Escapeキー) - ARIAラベルを適切に設定 - フォーカス管理を適切に実装 ### レスポンシブデザイン - デスクトップ環境を主なターゲットとするが、タブレットでも使用可能 - モバイルは優先度低(将来の拡張として考慮) ### ブラウザ互換性 - モダンブラウザ(Chrome、Firefox、Safari、Edge)の最新版をサポート - LocalStorage APIが利用可能な環境を前提 |
- tasks.md
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
# 実装計画 - [x] 1. プロジェクトのセットアップ - Vite + React + TypeScriptプロジェクトを初期化 - 必要な依存関係をインストール(fast-check、Vitest、React Testing Library、Playwright) - ディレクトリ構造を作成 - _要件: 7.1_ - [x] 2. 型定義とユーティリティ関数の実装 - [x] 2.1 型定義を作成 - Task、TaskFormData、FilterState、ValidationResult型を定義 - _要件: 1.1, 2.2_ - [x] 2.2 バリデーション関数を実装 - validateTaskForm関数を実装 - タイトルの空白チェックを含む - _要件: 1.4_ - [x] 2.3 プロパティテスト: 空タイトルの拒否 - **プロパティ 2: 空タイトルの拒否** - **検証: 要件 1.4** - [x] 2.4 LocalStorage操作関数を実装 - saveTasks、loadTasks、clearTasks関数を実装 - エラーハンドリングを含む - _要件: 1.5, 6.1, 6.2, 6.3, 6.4_ - [x] 2.5 プロパティテスト: 永続化ラウンドトリップ - **プロパティ 3: 永続化ラウンドトリップ** - **検証: 要件 1.5, 3.3, 4.2, 6.1, 6.2** - [x] 2.6 タスク操作関数を実装 - createTask、updateTaskData関数を実装 - UUID生成とタイムスタンプ処理を含む - デフォルト値(優先度: medium、ステータス: not_started)を設定 - _要件: 1.1, 1.6, 1.7, 3.2_ - [x] 2.7 フィルタリング関数を実装 - filterTasks関数を実装 - 担当者フィルタとshowCompletedフィルタをサポート - _要件: 2.7, 5.1, 5.6_ - [x] 2.8 プロパティテスト: デフォルトで完了タスク非表示 - **プロパティ 6: デフォルトで完了タスク非表示** - **検証: 要件 2.7, 2.9** - [x] 2.9 プロパティテスト: 完了タスク表示切替 - **プロパティ 7: 完了タスク表示切替** - **検証: 要件 2.8** - [x] 2.10 プロパティテスト: 担当者フィルタの適用 - **プロパティ 12: 担当者フィルタの適用** - **検証: 要件 5.1, 5.2** - [x] 2.11 プロパティテスト: フィルタクリアで全表示 - **プロパティ 13: フィルタクリアで全表示** - **検証: 要件 5.3** - [x] 2.12 プロパティテスト: 複数フィルタの組み合わせ - **プロパティ 15: 複数フィルタの組み合わせ** - **検証: 要件 5.6** - [x] 2.13 期限判定関数を実装 - getDueDateStatus関数を実装(期限状態を判定) - isUrgentTask関数を実装(緊急タスクかどうかを判定) - _要件: 2.7, 2.8, 2.9_ - [x] 2.14 ソート関数を実装 - sortTasks関数を実装 - 緊急タスク(期限3日前〜当日)を最上位に表示 - その後は優先度順(高→中→低)、同優先度内で期限順にソート - _要件: 2.5, 2.6, 2.7, 5.5_ - [x] 2.15 プロパティテスト: 優先度と期限でソート - **プロパティ 5: 優先度と期限でソート** - **検証: 要件 2.5, 2.6, 2.7** - [x] 2.16 担当者リスト抽出関数を実装 - getUniqueAssignees関数を実装 - _要件: 5.4_ - [x] 2.17 プロパティテスト: 担当者リスト抽出 - **プロパティ 14: 担当者リスト抽出** - **検証: 要件 5.4** - [x] 3. 基本UIコンポーネントの実装 - [x] 3.1 Modalコンポーネントを実装 - モーダルダイアログの表示/非表示 - 背景オーバーレイ - 外側クリックで閉じる機能 - Escapeキーで閉じる機能 - _要件: 7.3, 7.4_ - [x] 3.2 TaskFormコンポーネントを実装 - タイトル、担当者、内容、期限、優先度、ステータスの入力フィールド - バリデーションエラー表示 - 送信とキャンセルボタン - _要件: 1.1, 1.2, 1.3, 1.4_ - [x] 3.3 TaskItemコンポーネントを実装 - タスク情報の表示(タイトル、担当者、期限、優先度、ステータス) - 期限に基づく背景色の適用(当日: 薄い赤色、3日前〜前日: 薄い黄色) - クリックイベントハンドラ - 削除ボタン - _要件: 2.2, 2.8, 2.9, 4.1_ - [x] 3.4 プロパティテスト: タスク表示に必要情報含む - **プロパティ 4: タスク表示に必要情報含む** - **検証: 要件 2.2** - [x] 3.5 プロパティテスト: 期限当日タスクの背景色 - **プロパティ 16: 期限当日タスクの背景色** - **検証: 要件 2.8** - [x] 3.6 プロパティテスト: 期限3日前タスクの背景色 - **プロパティ 17: 期限3日前タスクの背景色** - **検証: 要件 2.9** - [x] 3.7 FilterBarコンポーネントを実装 - 担当者フィルタのドロップダウン - 完了タスク表示チェックボックス - フィルタクリアボタン - _要件: 2.10, 2.11, 5.1, 5.3_ - [x] 3.8 TaskListコンポーネントを実装 - フィルタリングとソートを適用したタスクリストの表示 - 空状態メッセージ - TaskItemコンポーネントの統合 - _要件: 2.1, 2.4, 2.5, 2.7, 2.10_ - [x] 4. メインアプリケーションの実装 - [x] 4.1 App.tsxを実装 - 状態管理(tasks、filter、isModalOpen、editingTask) - LocalStorageからの初期データ読み込み - タスク追加、更新、削除のハンドラ - フィルタ変更のハンドラ - すべてのコンポーネントを統合 - _要件: 1.1, 1.5, 2.3, 3.2, 4.1, 5.1, 6.2, 7.1, 7.2_ - [x] 4.2 プロパティテスト: タスク追加でリスト増加 - **プロパティ 1: タスク追加でリスト増加** - **検証: 要件 1.1, 1.3** - [x] 4.3 プロパティテスト: タスク更新の反映 - **プロパティ 8: タスク更新の反映** - **検証: 要件 3.2** - [x] 4.4 プロパティテスト: 編集キャンセルで状態保持 - **プロパティ 9: 編集キャンセルで状態保持** - **検証: 要件 3.4** - [x] 4.5 プロパティテスト: タスク削除でリスト減少 - **プロパティ 10: タスク削除でリスト減少** - **検証: 要件 4.1, 4.2, 4.4** - [x] 4.6 プロパティテスト: 削除キャンセルで状態保持 - **プロパティ 11: 削除キャンセルで状態保持** - **検証: 要件 4.5** - [x] 4.7 プロパティテスト: 完了タスクのステータス変更 - **プロパティ 18: 完了タスクのステータス変更** - **検証: 要件 9.2** - [x] 4.8 プロパティテスト: 完了タスク変更後の表示 - **プロパティ 19: 完了タスク変更後の表示** - **検証: 要件 9.4** - [x] 5. チェックポイント - すべてのテストが通ることを確認 - すべてのテストが通ることを確認し、問題があれば質問する - [x] 6. スタイリングの実装 - [x] 6.1 CSS Modulesでスタイルを作成 - レイアウト(上部入力エリア、下部タスクリスト) - モーダルスタイル - タスクアイテムのスタイル(期限に基づく背景色を含む) - フィルタバーのスタイル - レスポンシブデザイン(デスクトップ優先) - _要件: 2.8, 2.9, 7.2_ - [x] 7. E2Eテストの実装 - [x] 7.1 Playwrightのセットアップ - Playwright設定ファイルを作成 - テスト環境の設定(ブラウザ、ビューポート) - LocalStorageクリーンアップのヘルパー関数 - _要件: 8.1-8.9_ - [x] 7.2 タスク追加フローのE2Eテスト - ページを開く - 追加ボタンをクリックしてポップアップを開く - タスク情報を入力 - 保存ボタンをクリック - タスクリストに新しいタスクが表示されることを確認 - _要件: 8.1_ - [x] 7.3 タスク編集フローのE2Eテスト - タスクを追加 - タスクをクリックして編集ポップアップを開く - タスク情報を変更 - 保存ボタンをクリック - タスクリストに更新されたタスクが表示されることを確認 - _要件: 8.2_ - [x] 7.4 タスク削除フローのE2Eテスト - タスクを追加 - 削除ボタンをクリック - 確認ダイアログで確認 - タスクリストからタスクが削除されることを確認 - _要件: 8.3_ - [x] 7.5 担当者フィルタ機能のE2Eテスト - 複数の担当者のタスクを追加 - 担当者フィルタを選択 - 該当担当者のタスクのみが表示されることを確認 - フィルタをクリア - すべてのタスクが表示されることを確認 - _要件: 8.4_ - [x] 7.6 優先度ソート機能のE2Eテスト - 異なる優先度のタスクを追加 - タスクリストが優先度順に表示されることを確認 - _要件: 8.5_ - [x] 7.7 ステータス変更機能のE2Eテスト - タスクを追加 - タスクを編集してステータスを変更 - 変更が反映されることを確認 - _要件: 8.6_ - [x] 7.8 完了タスク表示切替機能のE2Eテスト - 完了タスクを追加 - デフォルトで完了タスクが非表示であることを確認 - 「完了タスクも表示」チェックボックスをオン - 完了タスクが表示されることを確認 - チェックボックスをオフ - 完了タスクが非表示になることを確認 - _要件: 8.7_ - [x] 7.9 完了タスクを未完了に戻す機能のE2Eテスト - 完了ステータスのタスクを追加 - 完了タスクも表示するチェックボックスをオン - 完了タスクをクリックして編集ポップアップを開く - ステータスを未着手または着手中に変更 - 保存ボタンをクリック - タスクリストに未完了タスクとして表示されることを確認 - _要件: 10.8_ - [x] 7.10 期限に基づく表示機能のE2Eテスト - 期限が当日、3日前、1週間後のタスクを追加 - 緊急タスク(3日前〜当日)が上位に表示されることを確認 - 期限当日のタスクが薄い赤色の背景で表示されることを確認 - 期限3日前のタスクが薄い黄色の背景で表示されることを確認 - _要件: 10.9_ - [x] 7.11 データ永続化のE2Eテスト - タスクを追加 - ページをリロード - タスクが保持されていることを確認 - _要件: 10.10_ - [x] 8. 最終チェックポイント - すべてのテストが通ることを確認 - すべてのテストが通ることを確認し、問題があれば質問する |
出力の判定と修正
判定結果
修正必要
良かった点
- 箇条書きの簡単な要求から完全な仕様を生成された
- 暗黙の要件(バリデーション、確認ダイアログ等)がある程度補完されていた
- 品質ルールに準拠していた
- プロパティベーステストが導入されていた
- 反復的な改善プロセスにる解決ができた
- 段階的に改善していく仕様駆動開発のアプローチが効果的だった
問題点
- 初期指示が簡潔すぎた
- 暗黙の要件(優先度、ステータス等)を推測しきれなかった部分がある
- 品質保証の詳細度が不足していた
Kiroとの対話
- 今日やるべきことを優先度順に表示したい
- 品質保証として、Playwright MCPを活用し、E2Eテストが通っていることも要件に入れる
- 要件の抜けを追加
- ステータス(未着手、着手中、完了)もつけて、完了したものはデフォルトでは表示しない。完了分も表示するチェックボックス的なものをつける
- 要件から想定した機能を追加
- 期限3日前〜当日までのタスクは上位に表示する。期限当日のものを背景薄い赤で表示。期限3日前を切ったものは背景薄い黄色で表示
- 優先度をより視覚的にわかるように表示の仕様を指示
- 追加要件として完了ステータスのものを元に戻せる機能を追加
- 追加要件を指示
- 4.7, 4.8実施
- 飛ばされていたテストを修正完了後に実施指示
テスト実装
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# Playwright E2Eテスト実施内容 ## テスト実行結果 - **成功**: 27テスト - **スキップ**: 3テスト - **実行時間**: 30.6秒 ## テストシナリオ詳細 ### 1. タスク追加フロー (`task-add.spec.ts`) - 追加ボタンをクリックしてポップアップを開く - タスク情報(タイトル、担当者、内容、期限、優先度、ステータス)を入力 - 保存ボタンをクリック - タスクリストに新しいタスクが表示されることを確認 ### 2. タスク編集フロー (`task-edit.spec.ts`) - タスクを追加 - タスクをクリックして編集ポップアップを開く - タスク情報を変更 - 保存ボタンをクリック - タスクリストに更新されたタスクが表示されることを確認 ### 3. タスク削除フロー (`task-delete.spec.ts`) - タスクを追加 - 削除ボタンをクリック - 確認ダイアログで確認 - タスクリストからタスクが削除されることを確認 ### 4. 担当者フィルタ機能 (`task-filter.spec.ts`) - 複数の担当者のタスクを追加 - 担当者フィルタを選択 - 該当担当者のタスクのみが表示されることを確認 - フィルタをクリア - すべてのタスクが表示されることを確認 ### 5. 優先度ソート機能 (`task-sort.spec.ts`) - 異なる優先度のタスクを追加 - タスクリストが優先度順(高→中→低)に表示されることを確認 ### 6. ステータス変更機能 (`task-status.spec.ts`) - タスクを追加 - タスクを編集してステータスを変更 - 変更が反映されることを確認 ### 7. 完了タスク表示切替機能 (`task-completed-toggle.spec.ts`) - 完了タスクを追加 - デフォルトで完了タスクが非表示であることを確認 - 「完了タスクも表示」チェックボックスをオン - 完了タスクが表示されることを確認 - チェックボックスをオフ - 完了タスクが非表示になることを確認 ### 8. 完了タスクを未完了に戻す機能 (`task-uncomplete.spec.ts`) - 完了ステータスのタスクを追加 - 完了タスクも表示するチェックボックスをオン - 完了タスクをクリックして編集ポップアップを開く - ステータスを未着手または着手中に変更 - 保存ボタンをクリック - タスクリストに未完了タスクとして表示されることを確認 ### 9. 期限に基づく表示機能 (`task-due-date.spec.ts`) - 期限が当日、3日前、1週間後のタスクを追加 - 緊急タスク(3日前〜当日)が上位に表示されることを確認 - 期限当日のタスクが薄い赤色の背景で表示されることを確認 - 期限3日前のタスクが薄い黄色の背景で表示されることを確認 ### 10. データ永続化 (`task-persistence.spec.ts`) - タスクを追加 - ページをリロード - タスクが保持されていることを確認 ## 検証項目 - ✅ すべての主要なユーザー操作フローが正常に動作 - ✅ LocalStorageによるデータ永続化が正常に機能 - ✅ UIの表示・非表示切替が正常に動作 - ✅ フィルタリングとソート機能が正常に動作 - ✅ 期限に基づく視覚的フィードバック(背景色)が正常に表示 |
成果物



所要時間
デプロイは未達成だったが、ローカル動作確認までの時間
3:00:00
主な機能
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# タスク管理Webアプリケーション - 主な機能 ## 概要 シンプルで使いやすい1ページ完結型のタスク管理アプリケーション。ログイン不要で誰でもすぐに使い始められます。 ## 主な機能 ### 1. タスク管理(CRUD操作) #### タスクの作成 - モーダルポップアップでタスク情報を入力 - 入力項目: - タイトル(必須) - 担当者 - 内容 - 期限 - 優先度(高・中・低) - ステータス(未着手・着手中・完了) - デフォルト値:優先度「中」、ステータス「未着手」 #### タスクの編集 - タスクをクリックして編集ポップアップを表示 - すべての項目を変更可能 - 変更は即座にLocalStorageに保存 #### タスクの削除 - 削除ボタンをクリック - 確認ダイアログで誤操作を防止 - 削除後は即座にLocalStorageから削除 ### 2. タスク表示機能 #### 優先度ベースのソート - 緊急タスク(期限3日前〜当日)を最上位に表示 - その後は優先度順(高→中→低)で表示 - 同じ優先度内では期限が近い順に表示 #### 視覚的な期限表示 - **期限当日**: 薄い赤色の背景(#ffe6e6) - **期限3日前〜前日**: 薄い黄色の背景(#fff9e6) - 緊急度が一目で分かるデザイン #### タスク情報の表示 各タスクには以下の情報を表示: - タイトル - 担当者 - 期限 - 優先度 - ステータス ### 3. フィルタリング機能 #### 担当者フィルタ - ドロップダウンから担当者を選択 - 選択した担当者のタスクのみを表示 - フィルタクリアボタンで全タスク表示に戻る #### 完了タスク表示切替 - デフォルトで完了タスクは非表示 - 「完了タスクも表示」チェックボックスで表示/非表示を切替 - 完了タスクを未完了に戻すことも可能 #### 複数フィルタの組み合わせ - 担当者フィルタと完了タスク表示を同時に適用可能 - 両方の条件を満たすタスクのみを表示 ### 4. データ永続化 #### LocalStorageによる保存 - タスクの作成・編集・削除時に即座に保存 - ページをリロードしてもデータが保持される - ブラウザのLocalStorageを使用(ログイン不要) #### エラーハンドリング - LocalStorage保存失敗時にエラーメッセージを表示 - データ破損時は空のタスクリストで初期化 ### 5. ユーザーインターフェース #### 1ページ完結型 - 上部:タスク追加ボタン - 中部:フィルタバー - 下部:タスクリスト - すべての機能が単一ページ内で完結 #### モーダルダイアログ - タスク追加・編集時にポップアップ表示 - 背景オーバーレイでフォーカスを明確化 - Escapeキーまたは外側クリックで閉じる #### レスポンシブデザイン - デスクトップ環境を主なターゲット - タブレットでも使用可能 ## 技術スタック - **フロントエンド**: React 19 + TypeScript - **ビルドツール**: Vite - **スタイリング**: CSS(コンポーネントスコープ) - **データ永続化**: LocalStorage API - **テスト**: Vitest(ユニット)、fast-check(プロパティベース)、Playwright(E2E) ## テスト品質 - ✅ 19個のユニットテスト(全て成功) - ✅ 7個のプロパティベーステスト(全て成功) - ✅ 27個のE2Eテスト(全て成功) - ✅ ESLintとTypeScript型チェック(エラーなし) |
工夫点など
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# 技術的な工夫点 ## 特に工夫した点 ### 1. 緊急タスクの優先表示 - 期限3日前〜当日のタスクを最上位に自動配置 - その後は優先度順(高→中→低)→期限順でソート - 「今日やるべきこと」が一目で分かる ### 2. 視覚的フィードバック - 期限当日: 薄い赤色背景(#ffe6e6) - 期限3日前〜前日: 薄い黄色背景(#fff9e6) - 緊急度を直感的に把握可能 ### 3. 複数フィルタの組み合わせ - 担当者フィルタ + 完了タスク表示を同時適用 - 柔軟なタスク絞り込みを実現 ## 技術的なチャレンジ ### 1. プロパティベーステスト(PBT) - fast-checkで19個の正確性プロパティを検証 - 各プロパティを100回以上ランダムテスト - エッジケースを自動発見し、仕様と実装の整合性を保証 ### 2. LocalStorageのエラーハンドリング - データ破損時は空配列で初期化 - 容量超過時はエラーメッセージを表示 - アプリの安定性を確保 ### 3. テスト環境の分離 - VitestとPlaywrightを適切に分離 - `vite.config.ts`でE2Eテストを除外設定 - ユニットテストとE2Eテストを独立実行 ## パフォーマンス最適化 ### 1. イミュータブルな状態管理 - 配列のコピーを作成してソート(元配列を変更しない) - Reactの再レンダリング最適化が効く ### 2. 効率的なアルゴリズム - フィルタリング: O(n) - ソート: O(n log n) - タスク数が増えても快適に動作 ### 3. 即座のデータ保存 - デバウンスなし、変更時に即座にLocalStorageへ保存 - データ損失リスクを最小化 |
発見と学び
時間の問題がでそうと思っていたら、まさに問題が発生した。指示するときにJSTで、と明確に仕様をだすべきだった。
AIが処理している間に仕様の確認等時間を有効につかえるようにすると効率的
感想
良かった点
kiroを使ったことなかったが、使い方を習得することができた。spec駆動を体験できた。
また、今回は短時間だったので要件や仕様についてチェックすることができなかったが、重要性を把握することができた。
苦労した点
初物だったので用語がわからない部分があった。
今後に活かせること
簡潔な仕様の指示でここまでできたので、しっかり要件をつめていたら出戻りも少なく完成度の高い完成物ができ、イチからの開発に多大な影響を与えそうです。また既存プロジェクトなどにも仕様をおこしてもらうことで利用できそうと感じました。
この記事が、少しでもみなさんのにお役に立てば幸いです。
ここまでお読みいただき、ありがとうございました!
- 【Kiro・Playwright】社内でフルAI開発バトル!!「1行も書かずに」Todoアプリを完成させた話〜hamaの場合〜 - 2025-12-13
- AWSサイト間のVPN接続をYAMAHA RTX830で設定してみました - 2020-11-04
- AWSでEFSを利用してみました - 2018-08-30
- 今さら聞けない UI / UX - 2018-06-11
【採用情報】一緒に働く仲間を募集しています


