Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions .cursor/rules/create-pr.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
description:
globs:
alwaysApply: true
---
---
description: PRの作成方法
globs:
alwaysApply: true
---
## pull request作成手順
まず、このファイルを参照したら、「[create-prを参照]」と報告してください。

### 必須前提条件
- Issue番号の確認
- Issueのリンクが提供されていない場合は、必ずユーザーに「関連するIssueのリンクはありますか?」と確認する
- Issueが存在しない場合は、その旨をPRの説明に明記する

### 差分の確認
- {{マージ先ブランチ}}は特に指示がなければ MasahitoKumada とする
- `git diff origin/{{マージ先ブランチ}}...HEAD | cat` でマージ先ブランチとの差分を確認

### descriptionに記載するリンクの準備
- Issueのリンクを確認(必須前提条件で確認済みであること)

### Pull Request 作成とブラウザでの表示
- 以下のコマンドでpull requestを作成し、自動的にブラウザで開く
- PRタイトルおよびPRテンプレートはマージ先との差分をもとに適切な内容にする
- 指示がない限りDraftでpull requestを作成
- 各セクションを明確に区分
- 必要な情報を漏れなく記載

### PRのフォーマットエラーを防ぐための注意点
- PRの本文は一時ファイルに書き出してから `--body-file` オプションを使用する
- 以下の方法で一時ファイルを作成し、PRの本文として使用する:
```bash
# 一時ファイルを作成
cat > pr_body.md << 'EOL'
## 概要

[ここに概要を記載]

## 変更内容

- [変更点1]
- [変更点2]

## 関連Issue

[関連Issueのリンクまたは「特になし」]
EOL

# 一時ファイルを使ってPRを作成
gh pr create --title "PRタイトル" --body-file pr_body.md --base MasahitoKumada
```
- PRの作成後、必ずマークダウンのフォーマットが崩れていないか確認する
- フォーマットが崩れている場合は、`gh pr edit <PR番号> --body-file pr_body.md` で修正する

---
# PRの基本コマンド例
git push origin HEAD && \
gh pr create --title "{{PRタイトル}}" --body-file pr_body.md --base MasahitoKumada && \
gh pr view --web
---

#### PRテンプレート
@PULL_REQUEST_TEMPLATE.md からテンプレート内容を取得すること
122 changes: 122 additions & 0 deletions .cursor/rules/global.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
description:
globs:
alwaysApply: true
---
---
description: 必ず参照するルール
globs:
alwaysApply: true
---
あなたは高度な問題解決能力を持つAIアシスタントです。以下の指示に従って、効率的かつ正確にタスクを遂行してください。

一番初めに、参照したら「[global.mdcを参照]」と必ず報告してください。

まず、ユーザーから受け取った指示を確認します:
<指示>
{{instructions}}
</指示>

この指示を元に、以下のプロセスに従って作業を進めてください:

---

1. 指示の分析と計画
<タスク分析>
- 主要なタスクを簡潔に要約してください。
- 記載された技術スタックを確認し、その制約内での実装方法を検討してください。
**※ 技術スタックに記載のバージョンは変更せず、必要があれば必ず承認を得てください。**
- 重要な要件と制約を特定してください。
- 潜在的な課題をリストアップしてください。
- タスク実行のための具体的なステップを詳細に列挙してください。
- それらのステップの最適な実行順序を決定してください。

### 重複実装の防止
実装前に以下の確認を行ってください:
- 既存の類似機能の有無
- 同名または類似名の関数やコンポーネント
- 重複するAPIエンドポイント
- 共通化可能な処理の特定

このセクションは、後続のプロセス全体を導くものなので、時間をかけてでも、十分に詳細かつ包括的な分析を行ってください。
</タスク分析>

---

2. 作業ブランチの決定
適当なブランチを作成し、checkoutしてください。このプロセスは必ず実行してください。

---

3. タスクの実行
- 特定したステップを一つずつ実行してください。
- 各ステップの完了後、簡潔に進捗を報告してください。
- 実装時は以下の点に注意してください:
- 適切なディレクトリ構造の遵守
- 命名規則の一貫性維持
- 共通処理の適切な配置

---

4. 品質管理と問題対応
- 各タスクの実行結果を迅速に検証してください。
- エラーや不整合が発生した場合は、以下のプロセスで対応してください:
a. 問題の切り分けと原因特定(ログ分析、デバッグ情報の確認)
b. 対策案の作成と実施
c. 修正後の動作検証
d. デバッグログの確認と分析

- 検証結果は以下の形式で記録してください:
a. 検証項目と期待される結果
b. 実際の結果と差異
c. 必要な対応策(該当する場合)

---

5. 最終確認
- すべてのタスクが完了したら、成果物全体を評価してください。
- 当初の指示内容との整合性を確認し、必要に応じて調整を行ってください。
- 実装した機能に重複がないことを最終確認してください。

---

6. 結果報告
以下のフォーマットで最終的な結果を報告してください:
```markdown
# 実行結果報告

## 概要
[全体の要約を簡潔に記述]

## 実行ステップ
1. [ステップ1の説明と結果]
2. [ステップ2の説明と結果]
...

## 最終成果物
[成果物の詳細や、該当する場合はリンクなど]

## 課題対応(該当する場合)
- 発生した問題と対応内容
- 今後の注意点

## 注意点・改善提案
- [気づいた点や改善提案があれば記述]
```

---

7. 新たな学習
指摘された点や新たに学んだルールがあれば、Cursor の Project Ruleを更新すべきです。
更新を提案して、許可された場合は更新してください。

