Skip to content

[] Add loading.tsx, error.tsx, and not-found.tsx states to all major app route segments#193

Merged
zoetaka38 merged 4 commits into
mainfrom
feature/019f0d38dc7f-019f0d38dc7f
Jun 29, 2026
Merged

[] Add loading.tsx, error.tsx, and not-found.tsx states to all major app route segments#193
zoetaka38 merged 4 commits into
mainfrom
feature/019f0d38dc7f-019f0d38dc7f

Conversation

@red-codens

@red-codens red-codens Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Summary

Type of Change

  • feat — new feature
  • fix — bug fix
  • chore — tooling / maintenance
  • docs — documentation only
  • refactor — code change that neither fixes a bug nor adds a feature
  • test — adding or updating tests
  • ci — CI/CD configuration

Testing

Checklist

  • Tests pass locally
  • Lint clean (task lint)
  • Commit messages follow Conventional Commits

Task Goal

Target Repository

Corevice/open-git
All work for this task belongs in this repository. Do the implementation inside this repository's directory in the workspace; do not search or edit other repositories unless this task explicitly requires a cross-repo change.

Context

The PRD requires every list page to handle four states: loading (Skeleton), error (retry-able boundary), empty (EmptyState CTA), and normal. Next.js App Router handles loading/error/not-found via co-located convention files. Currently none of these files exist in app/(app)/. This task adds them using the Skeleton and components created in task 0.

Steps

  1. Create open-git/app/(app)/[owner]/[repo]/loading.tsx — renders a repo-page skeleton: two SkeletonBlock rows for the file tree and a wider block for README area
  2. Create open-git/app/(app)/[owner]/[repo]/error.tsx"use client"; accepts { error, reset } props from Next.js; renders an Alert variant="destructive" with error message and a "Retry" button that calls reset()
  3. Create open-git/app/(app)/[owner]/[repo]/not-found.tsx — renders a centered message "Repository not found" with a link back to /dashboard
  4. Create open-git/app/(app)/[owner]/[repo]/issues/loading.tsx — issue list skeleton: renders 5 SkeletonBlock rows mimicking issue rows
  5. Create open-git/app/(app)/[owner]/[repo]/issues/error.tsx — same pattern as repo-level error.tsx
  6. Create open-git/app/(app)/[owner]/[repo]/pulls/loading.tsx and open-git/app/(app)/[owner]/[repo]/pulls/error.tsx — PR list variants
  7. Create open-git/app/(app)/[owner]/[repo]/actions/loading.tsx and open-git/app/(app)/[owner]/[repo]/actions/error.tsx — Actions list variants
  8. Create open-git/app/(app)/[owner]/[repo]/commits/loading.tsx — commits list skeleton
  9. Add open-git/__tests__/app/error-boundary.test.tsx — render the repo-level error.tsx with a mock error and mock reset; assert error message shown; click "Retry"; assert reset called once

Ver

Changes Made

I'll
locate
existing Skeleton
and Alert components and
any
similar loading
/error patterns so
the new files match
the
project
.

Creating
the
loading,
error, not
-found, and test
files using
existing
UI
components
.

Added
Next
.js App Router convention
files under
app/(app )/[owner]/ [repo]/
for loading, error
, and not
-found states.

**
Repo page
**

  • loading.tsx — two
    SkeletonBlock
    rows (
    file tree) plus
    a wider README block

  • error.tsx
    client component
    with destructive Alert ,
    error message, and
    Retry button
    calling reset()

  • not-found .tsx — centered
    "Repository not found
    " with link to
    /dashboard

**
Sub
-routes**
(issues, pulls
, actions,
commits)

  • List
    skeletons use
    5 Skeleton Block rows (
    commits
    use
    slightly shorter rows)

  • error .tsx files share
    the same structure as
    the repo-level error
    boundary

**
Test**

  • __tests__/app /error-boundary.test .tsx
    verifies
    error message display
    and that Retry
    calls reset()
    once

All loading
files
import SkeletonBlock from @/ components/ui/skeleton (from task
0).

[P
URPLE-M
ODIFIED-FILES
]
open
-git/app/(app
)/[owner]/
[repo]/loading
.tsx
open
-git/app/(app
)/[owner]/
[repo]/error
.tsx
open
-git/app/(app
)/[owner]/
[repo]/not
-found.tsx
open
-git/app/(app
)/[owner]/
[repo]/issues
/loading.tsx

open-git/app/(
app)/[owner
]/[repo]/
issues/error.tsx

open-git/app/(
app)/[owner
]/[repo]/
pulls/loading
.tsx
open-git
/app/(app)/
[owner]/[
repo]/pulls
/error.tsx
open
-git/app/(app
)/[owner]/
[repo]/actions
/loading.tsx

open-git/app/(
app)/[owner
]/[repo]/
actions/error.tsx

open-git/app/(
app)/[owner
]/[repo]/
commits/loading.tsx

open-git/__
tests__/app/error
-boundary.test.tsx

[/PUR
PLE-MOD
IFIED-FILES]

