Skip to content

プラクティスの難易度をアイコンで表示する#9918

Merged
komagata merged 5 commits into
mainfrom
feature/practice-difficulty-icon
Jul 13, 2026
Merged

プラクティスの難易度をアイコンで表示する#9918
komagata merged 5 commits into
mainfrom
feature/practice-difficulty-icon

Conversation

@karlley

@karlley karlley commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Issue

概要

プラクティスの難易度をアイコンで表示する

  • 全ユーザに対して難易度を表示する
  • 管理者、メンターのみ難易度 + 学習時間の統計情報を表示する
  • 難易度のアイコン数はプラクティスの学習時間を元に以下のように表示する
    • 0時間: データ収集中
    • 1-5時間: 🔥
    • 6-10時間: 🔥🔥
    • 11-15時間: 🔥🔥🔥
    • 16-20時間: 🔥🔥🔥🔥
    • 21時間以上: 🔥🔥🔥🔥🔥

0時間時のアイコン表示は「🔥」から「データ収集中」に仕様変更になった
#9918 (comment)

変更確認方法

事前準備

  1. feature/practice-difficulty-icon ブランチをローカルに取り込む
  2. bundle exec rake bootcamp:statistics:save_learning_minute_statistics を実行(難易度/学習時間の統計情報表示用のデータを用意)

管理者、メンター以外

  1. kimura でログイン
  2. プラクティス一覧(/courses/:id/practices)にアクセス
  3. OS X Mountain Lionをクリーンインストールする のプラクティスで以下を確認
    • 「難易度: 🔥」の表示