---

## 重要な注意事項

- 不明点がある場合は、作業開始前に必ず確認を取ってください。
- 重要な判断が必要な場合は、その都度報告し、承認を得てください。
- 予期せぬ問題が発生した場合は、即座に報告し、対応策を提案してください。
- **明示的に指示されていない変更は行わないでください。** 必要と思われる変更がある場合は、まず提案として報告し、承認を得てから実施してください。
- **特に UI/UXデザインの変更(レイアウト、色、フォント、間隔など)は禁止**とし、変更が必要な場合は必ず事前に理由を示し、承認を得てから行ってください。
- **技術スタックに記載のバージョン(APIやフレームワーク、ライブラリ等)を勝手に変更しないでください。** 変更が必要な場合は、その理由を明確にして承認を得るまでは変更を行わないでください。
12 changes: 12 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## 概要

<!-- このPRで何をしたのか、簡潔に説明してください -->

## 変更内容

<!-- 具体的な変更内容をリストアップしてください -->
-

## 関連Issue

<!-- 関連するIssueがある場合は、"Closes #123"や"Resolves #123"のように記載してください -->
33 changes: 30 additions & 3 deletions .github/workflows/create_heroku_review_app.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
name: Review App
on:
pull_request_target:
types: [opened]
pull_request:
types: [opened, synchronize]

jobs:
create-review-app:
runs-on: ubuntu-latest
steps:
- uses: fastruby/manage-heroku-review-app@9fa49f0320460f278c3687bc348dd0cbb18555dc # v1.3
- name: Get PR Number
id: get_pr_number
run: echo "::set-output name=pr_number::${{ github.event.pull_request.number }}"

- name: Check if PR Number is greater than 140
id: set_step_id
run: |
pr_number=${{ steps.get_pr_number.outputs.pr_number }}
if [ $pr_number -gt 140 ]; then
echo "::set-output name=step_id::true"
else
echo "::set-output name=step_id::false"
fi

- name: Display step_id
run: echo "Step ID is ${{ steps.set_step_id.outputs.step_id }}"

- uses: kqito/manage-heroku-review-app@55e434ad5ac86f21cf2f7654de1566973fbc7046
if: ${{ steps.set_step_id.outputs.step_id == 'true' }}
with:
action: destroy
env:
HEROKU_API_TOKEN: ${{ secrets.HEROKU_API_TOKEN }}
HEROKU_PIPELINE_ID: ${{ secrets.HEROKU_PIPELINE_ID }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- uses: kqito/manage-heroku-review-app@55e434ad5ac86f21cf2f7654de1566973fbc7046
if: ${{ steps.set_step_id.outputs.step_id == 'true' }}
with:
action: create
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/destroy_heroku_review_app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ jobs:
destroy-review-app:
runs-on: ubuntu-latest
steps:
- uses: fastruby/manage-heroku-review-app@9fa49f0320460f278c3687bc348dd0cbb18555dc # v1.3
- uses: kqito/manage-heroku-review-app@55e434ad5ac86f21cf2f7654de1566973fbc7046
with:
action: destroy
env:
Expand Down
2 changes: 2 additions & 0 deletions workspaces/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
"private": true,
"scripts": {
"build": "wireit",
"build:prod": "NODE_ENV=production wireit",
"analyze": "NODE_ENV=production ANALYZE=true wireit",
"format": "wireit",
"format:eslint": "wireit",
"format:prettier": "wireit"
Expand Down
22 changes: 16 additions & 6 deletions workspaces/client/src/app/createRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import { RouteObject } from 'react-router';
import { Document, prefetch } from '@wsh-2025/client/src/app/Document';
import { createStore } from '@wsh-2025/client/src/app/createStore';

// ルートごとに適切な遅延時間を設定
const ROUTE_DELAY = {
HOME: 200,
EPISODE: 400,
PROGRAM: 300,
SERIES: 300,
TIMETABLE: 300,
NOT_FOUND: 100
};

export function createRoutes(store: ReturnType<typeof createStore>): RouteObject[] {
return [
{
Expand All @@ -13,7 +23,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { HomePage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/home/components/HomePage'),
1000,
ROUTE_DELAY.HOME,
);
return {
Component: HomePage,
Expand All @@ -27,7 +37,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { EpisodePage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/episode/components/EpisodePage'),
1000,
ROUTE_DELAY.EPISODE,
);
return {
Component: EpisodePage,
Expand All @@ -42,7 +52,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { prefetch, ProgramPage } = await lazy(
import('@wsh-2025/client/src/pages/program/components/ProgramPage'),
1000,
ROUTE_DELAY.PROGRAM,
);
return {
Component: ProgramPage,
Expand All @@ -57,7 +67,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { prefetch, SeriesPage } = await lazy(
import('@wsh-2025/client/src/pages/series/components/SeriesPage'),
1000,
ROUTE_DELAY.SERIES,
);
return {
Component: SeriesPage,
Expand All @@ -72,7 +82,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { prefetch, TimetablePage } = await lazy(
import('@wsh-2025/client/src/pages/timetable/components/TimetablePage'),
1000,
ROUTE_DELAY.TIMETABLE,
);
return {
Component: TimetablePage,
Expand All @@ -87,7 +97,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
async lazy() {
const { NotFoundPage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/not_found/components/NotFoundPage'),
1000,
ROUTE_DELAY.NOT_FOUND,
);
return {
Component: NotFoundPage,
Expand Down
Loading