Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
2aeed95
Exif削除の処理をサービスオブジェクトに移動し、永続化前に実行されるように変更
matuaya Apr 13, 2026
cc80049
APIが返したURLが正しいblobを指していることを確認するテストを追加
matuaya Apr 13, 2026
a6cd548
ExifStripperのcallメソッドがExif情報を削除することを検証するテストを追加
matuaya Apr 14, 2026
1c44e11
EXIF削除ロジックをサービスクラスからImageモデルに移動
matuaya Apr 20, 2026
c8c142d
EXIF情報処理を引数なしで行いモデル内で完結するように修正
matuaya May 18, 2026
263dd6d
ファイル未指定時に早期リターンをするように修正
matuaya May 18, 2026
574f89d
添付ファイルの存在バリデーションを追加
matuaya May 18, 2026
21fd781
アップロード画像の取得方法をattr_accessorからattachment_changesに変更
matuaya May 18, 2026
ae3013b
Reスキルコースユーザーは通常コースの着手ボタンをクリックさせないようにした
zecky1120 Jun 13, 2026
08451b6
Reスキルコースユーザーは通常コースの提出物ボタンをクリックさせないようにした
zecky1120 Jun 13, 2026
7363cd1
Reスキルコースユーザーが通常プラクティスに遷移したときに提出物ボタンを押せないようにし、代わりにReスキルプラクティスに遷移させるようにした
zecky1120 Jun 15, 2026
8848b48
Reスキルから給付金に変更と、ステータスを給付金コースユーザーの場合はステータスを表示し、元プラクティスの時は給付金プラクティスへ遷移する…
zecky1120 Jun 18, 2026
0215b96
給付金コースユーザーが元プラクティスページに来た時、修了ボタンを非表示
zecky1120 Jun 18, 2026
dcb8be0
終了のみの場合のステータスを修正
zecky1120 Jun 19, 2026
6e68c55
提出物ボタンの箇所を給付金コースユーザーは元プラクティスでは表示させない
zecky1120 Jun 21, 2026
5d49580
ステータスのliタグの入れ子を修正
zecky1120 Jun 21, 2026
6bad9e1
提出が必要ない時は終了のみにした
zecky1120 Jun 21, 2026
dff0697
プラクティスの難易度をアイコンで表示する
karlley Apr 15, 2026
44eb371
プラクティスの難易度アイコンのテストを追加
karlley May 6, 2026
256c043
プラクティスの難易度・所要時間の表示を共通コンポーネントに置き換える
machida May 21, 2026
f72059f
不要なEarly Returnを削除
karlley Jun 25, 2026
aae7675
プラクティス理解度テスト機能を追加
komagata Jun 27, 2026
3f3659e
理解度テストのレビュー指摘を反映
komagata Jun 27, 2026
7d68bcb
理解度テストの回答整合性を改善
komagata Jun 27, 2026
6c46da1
理解度テストの各ページをサイトのデザインに合わせて再構成
komagata Jun 28, 2026
99f40cb
理解度テストの開発用初期データを追加
komagata Jun 28, 2026
e6840ae
理解度テストに合わせて開発用プラクティス本文を調整
komagata Jun 28, 2026
f831eb8
理解度テスト管理へのタブ導線を追加
komagata Jul 1, 2026
5e7f261
理解度テストのレビュー指摘を追加反映
komagata Jul 1, 2026
a8f288a
給付金コースへの移動導線を調整する
machida Jul 1, 2026
986243a
動画アップロードAPIを追加
komagata Jul 1, 2026
202dcc0
seedの動画にもサムネイルを生成するようにした
zamami Jul 2, 2026
7941956
開発環境のseedでBootcamp::Setup.attachmentを実行するよう復活させた
zamami Jul 2, 2026
0af5bd0
本番環境、開発環境のdockerfileにffmpegを追加
zamami Jul 3, 2026
e9f70f5
既存の動画でサムネイルがない動画のサムネイルを自動生成する処理を作成
zamami Jul 3, 2026
45ee5a2
サムネイルがない動画に対してサムネ作成ジョブが実行されるか確認するテストを作成
zamami Jul 3, 2026
552e053
AIモデルをClaude Sonnet 5に更新
komagata Jul 2, 2026
46a7655
CodeRabbitの動画API指摘を反映
komagata Jul 5, 2026
ad3c47c
Merge pull request #10251 from fjordllc/codex/add-movie-upload-api
komagata Jul 5, 2026
d80cbee
Merge pull request #10252 from fjordllc/codex/update-claude-sonnet-5
komagata Jul 5, 2026
f81fffa
ファイル名を変更
zamami Jul 6, 2026
088e03f
Merge pull request #10257 from fjordllc/feature/show-thumbnail-img
machida Jul 6, 2026
3b7cab7
Allow Pjord to read linked images
komagata Jul 7, 2026
17e287c
Address Pjord image review feedback
komagata Jul 7, 2026
babdc12
Merge pull request #10264 from fjordllc/komagata/bootcamp
komagata Jul 7, 2026
6c5ad71
practiceのmodelに給付金コースへ移動できる共通化メソッドを追加した
zecky1120 Jul 7, 2026
f84ac5c
test文を追加してunlessからif文に変更した
zecky1120 Jul 7, 2026
ccd7d45
Checkを提出物ごとに一意にする
komagata Jul 7, 2026
5659242
buzzesの年別リンクで不正な年を除外
komagata Jul 7, 2026
8789ce5
未使用のCheckコピー判定メソッドを削除
komagata Jul 7, 2026
bff604e
Merge pull request #10269 from fjordllc/komagata/1-check
komagata Jul 7, 2026
18b8548
Merge pull request #10270 from fjordllc/komagata/buzzes-500
komagata Jul 7, 2026
e405b80
学習時間0時間の表示を「データ収集中」に変更
karlley Jul 10, 2026
26f7356
ピヨルドが提出物OKできるフラグを追加
komagata Jul 7, 2026
2da163b
CodeRabbitの指摘に対応
komagata Jul 7, 2026
cccc193
提出物のCheck一意制約を前提に簡潔化
komagata Jul 8, 2026
19b683e
PjordレビューのOK表現をフラグで制御
komagata Jul 8, 2026
cea6a40
flakewatchアクションを更新
komagata Jul 8, 2026
bac2a2a
flakewatchのCIを再実行
komagata Jul 8, 2026
bd4db5b
flakewatch履歴の書き込みを無効化
komagata Jul 8, 2026
00478d8
Merge pull request #10283 from fjordllc/add-pjord-auto-check
komagata Jul 12, 2026
f93065c
複数の日報を一括で確認済みにするAPIを追加
komagata Jul 13, 2026
3a19290
日報の一括確認APIを高速化
komagata Jul 13, 2026
d2b74f8
else文に変更してその中にunless文で条件分岐した
zecky1120 Jul 13, 2026
cfb295a
CodeRabbitのレビュー指摘に対応
komagata Jul 13, 2026
d3fd157
EXIF削除処理を簡潔にする
komagata Jul 13, 2026
f2749e3
画像更新時にもEXIF情報を削除する
komagata Jul 13, 2026
c4265be
ゲスト閲覧時の理解度テストタブ表示を修正
komagata Jul 13, 2026
5d0a1a8
Merge pull request #9907 from fjordllc/bug/fix-exif-not-removed
komagata Jul 13, 2026
67d4e61
Merge pull request #9918 from fjordllc/feature/practice-difficulty-icon
komagata Jul 13, 2026
ebed4f8
Merge pull request #10284 from fjordllc/komagata/bulk-approve-daily-r…
komagata Jul 13, 2026
39187ee
Merge pull request #10224 from fjordllc/feature/prevent-students-in-R…
komagata Jul 14, 2026
4689d4b
リンク取得失敗時のメンター通知をやめる
komagata Jul 14, 2026
70f3173
Merge pull request #10288 from fjordllc/komagata/avoid-unreadable-url…
komagata Jul 15, 2026
827570c
mainブランチの変更を取り込み競合を解消
komagata Jul 15, 2026
7729a95
理解度テスト画面のスクリーンショットを追加
komagata Jul 15, 2026
d7a4b73
理解度テスト画面をBootcampのデザインに統一
komagata Jul 15, 2026
30668c6
理解度テスト問題一覧のテーブル表示を修正
komagata Jul 15, 2026
7645104
Update flakewatch to v0.6.33
komagata Jul 17, 2026
775ddec
flakewatchをv0.6.34に更新
komagata Jul 18, 2026
807c57a
flakewatch履歴の自動更新を有効化
komagata Jul 19, 2026
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
46 changes: 46 additions & 0 deletions .agents/skills/bootcamp-ui-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
name: bootcamp-ui-design
description: Design, implement, or review user-facing Rails/Slim screens in fjordllc/bootcamp so spacing, layout, forms, cards, actions, responsive behavior, and visual hierarchy match the existing Bootcamp UI. Use for new pages, UI changes, CSS changes, design reviews, screenshot comparisons, or requests to make a page feel consistent with Bootcamp.
---