管理者

  1. komagata でログイン
  2. プラクティス一覧(/courses/:id/practices)にアクセス
  3. OS X Mountain Lionをクリーンインストールする のプラクティスで以下を確認
    • 「難易度: 🔥」の表示
    • 「所要時間の目安:◯時間(平均:◯時間ま◯分」の表示

メンター

  1. mentormentaro でログイン
  2. プラクティス一覧(/courses/:id/practices)にアクセス
  3. OS X Mountain Lionをクリーンインストールする のプラクティスで以下を確認
    • 「難易度: 🔥」の表示
    • 「所要時間の目安:◯時間(平均:◯時間ま◯分」の表示

Screenshot

変更前

管理者、メンター以外

before_other

管理者

before_admin

メンター

before_mentor

変更後

管理者、メンター以外

after_other

管理者

after_admin

メンター

after_mentor

Summary by CodeRabbit

  • 新機能
    • 学習時間の統計に基づく難易度表示を追加しました。
    • 学生には難易度アイコンを表示します。
    • メンターには中央値と平均の学習時間(時間/分表記)を表示します。
    • 学習時間データがない場合は該当表示を抑制します。

Flakewatch Report

Flakewatch Report

Review App

@coderabbitai

coderabbitai Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

コース演習テンプレートが学習統計を条件付きで表示するように変更され、ユーザーロール(studentか否か)で表示内容を分岐。学習時間を絵文字で表す difficulty_icon(minutes) ヘルパーを追加。

Changes

コホート / ファイル(s) 変更内容
テンプレート変更
app/views/courses/practices/_courses_practice.html.slim
practice.learning_minute_statistic をローカル変数 learning_statistic に割当て。統計が存在する場合のみ描画し、current_user.student? によって学生は難易度アイコン表示、非学生は中央値/平均の時間表示に分岐。
ヘルパーメソッド追加
app/helpers/practices_helper.rb
difficulty_icon(minutes) を追加。nilチェック後、分数の範囲に応じて段階的な絵文字列(炎の長さなど)を返すマッピングを実装。

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested reviewers

  • okuramasafumi
  • y-kawahara-gs

Poem

🐰 新しい表示でぴょんと跳ねる
統計は整い、難易度は光る
学生には印、先生には時を示す
ちいさな炎が進みを告げる
さあ演習へ、耳を澄ませて

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 難易度をアイコンで表示する変更内容を端的に表しており、追加されたヘルパーと表示切り替えに一致しています。
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/practice-difficulty-icon

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
app/helpers/reports_helper.rb (1)

37-49: 表示責務はDecoratorへ寄せることを検討してください

Line 37-49 の難易度表示ロジックは Practice の表示責務に近いため、PracticeDecorator へ移すとHelperの肥大化を抑えつつ再利用しやすくなります。

As per coding guidelines ViewHelperにメソッドを実装する時にはまずDecoratorパターンを使うことを検討する。(active_decorator gemを導入しているのでそれを使う)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/helpers/reports_helper.rb` around lines 37 - 49, The difficulty_icon
helper contains view/display logic tied to a Practice instance (it reads
practice.learning_minute_statistic and computes median-based emoji output); move
this logic into a PracticeDecorator (e.g., add an instance method like
difficulty_icon or difficulty_emojis on PracticeDecorator that reads
learning_minute_statistic, handles nil, computes median_hours and returns the
same emoji strings), then change the helper method difficulty_icon to delegate
to practice.decorate.difficulty_icon (or simply remove the helper and call
practice.decorate.difficulty_icon from views) so the view helper stays thin and
display responsibility lives in the decorator.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/views/courses/practices/_courses_practice.html.slim`:
- Around line 22-31: The template renders the learning-time container
unconditionally which leaves an empty element when
practice.learning_minute_statistic is nil; update the conditional so the
surrounding container is only rendered when practice.learning_minute_statistic
is present: for the student branch check practice.learning_minute_statistic
before rendering .category-practices-item__learning-time and show
difficulty_icon(practice) inside it, and for the mentor branch wrap
.category-practices-item__learning-time.is-only-mentor with a presence check and
then assign learning_minute_statistic = practice.learning_minute_statistic and
call convert_to_hour_minute(learning_minute_statistic.median/average) inside
that block.

---

Nitpick comments:
In `@app/helpers/reports_helper.rb`:
- Around line 37-49: The difficulty_icon helper contains view/display logic tied
to a Practice instance (it reads practice.learning_minute_statistic and computes
median-based emoji output); move this logic into a PracticeDecorator (e.g., add
an instance method like difficulty_icon or difficulty_emojis on
PracticeDecorator that reads learning_minute_statistic, handles nil, computes
median_hours and returns the same emoji strings), then change the helper method
difficulty_icon to delegate to practice.decorate.difficulty_icon (or simply
remove the helper and call practice.decorate.difficulty_icon from views) so the
view helper stays thin and display responsibility lives in the decorator.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ef3c0aa3-a16e-4840-90b5-be33d4d8c09b

📥 Commits

Reviewing files that changed from the base of the PR and between d4f1b0b and f736b0a.

📒 Files selected for processing (2)
  • app/helpers/reports_helper.rb
  • app/views/courses/practices/_courses_practice.html.slim

Comment thread app/views/courses/practices/_courses_practice.html.slim Outdated
@github-actions

github-actions Bot commented Apr 15, 2026

Copy link
Copy Markdown

🚀 Review App

URL: https://bootcamp-pr-9918-fvlfu45apq-an.a.run.app

Basic認証: fjord / (ステージングと同じ)
PR更新時に自動で再デプロイされます。

@karlley karlley force-pushed the feature/practice-difficulty-icon branch 2 times, most recently from 953c7c4 to 1af571d Compare April 16, 2026 20:22
@karlley karlley force-pushed the feature/practice-difficulty-icon branch from 1af571d to e5e274e Compare April 23, 2026 20:21

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
app/helpers/reports_helper.rb (3)

37-48: Decoratorパターンの検討

コーディングガイドラインでは「ViewHelperにメソッドを実装する時にはまずDecoratorパターンを使うことを検討する(active_decorator gem)」とされています。このdifficulty_iconLearningMinuteStatistic#median(あるいはPracticeのプラクティス難易度)に紐づく表示ロジックなので、LearningMinuteStatisticDecorator#difficulty_iconとして実装する方がオブジェクト指向的に整理され、ビュー側もlearning_stat.difficulty_iconで呼び出せて読みやすくなります。

As per coding guidelines: 「ViewHelperにメソッドを実装する時にはまずDecoratorパターンを使うことを検討する。(active_decorator gemを導入しているのでそれを使う)」

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/helpers/reports_helper.rb` around lines 37 - 48, The difficulty_icon
method in reports_helper.rb should be moved into a decorator: implement
LearningMinuteStatisticDecorator#difficulty_icon (and similarly for Practice if
needed) so the presentation logic is tied to the model; remove difficulty_icon
from the helper and update views to call learning_stat.difficulty_icon (or
practice.difficulty_icon). Keep the same behavior (handle nil minutes, compute
hours from minutes and map ranges to 1–5 fire icons) and ensure the decorator is
picked up by active_decorator (class name LearningMinuteStatisticDecorator,
method difficulty_icon) so existing view calls use the new decorator method.

37-48: 難易度計算ロジックの簡素化とアクセシビリティの考慮

ロジック自体は動作しますが、以下の点を検討してください。

  1. 5時間刻みで段階が増える規則的な構造なので、caseで5分岐を列挙するより算術で表現した方が簡潔です(将来的に段階数が変わっても保守しやすい)。
  2. 炎絵文字のみを返す実装は、スクリーンリーダー利用者に「難易度」という意味が伝わりません。ビュー側でaria-label等を付与していない場合、ヘルパー側で<span aria-label="難易度: 中">🔥🔥</span>のようなマークアップを返すか、呼び出し側で補助テキストを併記することを推奨します。
  3. minutesが負値の場合、現状は最大難易度(🔥×5)に分類されます。想定外入力に対する扱いを明確化しておくと安全です。
♻️ 算術による簡素化の例
   def difficulty_icon(minutes)
     return '' if minutes.nil?
 
-    hours = (minutes / 60).floor
-    case hours
-    when 0..5 then '🔥'
-    when 6..10 then '🔥🔥'
-    when 11..15 then '🔥🔥🔥'
-    when 16..20 then '🔥🔥🔥🔥'
-    else '🔥🔥🔥🔥🔥'
-    end
+    hours = (minutes / 60).floor
+    level = [hours / 5 + 1, 5].min
+    level = 1 if level < 1
+    '🔥' * level
   end
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/helpers/reports_helper.rb` around lines 37 - 48, Refactor difficulty_icon
to compute level arithmetically (e.g., clamp ((minutes / 60).floor / 5).ceil or
integer division) instead of the explicit case branches so it's easy to change
step size/levels; ensure negative or nil minutes are handled explicitly (return
'' for nil and clamp negatives to 0 or treat as invalid) and map level to
repeated '🔥' up to max 5; return accessible markup (e.g., wrap the emoji string
in a span with an appropriate aria-label like "難易度: #{label_for_level(level)}")
so screen readers get semantic information; keep the helper name difficulty_icon
and create or use a small helper to produce the human-readable label for
aria-label.

40-40: .floorは冗長です

minutesIntegerLearningMinuteStatistic#medianは整数のminute値)であれば、minutes / 60は既に整数除算で切り捨てされるため.floorは不要です。Floatが渡る可能性を考慮しているなら意図が分かるようコメントしておくと親切ですが、通常はシンプルにminutes / 60で十分です。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/helpers/reports_helper.rb` at line 40, The use of .floor on the
expression computing hours is redundant because minutes is an Integer
(LearningMinuteStatistic#median returns integer minutes), so replace "hours =
(minutes / 60).floor" with the simpler "hours = minutes / 60" (or if you expect
minutes may be Float, keep .floor but add a brief comment explaining that floats
are possible); update the code in reports_helper.rb at the hours calculation
(variable name minutes and hours) accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@app/helpers/reports_helper.rb`:
- Around line 37-48: The difficulty_icon method in reports_helper.rb should be
moved into a decorator: implement
LearningMinuteStatisticDecorator#difficulty_icon (and similarly for Practice if
needed) so the presentation logic is tied to the model; remove difficulty_icon
from the helper and update views to call learning_stat.difficulty_icon (or
practice.difficulty_icon). Keep the same behavior (handle nil minutes, compute
hours from minutes and map ranges to 1–5 fire icons) and ensure the decorator is
picked up by active_decorator (class name LearningMinuteStatisticDecorator,
method difficulty_icon) so existing view calls use the new decorator method.
- Around line 37-48: Refactor difficulty_icon to compute level arithmetically
(e.g., clamp ((minutes / 60).floor / 5).ceil or integer division) instead of the
explicit case branches so it's easy to change step size/levels; ensure negative
or nil minutes are handled explicitly (return '' for nil and clamp negatives to
0 or treat as invalid) and map level to repeated '🔥' up to max 5; return
accessible markup (e.g., wrap the emoji string in a span with an appropriate
aria-label like "難易度: #{label_for_level(level)}") so screen readers get semantic
information; keep the helper name difficulty_icon and create or use a small
helper to produce the human-readable label for aria-label.
- Line 40: The use of .floor on the expression computing hours is redundant
because minutes is an Integer (LearningMinuteStatistic#median returns integer
minutes), so replace "hours = (minutes / 60).floor" with the simpler "hours =
minutes / 60" (or if you expect minutes may be Float, keep .floor but add a
brief comment explaining that floats are possible); update the code in
reports_helper.rb at the hours calculation (variable name minutes and hours)
accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 86296760-f5fb-4550-8120-89483af8be1c

📥 Commits

Reviewing files that changed from the base of the PR and between 1af571d and e5e274e.

📒 Files selected for processing (2)
  • app/helpers/reports_helper.rb
  • app/views/courses/practices/_courses_practice.html.slim
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/views/courses/practices/_courses_practice.html.slim

@karlley karlley force-pushed the feature/practice-difficulty-icon branch 3 times, most recently from 0ebe0ad to fbb941b Compare April 29, 2026 22:20
@karlley karlley force-pushed the feature/practice-difficulty-icon branch 4 times, most recently from c72d6af to 95679c9 Compare May 12, 2026 20:19
@karlley

karlley commented May 12, 2026

Copy link
Copy Markdown
Contributor Author

@machida
お疲れ様です!
UIの修正が含まれるので必要であればデザインをお願いしたいです。
よろしくお願いします!

@machida

machida commented May 13, 2026

Copy link
Copy Markdown
Member

@karlley ありがとうございます!!
確認しますー

@machida machida force-pushed the feature/practice-difficulty-icon branch from 95679c9 to 0cb9f6d Compare May 21, 2026 08:03
@machida

machida commented May 21, 2026

Copy link
Copy Markdown
Member

@karlley 遅くなってすいません🙇‍♂️デザインの調整をしましたー。
それに伴うテストのDOMも修正しました。

難易度は全員に表示、
目安の時間と平均時間はメンターと管理者でログインしているときだけの表示にしてあります。

最新の main から rebase しました。

@karlley

karlley commented May 21, 2026

Copy link
Copy Markdown
Contributor Author

@machida
デザイン調整ありがとうございます!
ローカルでも確認できました。

@karlley

karlley commented May 21, 2026

Copy link
Copy Markdown
Contributor Author

@kitarou888
お疲れ様です!
レビューをお願いしたいのですが対応可能でしょうか?
全く急いでいませんので時間掛かっても問題無いです。

@kitarou888

Copy link
Copy Markdown
Contributor

@karlley
すみません、せっかくお声がけいただいたのですが現在チーム開発活動をしていないため、ほかを当たっていただけると助かります🙏

@karlley

karlley commented May 24, 2026

Copy link
Copy Markdown
Contributor Author

@zamami
お疲れ様です!
レビューをお願いしたいのですが対応可能でしょうか?
全く急いでいませんので時間掛かっても問題無いです。

@zamami

zamami commented May 26, 2026

Copy link
Copy Markdown
Contributor

@karlley
レビュー依頼ありがとうございます。
今週末お返しできるようにやってみます!

@karlley karlley requested a review from zamami May 26, 2026 20:18
@karlley

karlley commented May 26, 2026

Copy link
Copy Markdown
Contributor Author

@zamami
ありがとうございます!
よろしくお願いします🙇‍♂️

@zamami zamami left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@karlley
アイコン実装お疲れ様です!
テストもしっかり書かれていて問題なさそうなのでapproveとさせていただきます。
レビュー遅くなって申し訳ありません🙇

スクショ
受講生
スクリーンショット 0008-06-09 13 36 31

管理者
スクリーンショット 0008-06-09 13 36 39

メンター
スクリーンショット 0008-06-09 13 37 05

@karlley karlley requested a review from zamami June 9, 2026 08:36
@karlley

karlley commented Jun 9, 2026

Copy link
Copy Markdown
Contributor Author

@zamami
確認ありがとうございます!
お忙しい中レビューありがとうございました🙇‍♂️

@okuramasafumi
メンバーレビューが完了しましたのでレビューお願いします!

Comment thread app/helpers/practices_helper.rb Outdated
end

def difficulty_icon(minutes)
return '' if minutes.nil?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ここのEarly Returnですが、下のcase文の中に入れ込んでしまえそうです。nil.to_iの結果が0であることを利用できそう。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

nil.to_iの結果が0であることを利用できそう

こちら利用することでnilを考慮する必要が無くなり、結果としてEarly Returnが不要になると解釈し修正しました。
認識正しかったでしょうか?
f72059f

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@karlley 惜しいです!テストケースを削除するということは振る舞いが変わってしまうということになるので、望ましくないです。
Early Returnを削除しつつ、既存のテストケースを維持するためには、

case minutes.to_i
when 0 then ''
when 1..100 then

のようにするとうまくいくと思います。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@okuramasafumi

確認ありがとうございます!

テストケースを削除するということは振る舞いが変わってしまうということになるので、望ましくないです。

確かにそうですね。テストは削除しない方向に修正いたします。

テストケースを維持したまま修正する方法についてですが、when 0 then '' のようにしてしまうと学習時間に応じたアイコン数の仕様を満たせなくなってしまうように思えます。
issueのコメントで確認した限りでは0時間はアイコン数は1つ表示になっています。

5時間🔥 → 0-5時間まで
10時間🔥🔥 → 6-10時間まで
15時間🔥🔥🔥 → 11-15時間まで
20時間🔥🔥🔥🔥 → 16-20時間まで
21時間以上🔥🔥🔥🔥🔥 → 21時間以上

#9328 (comment)

ただ、0時間をどうするかという点については具体的に確認できていないので町田さんに仕様を確認した上で修正を進めようと思いましたがいかがでしょうか?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@karlley お、なるほどです。0時間というものがあるなら、前提条件が変わってくると思います。町田さんに確認するのはよいと思います!

なお、Rubyのcase文はあくまで===という名前のメソッドを使っているだけなので、to_iを使わないでnilと比較してしまえば0時間との区別は付けられそうです。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@machida
お疲れさまです!
今さらですがアイコンの表示数について仕様を確認させてください。

5時間🔥 → 0-5時間まで

こちらのコメントで学習時間が0-5時間はアイコン1つにすると確認させて頂きましたが、0時間の場合もアイコンは表示するという認識で間違いないでしょうか?
#9328 (comment)

アイコン表示処理のリファクタリングを行っており、0時間をどう扱うかによって方向性が変わるため念の為確認させていただきました。
ご確認お願いします!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@karlley 0時間は誰もまだやっていない場合に0時間になります。ただ、誰もやっていないということは0時間ではなく、まだわからないということなので、0時間の場合はデータ収集中のような表示であるべきだと思いました。

データ収集中と表示しましょう。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@machida
確認ありがとうございます!

0時間の場合はデータ収集中のような表示であるべきだと思いました。
データ収集中と表示しましょう。

承知しました。
こちらの方針で修正いたします。

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@okuramasafumi
0時間の仕様確認した上で修正しました。
確認お願いします!
e405b80

@okuramasafumi

Copy link
Copy Markdown
Contributor

@karlley レビューしました!全体的に良い感じですが、一カ所だけコメントしてあるのでご確認よろしくお願いします!

@karlley karlley force-pushed the feature/practice-difficulty-icon branch from 0cb9f6d to 256c043 Compare June 25, 2026 09:00

@okuramasafumi okuramasafumi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

めちゃ良い感じです!

@karlley

karlley commented Jul 12, 2026

Copy link
Copy Markdown
Contributor Author

@okuramasafumi
確認ありがとうございました!

@komagata
メンターレビューが完了しましたのでマージお願いします。

@komagata komagata merged commit 67d4e61 into main Jul 13, 2026
20 checks passed
@komagata komagata deleted the feature/practice-difficulty-icon branch July 13, 2026 16:36
@komagata

Copy link
Copy Markdown
Member

@karlley マージしました〜

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.

6 participants