Task ID: 019f0d38-dc7f-78de-b6c8-42389d2e67a5
Generated by Purple Codens

@orange-codens orange-codens Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🍊 Orange Codens レビュー

PR 全体としては Next.js App Router の規約に沿った実装で方向性は正しいです。最大の問題は error.tsx 4ファイル・loading.tsx 3ファイルが完全に重複していることで、将来の修正コストが高くなります(medium 2件)。また、テスト内で Error コンポーネント名とグローバル Error コンストラクタがシャドウイングしている問題(low)は可読性・保守性に影響します。ブロッカー・クリティカルな問題は見当たりませんが、共通コンポーネントへの切り出しを強く推奨します。

🔒 セキュリティ: 今回の PR で追加されたセキュリティ上の主な懸念は、全 error.tsx ファイルで error.message をそのままクライアント UI に表示している点です(CWE-209)。サーバー側の内部エラー詳細(DBエラー文字列・ファイルパス等)がエンドユーザーに漏洩するリスクがあります。本番環境では汎用メッセージを表示し、詳細はサーバーサイドのログに留めるよう修正してください。認可ロジック・injection・SSRF など他の重大脆弱性はこの diff には見られません。

🟡 medium: 6 / 🔵 low: 4

その他の指摘 (10 件)
  • 🟡 [medium] app/(app)/[owner]/[repo]/issues/error.tsx:1 — error.tsx が4ファイル完全に同一内容で重複している (confidence: 0.95, maintainability.duplication.identical_files)
  • 🟡 [medium] app/(app)/[owner]/[repo]/pulls/loading.tsx:1 — issues/loading.tsx・pulls/loading.tsx・actions/loading.tsx が完全に同一内容 (confidence: 0.95, maintainability.duplication.identical_files)
  • 🟡 [medium] app/(app)/[owner]/[repo]/error.tsx:16 — サーバー側エラーメッセージがそのまま UI に出力される (情報漏洩 / XSS リスク) (confidence: 0.72, sec.sast.xss.error_message_reflection)
  • 🟡 [medium] app/(app)/[owner]/[repo]/issues/error.tsx:16 — サーバー側エラーメッセージがそのまま UI に出力される (情報漏洩) (confidence: 0.72, sec.sast.xss.error_message_reflection)
  • 🟡 [medium] app/(app)/[owner]/[repo]/pulls/error.tsx:16 — サーバー側エラーメッセージがそのまま UI に出力される (情報漏洩) (confidence: 0.72, sec.sast.xss.error_message_reflection)
  • 🟡 [medium] app/(app)/[owner]/[repo]/actions/error.tsx:16 — サーバー側エラーメッセージがそのまま UI に出力される (情報漏洩) (confidence: 0.72, sec.sast.xss.error_message_reflection)
  • 🔵 [low] __tests__/app/error-boundary.test.tsx:10 — テスト内で error 変数名が Error コンストラクタとシャドウイングしている (confidence: 0.90, code.test.variable_name_shadow)
  • 🔵 [low] __tests__/app/error-boundary.test.tsx:1 — テストが repo-level の error.tsx のみカバーし、他の error.tsx をカバーしていない (confidence: 0.80, maintainability.test.coverage_gap)
  • 🔵 [low] app/(app)/[owner]/[repo]/not-found.tsx:5 — not-found.tsx でページレベルの見出し階層が h2 から始まっている (confidence: 0.75, code.a11y.missing_role)
  • 🔵 [low] app/(app)/[owner]/[repo]/not-found.tsx:7 — ハードコードされたリダイレクト先は問題なし — open redirect なし (info) (confidence: 0.30, sec.sast.redirect.open_redirect)

head: ff3b31f | Orange Codens (P1)

@orange-codens orange-codens Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🍊 Orange Codens レビュー

PR 全体として Next.js App Router の loading/error/not-found 規約に沿った実装になっており、動作上の重大な問題はありません。ただし error.tsx 4ファイルと loading.tsx 3ファイルがバイト単位で完全に同一の重複コードである点が最も目立つ問題です(共通コンポーネントへの抽出を推奨)。加えて、テスト内で import Error がグローバル Error コンストラクタをシャドウしている可読性の問題、error.message が空の場合のフォールバック未設定、および本 PR のスコープ外である Go バージョン変更(1.25 は未リリース)の確認が必要です。

🔒 セキュリティ: このPRはUI/UXのためのスケルトン・エラー境界ファイルを追加するものであり、認可ロジックや注入ポイントは含まれていません。主なセキュリティリスクは、全 error.tsx ファイルが error.message を未フィルタリングのままユーザー画面に表示している点(CWE-209)で、本番環境でサーバー内部情報がブラウザに漏洩する可能性があります。同一パターンが4ファイルに重複しているため、共通コンポーネント化と合わせてメッセージ表示の条件分岐を一箇所で対処することを推奨します。

🟡 medium: 6 / 🔵 low: 3

