Skip to content

職務経歴書PDFの余白修正とフォーム・出力表記の調整#302

Merged
yusuke0610 merged 6 commits into
mainfrom
fix/resume-pdf-format-and-form
Jun 5, 2026
Merged

職務経歴書PDFの余白修正とフォーム・出力表記の調整#302
yusuke0610 merged 6 commits into
mainfrom
fix/resume-pdf-format-and-form

Conversation

@yusuke0610

@yusuke0610 yusuke0610 commented Jun 1, 2026

Copy link
Copy Markdown
Owner

概要

職務経歴書の PDF 出力で 1 ページ目に余分な余白が残る問題の修正を中心に、PDF/Markdown の出力表記とフォーム UI の調整をまとめて行います。

注: 本ブランチには未マージの既存コミット resume PDF space fix(会社ブロックのページ跨ぎ許可)も含まれます。

変更内容

PDF 出力(backend/app/services/pdf/

  • 1 ページ目の余分な余白を解消: .project { page-break-inside: avoid } を削除(収まらない案件が丸ごと次ページへ送られ、枠付き company 内に約 48mm の余白が残っていた)。あわせて body { margin: 0 } で先頭の既定余白も除去
  • 表分割時の見出し繰り返し: プロジェクト表を <thead>/<tbody> 化し、ページ境界で分割された際に列見出しを継続ページにも表示
  • 体制カラムの廃止: 表の「体制」列を削除し、役割行へ 役割:X、体制:6名(PM:1名、SE:6名) 形式で併記。空いた幅は業務内容(.desc 60%→75%)へ
  • 表記統一: 列見出し「開発環境」→「スキルセット」、見出し「取引先名:」→「案件名:」

Markdown 出力(backend/app/services/markdown/

  • フィールドラベル「技術スタック」→「スキルセット」

フォーム UI(frontend/src/components/forms/

  • IT企業チェックを会社名・事業内容と同一行・入力欄と横並びに配置(幅比 会社名:事業内容:IT企業 = 4.5:5:0.5)
  • 資格入力の幅比を 資格名:取得日 = 7:3 に調整
  • スキル入力ラベル「技術スタック」→「スキルセット」に統一
  • 取引先名ラベル「取引先名(呼称)」→「案件名」

テスト

  • make ci 通過(backend lint/test、frontend lint、vitest 205 passed、build 成功)
  • 表示文言・レイアウト中心の差分のため新規ユニットテストは追加せず。新規ルート/認証/レイアウト変更が無いため E2E トリガー対象外

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Style

    • Updated resume pagination and table layout for improved formatting and reduced large whitespace.
    • Tweaked form layout and spacing (including a new inline toggle style) for cleaner alignment.
  • Refactor

    • Simplified project table by consolidating columns and moving team details into the project header.
    • Adjusted qualification row layout for clearer label/date sizing.
  • Localization

    • Unified labels: "技術スタック" → "スキルセット" and client label changed to "案件名".

yusuke0610 and others added 2 commits June 1, 2026 21:38
- PDF: 1ページ目の余分な余白を解消(.project の page-break-inside 削除、
  body margin:0)。表がページ分割される際は thead で列見出しを繰り返す
- PDF: プロジェクト表の体制カラムを廃止し、役割行へ
  「役割:X、体制:6名(PM:1名、SE:6名)」形式で併記。空いた幅を業務内容へ
- PDF/Markdown: 出力表記を統一(開発環境/技術スタック→スキルセット、
  取引先名→案件名)
- フォーム: IT企業チェックを会社名・事業内容と同一行・入力欄と横並びに配置
  (幅比 会社名:事業内容:IT企業 = 4.5:5:0.5)
- フォーム: 資格入力の幅比を 資格名:取得日 = 7:3 に調整
- フォーム: スキル入力ラベルを「技術スタック」→「スキルセット」に統一

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 1, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • frontend/package-lock.json is excluded by !**/package-lock.json

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2495d999-601c-43b8-95b2-9189ca367c48

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Terminology, data layout, and presentation updates: "技術スタック" → "スキルセット" across backend/frontend; project team moved into project header and removed from table; client label changed to "案件名"; form grids adjusted; PDF pagination and project-table column widths updated.

Changes

Career Form and Resume Refactoring

Layer / File(s) Summary
Skill Set Terminology Standardization
backend/app/services/markdown/generators/resume_generator.py, backend/app/services/pdf/generators/resume_generator.py, frontend/src/components/forms/ProjectModal.tsx
Labels and comments for the technology-stack field renamed from "技術スタック" to "スキルセット" (markdown, PDF comments, ProjectModal header and aria-label).
Project Team Data Extraction and Table Restructuring
backend/app/services/pdf/generators/resume_generator.py, backend/app/services/pdf/templates/resume.css
New _format_team() outputs team text embedded in project header line2; removed dedicated team column from project table and updated table structure; CSS column widths adjusted to reflect removed team column.
Client and Project Naming Convention
backend/app/services/pdf/generators/resume_generator.py, frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx, frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx
Per-client label changed from "取引先名" to "案件名"; frontend client header and IT-path section heading updated to "案件名"/"案件情報".
Career Form Layout Restructuring
frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx, frontend/src/components/forms/CareerResumeForm.module.css, frontend/src/components/forms/sections/CareerQualificationsSection.tsx
Company/business input rows and qualification rows use explicit gridTemplateColumns; IT-company toggle moved inline with new .companyTypeToggle styling; removed older standalone checkbox.
Resume PDF Styling and Pagination
backend/app/services/pdf/templates/resume.css
body { margin: 0 }; added page-break-after: avoid to headings/company blocks; updated comments and pagination strategy for company/project blocks; increased .project-table td.desc to 75% and kept td.env at 25%.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰
I nudge "技術" to a gentler name,
スキルセット hops into its frame.
Teams curl into headers, neat and small,
Forms align, pages avoid the fall.
Resumes hop forward—tidy, one and all.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 77.78% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main changes: PDF margin fixes and form/output terminology adjustments for a resume document.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/resume-pdf-format-and-form

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 and usage tips.

@coderabbitai coderabbitai 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.

Actionable comments posted: 3

🧹 Nitpick comments (2)
frontend/src/components/forms/ProjectModal.tsx (1)

28-28: 💤 Low value

Consider updating JSDoc comment for terminology consistency.

While the prop name techStackNamesByCategory was appropriately left unchanged to avoid breaking changes, the JSDoc comment still uses the old terminology "技術スタック". Consider updating it to "スキルセット" to match the standardized user-facing terminology throughout the UI.

📝 Suggested consistency update
-  /** カテゴリごとの技術スタック名称リスト */
+  /** カテゴリごとのスキルセット名称リスト */
   techStackNamesByCategory: Map<string, string[]>;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/forms/ProjectModal.tsx` at line 28, Update the JSDoc
comment above the prop usage in ProjectModal.tsx to use the standardized
user-facing term "スキルセット" instead of "技術スタック" while keeping the prop name
techStackNamesByCategory unchanged; locate the comment that currently reads
"カテゴリごとの技術スタック名称リスト" and change its text to "カテゴリごとのスキルセット名称リスト" (or equivalent)
so documentation matches UI terminology without altering the
techStackNamesByCategory identifier.
frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx (1)

119-120: 💤 Low value

Update comment terminology to match code changes.

The comment still uses "取引先" terminology. If the migration to "案件" terminology is intended to be complete, update the comment for consistency:

-          {/* IT企業かどうか(非ITは取引先を持たず詳細のみ)。会社名・事業内容と同じ行に配置。
+          {/* IT企業かどうか(非ITは案件を持たず詳細のみ)。会社名・事業内容と同じ行に配置。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`
around lines 119 - 120, Update the in-file Japanese comment in the
CareerExperienceEditor component to use the new terminology "案件" instead of the
old "取引先" so it matches recent code changes; locate the comment block inside
frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx
(within the CareerExperienceEditor component) and replace occurrences of "取引先"
with "案件", keeping the rest of the explanatory text and layout notes unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/app/services/pdf/templates/resume.css`:
- Line 44: Replace the deprecated CSS property page-break-after with the modern
break-after in the resume stylesheet: for selectors h2, .company-header, and
.client-name, change the rule page-break-after: avoid to break-after: avoid so
the behavior is preserved while using the CSS Fragmentation Level 3 property
(WeasyPrint supports both).

In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`:
- Line 261: The heading and action button in CareerExperienceEditor are
inconsistent: the h3 shows "案件情報" while the action button still reads "取引先を追加";
pick one terminology and make labels consistent across the component and related
editors (e.g., CareerExperienceEditor and ClientEditor). Either change the h3 to
"取引先情報" or change all button/label text "取引先を追加"/"取引先" to "案件を追加"/"案件" (and
update any shared label props, translation keys or constants used by
ClientEditor and CareerExperienceEditor) so the UI uses a single term
throughout.

In `@frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx`:
- Line 70: ClientEditor currently mixes “案件名” UI with leftover “取引先…” literals
and hard-coded strings; update ClientEditor.tsx to use single terminology
(“案件名”) consistently by replacing occurrences of "取引先なし" and "取引先を削除" with the
equivalent “案件名” wording, and move all user-facing literals (e.g. "案件名",
"取引先なし", "取引先を削除", and placeholder "例: 〇〇社(略称)") into
frontend/src/constants/messages.ts following .claude/rules/frontend/messages.md,
then import the message constants into ClientEditor.tsx and use them in the JSX
(replace the literal strings and placeholder props). Ensure the message keys you
add are clearly named (e.g. CASE_NAME, CASE_NONE, CASE_DELETE_LABEL,
CASE_PLACEHOLDER) and update any labels/placeholders in ClientEditor component
to reference those keys so terminology is consistent.

---

Nitpick comments:
In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`:
- Around line 119-120: Update the in-file Japanese comment in the
CareerExperienceEditor component to use the new terminology "案件" instead of the
old "取引先" so it matches recent code changes; locate the comment block inside
frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx
(within the CareerExperienceEditor component) and replace occurrences of "取引先"
with "案件", keeping the rest of the explanatory text and layout notes unchanged.

In `@frontend/src/components/forms/ProjectModal.tsx`:
- Line 28: Update the JSDoc comment above the prop usage in ProjectModal.tsx to
use the standardized user-facing term "スキルセット" instead of "技術スタック" while keeping
the prop name techStackNamesByCategory unchanged; locate the comment that
currently reads "カテゴリごとの技術スタック名称リスト" and change its text to "カテゴリごとのスキルセット名称リスト"
(or equivalent) so documentation matches UI terminology without altering the
techStackNamesByCategory identifier.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 00435b05-532c-4844-a067-2af5be982955

📥 Commits

Reviewing files that changed from the base of the PR and between e43338b and d4dd291.

📒 Files selected for processing (8)
  • backend/app/services/markdown/generators/resume_generator.py
  • backend/app/services/pdf/generators/resume_generator.py
  • backend/app/services/pdf/templates/resume.css
  • frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx
  • frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx
  • frontend/src/components/forms/CareerResumeForm.module.css
  • frontend/src/components/forms/ProjectModal.tsx
  • frontend/src/components/forms/sections/CareerQualificationsSection.tsx

padding-bottom: 1mm;
margin: 6mm 0 3mm 0;
/* 見出しがページ末尾に孤立して直後の本文だけ次ページに行くのを防ぐ */
page-break-after: avoid;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check WeasyPrint documentation for break-after support
python -c "import weasyprint; print(f'WeasyPrint version: {weasyprint.__version__}')"

Repository: yusuke0610/devforge

Length of output: 187


🏁 Script executed:

#!/bin/bash
# Locate all page-break-after usages in the CSS template and show nearby context.
rg -n "page-break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Also show any break-after usages for comparison.
rg -n "break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true

# Print the relevant line ranges around the originally referenced lines (43-44, 62-63, 114-115).
# Use sed with absolute line numbers from the file.
sed -n '35,75p' backend/app/services/pdf/templates/resume.css
echo "----"
sed -n '95,130p' backend/app/services/pdf/templates/resume.css

Repository: yusuke0610/devforge

Length of output: 1635


🏁 Script executed:

#!/bin/bash
# Locate all page-break-after usages in the CSS template and show nearby context.
rg -n "page-break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Also show any break-after usages for comparison.
rg -n "break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true

# Print the relevant line ranges around the originally referenced lines (43-44, 62-63, 114-115).
# Use sed with absolute line numbers from the file.
sed -n '35,75p' backend/app/services/pdf/templates/resume.css
echo "----"
sed -n '95,130p' backend/app/services/pdf/templates/resume.css

Repository: yusuke0610/devforge

Length of output: 1635


🌐 Web query:

WeasyPrint support for break-after CSS Fragmentation Module Level 3 page-break-after

💡 Result:

WeasyPrint support for “break-after” from the CSS Fragmentation Module Level 3 (and CSS2’s page-break-after alias) is only for page fragmentation, not for multi-column/region fragmentation. 1) Fragmentation Module Level 3: break-after is supported for pages WeasyPrint’s documentation states that the “break-before”, “break-after”, and “break-inside” properties are supported, specifically for pages (but not for columns and regions). [1] So, in terms of the exact question (“break-after CSS Fragmentation Module Level 3 … page-break-after”): - break-after: page (and related break-after values that create page breaks) should work because break-after is supported for pages. [1][2] - page-break-after (CSS2 alias) is also supported. [1] 2) Not supported for columns and regions The same WeasyPrint docs explicitly say break properties are not supported “for columns and regions”. [1] So if you are inside a multi-column container or other fragmentation context where columns/regions apply, break-after may not behave as expected (and WeasyPrint’s multi-column docs also note break-before/after/inside are not supported for multi-column layout). [3] 3) Practical note for your template pattern In a simple single-column paged flow, using page-break-after: always should usually force page breaks after each repeated section. However, real-world behavior can be affected by surrounding layout (e.g., margins, flex/grid/other supported-but-not-perfect layout scenarios, and where in the DOM the break element lands). If you’re trying to force a break after each “section”, a common reliable pattern is to apply the break to an element that produces/ends the section content and is not empty (e.g., a block-level element wrapping the section), and to test with a single instance first. (Your own experience of “it only works when I add it twice” can happen with edge cases where the break opportunity is suppressed or where the added element creates additional layout that changes break positioning.) Bottom line - Yes: WeasyPrint supports break-after (Fragmentation Module Level 3) for pages, and supports page-break-* aliases too. [1] - No: It does not support break-after for columns and regions. [1][3] If you share whether your template is single-column or uses multi-columns (or any CSS that creates column/region fragmentation), I can suggest the most WeasyPrint-compatible way to structure the break element.

Citations:


🌐 Web query:

WeasyPrint page-break-after break-after

💡 Result:

WeasyPrint supports both the modern break-after CSS property and the legacy page-break-after alias [1]. Key points regarding their usage: 1. Compatibility: WeasyPrint supports the properties defined in the CSS Fragmentation Module (Level 3/4), specifically break-before, break-after, and break-inside [1]. It also maintains support for legacy page-break-* aliases, such as page-break-after [1]. 2. Preferred Usage: While both work, break-after is the modern standard [2][3]. When using these properties, common values include always (to force a break), avoid (to prevent a break), and position-specific values like left or right [1][4][2]. 3. Troubleshooting Common Issues: - Empty Pages: If you experience unexpected blank pages, ensure that you are not applying breaks to elements that are already at the end of a page or applying them in a way that forces multiple breaks unintentionally [5]. - Box Model Effects: WeasyPrint relies on the box model to determine break points [6]. Applying a break property to an empty element (e.g., <p style="page-break-after: always;"></p>) can sometimes lead to unpredictable behavior if the element itself creates layout interference. - Alternative Approaches: If a standard break is not working as expected within complex layouts (like tables), try applying the CSS property directly to the block-level element (e.g., a or

) instead of using an empty spacer element [7]. For official technical reference, you can consult the WeasyPrint documentation on API and layout [1][6].

Citations:


🌐 Web query:

CSS Fragmentation Module Level 3 page-break-after deprecated break-after avoid

💡 Result:

The page-break-after property is deprecated and has been superseded by the break-after property [1][2][3]. As part of the CSS Fragmentation Module Level 3 specification, browsers are required to treat page-break-after as a legacy shorthand alias for break-after to maintain backward compatibility [4][5][6]. While it remains supported for compatibility reasons, its use is no longer recommended, and developers are encouraged to update their code to use break-after [1][3]. The following table summarizes how the legacy property maps to the modern property: Legacy (page-break-after) | Modern (break-after) --- | --- auto | auto left | left right | right avoid | avoid always | page Note that the legacy always value is aliased to page in the modern specification [5][6]. The break-after property is more robust, as it extends beyond paged media (printing) to support fragmentation in multi-column layouts and regions [2][6].

Citations:


Replace deprecated page-break-after with modern break-after

backend/app/services/pdf/templates/resume.css uses page-break-after: avoid in h2, .company-header, and .client-name (lines 44, 63, 115). page-break-after is deprecated in favor of CSS Fragmentation Level 3 break-after; WeasyPrint supports both, so this keeps behavior while aligning with the current standard.

♻️ Proposed fix
 h2 {
   font-size: 12pt;
   border-bottom: 2px solid `#333`;
   padding-bottom: 1mm;
   margin: 6mm 0 3mm 0;
   /* 見出しがページ末尾に孤立して直後の本文だけ次ページに行くのを防ぐ */
-  page-break-after: avoid;
+  break-after: avoid;
 }
 .company-header {
   background: `#d6dce8`;
   padding: 3px 4px;
   font-size: 10pt;
   font-weight: bold;
   border-bottom: 0.3px solid `#999`;
   /* ヘッダがページ末尾に孤立し本文だけ次ページに分かれるのを防ぐ */
-  page-break-after: avoid;
+  break-after: avoid;
 }
 .client-name {
   font-size: 10pt;
   font-weight: bold;
   margin: 3mm 0 2mm 0;
   padding-bottom: 1mm;
   border-bottom: 2px solid `#333`;
   /* 案件名見出しの孤立防止 */
-  page-break-after: avoid;
+  break-after: avoid;
 }
🧰 Tools
🪛 Stylelint (17.12.0)

[error] 44-44: Expected "page-break-after" to be "break-after" (property-no-deprecated)

(property-no-deprecated)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/app/services/pdf/templates/resume.css` at line 44, Replace the
deprecated CSS property page-break-after with the modern break-after in the
resume stylesheet: for selectors h2, .company-header, and .client-name, change
the rule page-break-after: avoid to break-after: avoid so the behavior is
preserved while using the CSS Fragmentation Level 3 property (WeasyPrint
supports both).

{exp.is_it_company && (
<div className={styles.stackSection}>
<h3>取引先</h3>
<h3>案件情報</h3>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Incomplete terminology migration creates user confusion.

The section heading now reads "案件情報" (Project Information), but the action button below at line 280 still says "取引先を追加" (Add Client). This inconsistency confuses users—are they adding "案件" or "取引先"?

For a coherent user experience, either complete the terminology migration throughout (all "取引先" → "案件") or reconsider whether the heading should remain "取引先情報" to match the button text.

Proposed fix for terminology consistency

If the intent is to fully migrate to "案件" terminology:

-            <button type="button" className="ghost" onClick={() => onAddClient(expIndex)}>
-              取引先を追加
-            </button>
+            <button type="button" className="ghost" onClick={() => onAddClient(expIndex)}>
+              案件を追加
+            </button>

And similarly update ClientEditor.tsx line 232:

-        {client.is_vacation ? "休業を削除" : "取引先を削除"}
+        {client.is_vacation ? "休業を削除" : "案件を削除"}

And line 91:

-              取引先なし
+              案件なし
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`
at line 261, The heading and action button in CareerExperienceEditor are
inconsistent: the h3 shows "案件情報" while the action button still reads "取引先を追加";
pick one terminology and make labels consistent across the component and related
editors (e.g., CareerExperienceEditor and ClientEditor). Either change the h3 to
"取引先情報" or change all button/label text "取引先を追加"/"取引先" to "案件を追加"/"案件" (and
update any shared label props, translation keys or constants used by
ClientEditor and CareerExperienceEditor) so the UI uses a single term
throughout.

<label className={styles.clientNameLabel}>
<span>
取引先名(呼称)
案件名

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for remaining "取引先" usage in frontend form components
rg -n --type=tsx -C2 '取引先' frontend/src/components/forms/

Repository: yusuke0610/devforge

Length of output: 91


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) Correctly search for remaining Japanese terminology in the target area
echo "== occurrences of '取引先' in frontend/src/components/forms/ (ts/tsx/js/ts?) =="
rg -n -C2 -g'*.{ts,tsx,js,jsx}' '取引先' frontend/src/components/forms/ || true

# 2) Inspect the specific file around the cited lines
echo
echo "== ClientEditor.tsx around label change =="
# show manageable ranges around the referenced line numbers
nl -ba frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx | sed -n '50,120p'

echo
echo "== ClientEditor.tsx around line 220-260 =="
nl -ba frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx | sed -n '210,260p'

# 3) Open the frontend message management guidelines to confirm SSoT / literal rules
echo
echo "== .claude/rules/frontend/messages.md =="
nl -ba .claude/rules/frontend/messages.md | sed -n '1,220p'

# 4) Also confirm if there's any message/i18n pattern used in this file
echo
echo "== ClientEditor.tsx: find uses of i18n/message helpers =="
rg -n 'useTranslation|t\(|message\.|i18n|SSoT|messages' frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx || true

echo
echo "== ClientEditor.tsx: find occurrences of '案件名' =="
rg -n '案件名' frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx || true

Repository: yusuke0610/devforge

Length of output: 7667


🏁 Script executed:

#!/bin/bash
set -euo pipefail

TARGET="frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx"
FORMS_DIR="frontend/src/components/forms/"

echo "== occurrences of '取引先' in $FORMS_DIR (ts/tsx/js/jsx) =="
rg -n -C2 -t ts -t tsx -t js -t jsx '取引先' "$FORMS_DIR" || true

echo
echo "== occurrences of '案件名' in $TARGET =="
rg -n '案件名' "$TARGET" || true

echo
echo "== ClientEditor.tsx line 60-110 (around the label change) =="
awk 'NR>=60 && NR<=110 {printf "%d\t%s\n", NR, $0}' "$TARGET"

echo
echo "== ClientEditor.tsx line 210-250 (around delete button) =="
awk 'NR>=210 && NR<=250 {printf "%d\t%s\n", NR, $0}' "$TARGET"

echo
echo "== .claude/rules/frontend/messages.md (message-literal / SSoT rules) =="
# Print only the sections that mention literals/SSoT/i18n to keep output small
rg -n 'SSoT|literal|message|i18n|t\(' .claude/rules/frontend/messages.md || true
awk 'NR>=1 && NR<=260 {printf "%d\t%s\n", NR, $0}' .claude/rules/frontend/messages.md

Repository: yusuke0610/devforge

Length of output: 7603


Fix remaining “client” terminology + move UI strings to frontend SSoT messages

  • ClientEditor.tsx は「案件名」へ変えている一方、UI はまだ「取引先なし」(line 91)や「取引先を削除」(line 232)を表示しており、文言が混在してユーザーが迷います(“案件名” 側の用語に統一するか、意図を明確に)。
  • .claude/rules/frontend/messages.md に従い、ts/tsx のユーザー表示文言はリテラル直書き禁止です。案件名(line 70)、取引先なし(line 91)、取引先を削除(line 232)、placeholder="例: 〇〇社(略称)"(line 77)などを frontend/src/constants/messages.ts から取得する形に置き換えてください。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx` at line 70,
ClientEditor currently mixes “案件名” UI with leftover “取引先…” literals and
hard-coded strings; update ClientEditor.tsx to use single terminology (“案件名”)
consistently by replacing occurrences of "取引先なし" and "取引先を削除" with the
equivalent “案件名” wording, and move all user-facing literals (e.g. "案件名",
"取引先なし", "取引先を削除", and placeholder "例: 〇〇社(略称)") into
frontend/src/constants/messages.ts following .claude/rules/frontend/messages.md,
then import the message constants into ClientEditor.tsx and use them in the JSX
(replace the literal strings and placeholder props). Ensure the message keys you
add are clearly named (e.g. CASE_NAME, CASE_NONE, CASE_DELETE_LABEL,
CASE_PLACEHOLDER) and update any labels/placeholders in ClientEditor component
to reference those keys so terminology is consistent.

claude added 2 commits June 5, 2026 01:21
techStackNamesByCategory prop の JSDoc が「技術スタック」のままで、
UI ラベル(スキルセット)と表記が不一致だったため修正。
prop 名(techStackNamesByCategory)は変更しない。

https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC
UI/出力の表記統一(取引先名→案件名)に合わせ、IT企業トグル周辺の
説明コメント内の「取引先」を「案件」へ修正。レイアウト注記は変更なし。

https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC

Copy link
Copy Markdown
Owner Author

CodeRabbit の指摘 2 件(表記統一に取り残されたコード内コメント)を修正しました。

  • ProjectModal.tsx: prop techStackNamesByCategory の JSDoc 「技術スタック」→「スキルセット」(UI ラベルに合わせる。識別子は変更なし)
  • CareerExperienceEditor.tsx: IT企業トグル周辺コメント 「取引先」→「案件」(取引先名→案件名 の統一に追従)

いずれもコメント文言のみの変更で、挙動・型・識別子に変更はありません。本ブランチ (fix/resume-pdf-format-and-form) へスタックする形で #304 を作成済みです。マージすると本 PR に取り込まれます。


Generated by Claude Code

yusuke0610 and others added 2 commits June 5, 2026 10:37
react-router/react-router-dom 7.13.1 が GHSA-49rj-9fvp-4h2h(turbo-stream
経由の未認証 RCE)等の high 脆弱性範囲(7.0.0-7.14.2)に該当し、CI の
npm audit --audit-level=high が fail していた。package.json の ^7.13.1
範囲内で lockfile のみ 7.17.0 に更新して解消(package.json は変更なし)。

https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC
@yusuke0610
yusuke0610 merged commit b2bb498 into main Jun 5, 2026
18 checks passed
@yusuke0610
yusuke0610 deleted the fix/resume-pdf-format-and-form branch June 10, 2026 06:00
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.

2 participants