# Bootcamp UI Design

Use existing Bootcamp structures as the design system. Prefer composition of established classes over new page-specific spacing rules.

## Workflow

1. Identify the page type: detail, list, form, result/status, or empty state.
2. Read [references/patterns.md](references/patterns.md) and inspect the listed source examples for that page type.
3. Search for existing components and classes before editing CSS:
- `rg "<class-name>" app/views app/assets/stylesheets`
- `rg -l "<similar-content>" app/views`
4. Implement the smallest structural change that reuses existing primitives.
5. Render realistic fixture data at desktop and mobile widths.
6. Capture screenshots and compare them with the selected reference pages.
7. Iterate until spacing, hierarchy, width, and actions feel consistent.
8. Run focused tests, Slim-Lint, Stylelint when CSS changes, and `git diff --check`.

## Required UI Checks

- Use `.page-main`, `.page-main-header`, `.page-body`, and `.container` consistently with comparable pages.
- Use `.page-body__rows` when direct page sections need the standard vertical gap.
- Put card content inside `.card-body > .card-body__inner`; `.card-body` alone does not provide standard padding.
- Use `.form__items`, `.form-item`, and `.form-actions` for form rhythm and action placement.
- Use existing container widths (`.is-md`, `.is-lg`, `.is-xl`) based on comparable pages.
- Keep primary, cancel, and destructive actions in their established `form-actions__item` roles.
- Verify long Japanese text, empty states, validation errors, and realistic row counts.
- Verify at 1440px desktop and 390px mobile widths. Do not approve from desktop alone.
- Avoid arbitrary margin or padding values when an existing structural class provides the spacing.
- If new CSS is necessary, explain which existing primitive was insufficient and use project variables.

## Visual Review Output

Report:

- reference pages used;
- reused layout and component classes;
- desktop and mobile screenshots captured;
- remaining intentional differences;
- focused tests and linters run.

Do not describe a screen as Bootcamp-like without rendering and inspecting it.
4 changes: 4 additions & 0 deletions .agents/skills/bootcamp-ui-design/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Bootcamp UI Design"
short_description: "Bootcampらしい画面設計と視覚検証を一貫して支援"
default_prompt: "Use $bootcamp-ui-design to implement this UI consistently with existing Bootcamp pages."
72 changes: 72 additions & 0 deletions .agents/skills/bootcamp-ui-design/references/patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Bootcamp UI Patterns

Inspect source files instead of copying this document as markup. These are maintained examples in the repository.

## Page Structure

- Standard page body and responsive section spacing:
- `app/assets/stylesheets/application/blocks/page/_page-body.css`
- `.page-body`, `.page-body__rows`, `.page-body__columns`
- Page headers and actions:
- `app/views/mentor/practices/practice_quiz/edit.html.slim`
- `app/views/mentor/practices/practice_quiz/questions/edit.html.slim`

## Forms

- Standard mentor form rhythm and actions:
- `app/views/mentor/categories/_form.html.slim`
- `app/views/mentor/coding_tests/_form.html.slim`
- `app/assets/stylesheets/shared/blocks/form/_form.css`
- `app/assets/stylesheets/shared/blocks/form/_form-item.css`
- `app/assets/stylesheets/shared/blocks/form/_form-actions.css`
- Use `.form__items` for a group, `.form-item` between fields, and `.form-actions` after fields.
- Do not add margins to individual labels or buttons until the form primitives have been used correctly.

## Cards

- Card structure:

```slim
.a-card
header.card-header
h2.card-header__title Title
hr.a-border-tint
.card-body
.card-body__inner
/ content
```

- Relevant styles:
- `app/assets/stylesheets/shared/blocks/card/_card-header.css`
- `app/assets/stylesheets/shared/blocks/card/_card-body.css`
- `.card-body__inner` owns the standard responsive padding. Omitting it makes content touch card edges.

## Tables and Empty States

- Admin tables are standalone because `.admin-table` owns its borders, background, and corner treatment. Do not wrap an admin table in `.a-card`.
- Use a preceding `header.page-body-header` when the table needs a local title or count.
- Reference implementations:
- `app/views/mentor/categories/index.html.slim`
- `app/views/mentor/coding_tests/index.html.slim`
- `app/views/mentor/practices/practice_quiz/edit.html.slim`
- Empty state:
- `.o-empty-message` in the same file.

## Result and Status Screens

- Status plus repeated result cards:
- `app/views/practices/practice_quiz/show.html.slim`
- `app/assets/stylesheets/application/blocks/practice-quiz/_practice-quiz.css`
- Keep status messaging visually separate from question/result cards.

## Screenshot Review

Use realistic development fixtures. At minimum capture:

- desktop: 1440 x 1000;
- mobile: 390 x 844;
- form before submission;
- result or state after submission when applicable;
- management/edit screen for mentor-facing features.

Compare section padding, gaps between sibling sections, content width, heading hierarchy, button placement, table density, and mobile stacking.
4 changes: 2 additions & 2 deletions .cloudbuild/deploy-cloud-run
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ fi
case "$environment" in
production)
export _RAILS_MAX_THREADS=5
export _PJORD_LLM_MODEL=claude-sonnet-4-6
export _PJORD_LLM_MODEL=claude-sonnet-5
cloud_run_args+=(--concurrency 5)
;;
staging)
export _MISSION_CONTROL_USERNAME="${_MISSION_CONTROL_USERNAME:-fjord}"
export _PJORD_LLM_MODEL=claude-sonnet-4-6
export _PJORD_LLM_MODEL=claude-sonnet-5
;;
review)
export _DISCORD_NOTICE_WEBHOOK_URL=
Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,9 @@ jobs:
uses: actions/checkout@v4

- name: Generate flakewatch HTML
# komagata/flakewatch v0.6.31
uses: komagata/flakewatch@e734ba749bb1f8de2b9ae8a35b2cb02d63bbbf76
# komagata/flakewatch v0.6.34
uses: komagata/flakewatch@v0.6.34
with:
junit-artifact-pattern: junit-xml-*
source-root: ${{ github.workspace }}
history-branch: flakewatch-data
history-write: auto
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,7 @@ yarn-debug.log*
.yarn-integrity
.claude
.DS_Store
.agents
.agents/*
!.agents/skills/
.agents/skills/*
!.agents/skills/bootcamp-ui-design/
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ RUN apt-get update -qq && apt-get install -y --no-install-recommends \
python3 \
git \
ca-certificates \
ffmpeg \
libvips && \
rm -rf /var/lib/apt/lists/*

Expand Down
1 change: 1 addition & 0 deletions Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ RUN apt-get update -qq && apt-get install -y --no-install-recommends \
libvips-dev \
postgresql-client \
tzdata \
ffmpeg \
vim && \
rm -rf /var/lib/apt/lists/*

Expand Down
19 changes: 18 additions & 1 deletion app/agents/pjord/product_review_agent.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,27 @@ class Pjord::ProductReviewAgent < Pjord::Agent

class << self
def review(product)
extract_public_response_body(new.ask(message(product)).content).presence
review_result(product)[:body]
end

def review_result(product)
content = new.ask(message(product)).content
{
body: extract_public_response_body(content).presence,
auto_check: auto_check?(content)
}
end

private

def auto_check?(content)
return false unless content.respond_to?(:to_h)

values = content.to_h
value = values.key?(:auto_check) ? values[:auto_check] : values['auto_check']
ActiveModel::Type::Boolean.new.cast(value) || false
end

def message(product)
user_course_practice = UserCoursePractice.new(product.user)
<<~TEXT
Expand All @@ -31,6 +47,7 @@ def message(product)

## プラクティス
- タイトル: #{product.practice.title}
- ピヨルドによる提出物OK: #{product.practice.pjord_auto_check? ? '許可されています' : '許可されていません'}
- ゴール:
#{truncate_for_prompt(product.practice.goal)}
- 説明:
Expand Down
1 change: 1 addition & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
@import "./application/blocks/practice/_practice-first-actions.css";
@import "./application/blocks/practice/_practice-status-buttons.css";
@import "./application/blocks/practice/_sticky-message.css";
@import "./application/blocks/practice-quiz/_practice-quiz.css";
@import "./application/blocks/question/_answer-badge.css";
@import "./application/blocks/reaction/_reaction.css";
@import "./application/blocks/report/_learning-times.css";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
.practice-quiz-status {
display: flex;
gap: 1rem;
align-items: flex-start;
padding: 1.25rem 1.5rem;
margin-bottom: 1.5rem;
border: solid 1px var(--border-tint);
border-radius: 0.5rem;
background-color: var(--base);
}

.practice-quiz-status.is-passed {
border-color: var(--success-tint);
background-color: var(--success-tint);
}

.practice-quiz-status.is-waiting {
border-color: var(--warning-tint);
background-color: var(--warning-tint);
}

.practice-quiz-status.is-info {
border-color: var(--info-tint);
background-color: var(--info-tint);
}

.practice-quiz-status__icon {
font-size: 1.75rem;
line-height: 1;
flex: 0 0 auto;
}

.practice-quiz-status.is-passed .practice-quiz-status__icon {
color: var(--success);
}

.practice-quiz-status.is-waiting .practice-quiz-status__icon {
color: var(--warning);
}

.practice-quiz-status.is-info .practice-quiz-status__icon {
color: var(--info);
}

.practice-quiz-status__title {
font-size: 1.125rem;
font-weight: bold;
margin: 0 0 0.25rem;
}

.practice-quiz-status__text {
font-size: 0.875rem;
line-height: 1.6;
color: var(--default-text);
margin: 0;
}

.practice-quiz-result,
.practice-quiz-form {
display: flex;
flex-direction: column;
gap: 1.25rem;
margin: 0;
padding: 0;
list-style: none;
}

.practice-quiz-result__item .card-header,
.practice-quiz-form__item .card-header {
display: flex;
align-items: baseline;
gap: 0.75rem;
}

.practice-quiz-question__type {
font-size: 0.75rem;
line-height: 1.4;
color: var(--semi-muted-text);
border: solid 1px var(--border);
border-radius: 1rem;
padding: 0.0625rem 0.625rem;
white-space: nowrap;
}

.practice-quiz-question__body {
margin-bottom: 1rem;
}

.practice-quiz-choices {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin: 0;
padding: 0;
list-style: none;
}

.practice-quiz-choices__item {
display: flex;
align-items: center;
gap: 0.625rem;
font-size: 0.875rem;
line-height: 1.5;
padding: 0.625rem 0.875rem;
border: solid 1px var(--border-tint);
border-radius: 0.25rem;
color: var(--semi-muted-text);
}

.practice-quiz-choices__item.is-correct {
border-color: var(--success-tint);
background-color: var(--success-tint);
color: var(--default-text);
font-weight: bold;
}

.practice-quiz-choices__icon {
flex: 0 0 auto;
color: var(--muted-text);
}

.practice-quiz-choices__item.is-correct .practice-quiz-choices__icon {
color: var(--success);
}

.practice-quiz-choices__label {
flex: 1 1 auto;
}

.practice-quiz-explanation {
margin-top: 1rem;
padding: 1rem 1.25rem;
border-radius: 0.25rem;
background-color: var(--background-tint);
}

.practice-quiz-explanation__label {
display: flex;
align-items: center;
gap: 0.375rem;
font-size: 0.8125rem;
font-weight: bold;
color: var(--semi-muted-text);
margin-bottom: 0.5rem;
}

.practice-quiz-explanation__label i {
color: var(--warning);
}
Original file line number Diff line number Diff line change
Expand Up @@ -151,21 +151,3 @@
a.category-practices-item__title-link:hover .category-practices-item__title-link-label {
text-decoration: underline;
}

.category-practices-item__learning-time {
font-size: .75rem;
line-height: 1.4;
color: var(--muted-text);
}

@media (width >= 48em) {
.category-practices-item__learning-time {
margin-top: -.25rem;
}
}

@media (width <= 47.9375em) {
.category-practices-item__learning-time {
margin-top: .5rem;
}
}
Loading
Loading