その他の指摘 (9 件)
  • 🟡 [medium] app/(app)/[owner]/[repo]/issues/loading.tsx:1 — issues/pulls/actions の loading.tsx が完全に同一 — 共通化を推奨 (confidence: 0.95, maintainability.duplication.identical_files)
  • 🟡 [medium] app/(app)/[owner]/[repo]/error.tsx:16error.message が空の場合に空白の AlertDescription が表示される (confidence: 0.82, code.error_handling.error_message_empty)
  • 🟡 [medium] app/(app)/[owner]/[repo]/error.tsx:17 — サーバー由来の生エラーメッセージを無検証でUIに表示している (confidence: 0.72, sec.sast.xss.error_message_reflected)
  • 🟡 [medium] app/(app)/[owner]/[repo]/issues/error.tsx:17 — サーバー由来の生エラーメッセージを無検証でUIに表示している (issues) (confidence: 0.72, sec.sast.xss.error_message_reflected)
  • 🟡 [medium] app/(app)/[owner]/[repo]/pulls/error.tsx:17 — サーバー由来の生エラーメッセージを無検証でUIに表示している (pulls) (confidence: 0.72, sec.sast.xss.error_message_reflected)
  • 🟡 [medium] app/(app)/[owner]/[repo]/actions/error.tsx:17 — サーバー由来の生エラーメッセージを無検証でUIに表示している (actions) (confidence: 0.72, sec.sast.xss.error_message_reflected)
  • 🔵 [low] __tests__/app/error-boundary.test.tsx:10 — テスト内でグローバル Errorconst error = new Error(...) で隠蔽している (confidence: 0.88, code.naming.variable_shadows_builtin)
  • 🔵 [low] .github/workflows/ci.yml:29 — Go バージョンを 1.241.25 へ更新しているが、Go 1.25 は未リリース (confidence: 0.75, maintainability.ci.unverified_go_version)
  • 🔵 [low] __tests__/app/error-boundary.test.tsx:8 — テストが repo-level error.tsx のみを対象としており、他のルートの error.tsx はカバーされていない (confidence: 0.72, maintainability.test.missing_error_variants)

前回 run からの未解決 finding: 1 件

head: 1e9a4d8 | Orange Codens (P1)

# Conflicts:
#	app/(app)/[owner]/[repo]/error.tsx
#	app/(app)/[owner]/[repo]/loading.tsx
#	app/(app)/[owner]/[repo]/not-found.tsx
…icates (take main's) and broken duplicate-coupled error-boundary test

@orange-codens orange-codens Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🍊 Orange Codens レビュー

提示 diff 内では issues/pulls/actions の loading/error 追加は Next.js convention に沿っており、致命的なロジックバグは見当たりません。一方で commits のみ error boundary が欠けて sibling route と PRD 要件の両面で不整合です。また error/loading 実装が segment 間で完全重複しており、今後の保守コストが高くなります。なお PR 説明にある repo 直下の convention ファイルやテストは本 diff に含まれていないため、このレビュー範囲外です。

🔒 セキュリティ: 本 diff は loading スケルトンと error boundary の UI 追加が中心で、認可・注入・SSRF・暗号誤用などの重大な論理脆弱性は見当たりません。一方、複数の error.tsxerror.message をそのまま表示しており(CWE-209)、上流の例外内容次第では内部情報がクライアントに漏れる可能性があります。loading.tsx は静的スケルトン表示のみでセキュリティ上の懸念はありません。

🟡 medium: 2 / 🔵 low: 4

その他の指摘 (6 件)
  • 🟡 [medium] app/(app)/[owner]/[repo]/issues/error.tsx:1 — error.tsx が issues/pulls/actions で完全重複 (confidence: 0.92, maintainability.duplication.identical_error_boundary)
  • 🟡 [medium] app/(app)/[owner]/[repo]/commits/loading.tsx:1 — commits セグメントに error.tsx が追加されていない (confidence: 0.88, maintainability.coverage.missing_error_boundary)
  • 🔵 [low] app/(app)/[owner]/[repo]/issues/loading.tsx:1 — list loading skeleton が issues/pulls/actions で同一 (confidence: 0.90, maintainability.duplication.identical_loading_skeleton)
  • 🔵 [low] app/(app)/[owner]/[repo]/actions/error.tsx:16 — エラーメッセージの直接表示による情報漏洩リスク (confidence: 0.72, sec.sast.info_disclosure.error_message)
  • 🔵 [low] app/(app)/[owner]/[repo]/issues/error.tsx:16 — エラーメッセージの直接表示による情報漏洩リスク (confidence: 0.72, sec.sast.info_disclosure.error_message)
  • 🔵 [low] app/(app)/[owner]/[repo]/pulls/error.tsx:16 — エラーメッセージの直接表示による情報漏洩リスク (confidence: 0.72, sec.sast.info_disclosure.error_message)

head: 80fdd03 | Orange Codens (P1)

@zoetaka38
zoetaka38 merged commit 4089799 into main Jun 29, 2026
11 of 13 checks passed
@zoetaka38
zoetaka38 deleted the feature/019f0d38dc7f-019f0d38dc7f branch July 2, 2026 10:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant