diff --git a/.claude/hooks/notify-stop.sh b/.claude/hooks/notify-stop.sh new file mode 100755 index 0000000..6d06f44 --- /dev/null +++ b/.claude/hooks/notify-stop.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# プロジェクト名を取得 +PROJECT_NAME=$(basename "$CLAUDE_PROJECT_DIR") + +# ブランチ名を取得 +BRANCH_NAME=$(git -C "$CLAUDE_PROJECT_DIR" branch --show-current 2>/dev/null || echo "unknown") + +# PowerShell通知を実行 +powershell.exe -Command " + Add-Type -AssemblyName System.Windows.Forms; + Add-Type -AssemblyName System.Drawing; + \$notification = New-Object System.Windows.Forms.NotifyIcon; + \$notification.Icon = [System.Drawing.SystemIcons]::Information; + \$notification.BalloonTipTitle = 'Claude Code - $PROJECT_NAME'; + \$notification.BalloonTipText = '$BRANCH_NAME: Ready!'; + \$notification.Visible = \$true; + \$notification.ShowBalloonTip(5000); + Start-Sleep -Seconds 5; + \$notification.Dispose() +" diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..8f36981 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,47 @@ +{ + "permissions": { + "allow": [ + "Write", + "WebFetch(domain:fintan.jp)", + "WebFetch(domain:nablarch.github.io)", + "Bash(git worktree:*)", + "Bash(git add:*)", + "Bash(git commit:*)", + "Bash(git push)", + "Bash(git show)", + "Bash(git rev-parse:*)", + "Bash(gh api:*)", + "Bash(gh pr view:*)", + "Bash(gh pr list:*)", + "Bash(gh pr comment:*)", + "Bash(gh pr ready:*)", + "Bash(gh pr review:*)", + "Bash(gh pr create:*)", + "Bash(gh pr edit:*)" + ] + }, + "hooks": { + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "bash .claude/hooks/notify-stop.sh", + "timeout": 10 + } + ] + } + ], + "Notification": [ + { + "hooks": [ + { + "type": "command", + "command": "bash .claude/hooks/notify-stop.sh", + "timeout": 10 + } + ] + } + ] + } +} diff --git a/.claude/skills/resolve-pr/SKILL.md b/.claude/skills/resolve-pr/SKILL.md new file mode 100644 index 0000000..65e956b --- /dev/null +++ b/.claude/skills/resolve-pr/SKILL.md @@ -0,0 +1,114 @@ +--- +name: resolve-pr +description: PRのunresolvedなレビューコメントに対応する。修正→コミット→コミットリンク付きリプライを実行。「PRレビュー対応して」「レビューコメント直して」「PR 123 のフィードバック対応」などで使用。gh CLI必須。 +context: fork +allowed-tools: Bash, Read, Edit, Write, AskUserQuestion +--- + +# PRレビューコメント対応 + +## 前提条件 + +gh CLI認証を確認する: +```bash +gh auth status +``` +未認証なら `gh auth login` を案内して終了する。 + +## ワークフロー概要 + +1. unresolvedなレビュースレッドを取得する +2. 各スレッド: 分析 → 修正 → コミット → プッシュ → リプライ +3. PRリンク付きサマリーを出力する + +※ resolveはレビュアーが行う + +## Step 1: 入力 + +`$ARGUMENTS`からPR番号を取得する。空ならユーザーに確認する。 + +リポジトリ情報を取得する: +```bash +gh repo view --json owner,name -q '.owner.login + "/" + .name' +``` + +## Step 2: unresolvedスレッド取得 + +`scripts/get-unresolved-threads.sh`を実行する: +```bash +bash scripts/get-unresolved-threads.sh {owner} {repo} {pr_number} +``` + +空なら「すべてのレビューコメントが解決済みです」と報告して終了する。 + +## Step 3: 各スレッドを処理 + +### 3a. 分析 +- コメント本文から指摘内容を理解する +- Readツールで `{path}:{line}` 周辺を確認する + +### 3b. 判断 + +| 状況 | 対応 | +|------|------| +| 修正が必要 | 3c へ | +| 不明点あり | 質問をリプライする | +| 同意できない | ユーザーに確認する | + +### 3c. 修正・コミット・プッシュ + +1. ファイルを修正する +2. `git add {path}` +3. `git commit -m "fix: {要約}"` +4. `git push` +5. `git rev-parse HEAD` でSHAを取得する + +### 3d. リプライ + +```bash +gh api --method POST \ + "repos/{owner}/{repo}/pulls/{pr_number}/comments/{comment_db_id}/replies" \ + -f body="修正しました ✅ + +**コミット**: https://github.com/{owner}/{repo}/commit/{sha} + +{修正内容} + +--- +Co-Authored-By: Claude " +``` + +質問の場合: +```bash +gh api --method POST \ + "repos/{owner}/{repo}/pulls/{pr_number}/comments/{comment_db_id}/replies" \ + -f body="確認させてください 🤔 + +{質問内容} + +--- +Co-Authored-By: Claude " +``` + +## Step 4: サマリー + +全スレッド処理後に出力する: +``` +## PR Review対応完了 + +**PR**: https://github.com/{owner}/{repo}/pull/{pr_number} + +### 結果 +- ✅ 修正: {n}件 +- ❓ 質問: {n}件 + +再レビューをお願いします 🙏 +``` + +## エラー処理 + +| エラー | 対応 | +|--------|------| +| gh未認証 | `gh auth login` を案内して終了する | +| PR番号無効 | 正しい番号を確認する | +| プッシュ失敗 | force pushが必要か確認する | diff --git a/.claude/skills/resolve-pr/scripts/get-unresolved-threads.sh b/.claude/skills/resolve-pr/scripts/get-unresolved-threads.sh new file mode 100755 index 0000000..4491ef2 --- /dev/null +++ b/.claude/skills/resolve-pr/scripts/get-unresolved-threads.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# get-unresolved-threads.sh +# Fetch unresolved PR review threads via GraphQL +# Usage: ./get-unresolved-threads.sh + +set -e + +OWNER="$1" +REPO="$2" +PR_NUMBER="$3" + +if [ -z "$OWNER" ] || [ -z "$REPO" ] || [ -z "$PR_NUMBER" ]; then + echo "Usage: $0 " >&2 + exit 1 +fi + +gh api graphql -f query=' +query($owner: String!, $repo: String!, $number: Int!) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $number) { + id + url + reviewThreads(first: 100) { + nodes { + id + isResolved + path + line + comments(first: 10) { + nodes { + id + databaseId + body + author { login } + } + } + } + } + } + } +}' -F owner="$OWNER" -F repo="$REPO" -F number="$PR_NUMBER" | jq ' + .data.repository.pullRequest.reviewThreads.nodes + | map(select(.isResolved == false)) + | map({ + threadId: .id, + path: .path, + line: .line, + comments: .comments.nodes | map({ + id: .id, + databaseId: .databaseId, + body: .body, + author: .author.login + }) + }) +' diff --git a/.claude/skills/work/SKILL.md b/.claude/skills/work/SKILL.md new file mode 100644 index 0000000..cf00081 --- /dev/null +++ b/.claude/skills/work/SKILL.md @@ -0,0 +1,108 @@ +--- +name: work +description: Start, resume, pause, or complete long-running tasks using work management files. Use with "/work" command, or when user says "作業開始", "作業再開", "作業中断", or "作業完了". +argument-hint: [work-file-name] +disable-model-invocation: true +allowed-tools: Read, Write, Edit, Bash, AskUserQuestion +--- + +# 作業管理(Work Management) + +`.work/`ディレクトリの作業管理ファイルを使って、長期タスクや複数セッションにまたがる作業を管理します。 + +## 用語 + +- **作業(Work)**: workスキルで管理する単位(.work/*.mdファイル1つ) +- **タスク(Task)**: 作業内の個別チェックリスト項目 + +詳細は [terminology.md](terminology.md) を参照してください。 + +## 使用タイミング + +1. **作業開始** - 新しい作業を開始する +2. **作業再開** - 既存の作業を再開する +3. **作業中断** - 作業を一時停止し、成果を保護する(Git commit & push) +4. **作業完了** - 作業を終了する(完了確認 & Git commit & push) + +## 実行フロー + +### 1. 準備 + +**引数が指定されている場合**(`$ARGUMENTS`が空でない): +- 引数をファイルパスとして解釈 +- Readツールでそのファイルを読み込み、作業再開処理へ + +**引数がない場合**: +- `.work/`ディレクトリを確認し、既存の作業ファイル(`*.md`)を検索 +- 次のステップ「作業選択」へ + +### 2. 作業選択 + +AskUserQuestionツールで以下の選択肢を提示: +- 作業開始 +- 作業再開 +- 作業中断 +- 作業完了 + +### 3. 選択に応じた処理 + +各処理の詳細は [workflows.md](workflows.md) を参照: + +- **作業開始**: template.md使用 → ファイル作成 → **ユーザー承認** → ブランチ作成 +- **作業再開**: ファイル選択 → ステータス確認 → 次のタスク確認 +- **作業中断**: ヒアリング → ファイル更新 → Git commit & push +- **作業完了**: チェックリスト確認 → **PR作成・レビュー・マージ** → ブランチ削除 → ファイル更新 + +## 重要な原則 + +### ユーザー承認 + +**作業開始時は必ずユーザー承認を得てください:** +1. 作業ファイル作成後、Readツールで内容を読み込む +2. ファイル内容をユーザーに提示 +3. 「この内容で作業を開始してよろしいですか?」と口頭確認 +4. 承認が得られてから作業ブランチを作成 +5. 修正が必要な場合は、修正後に再度承認を得る + +### ステータスセクション優先 + +作業再開時は必ず**「ステータス」セクション**を確認してください。ここに全ての現在状況が集約されています: +- 最終更新日時・進捗率・フェーズ +- 作業中ファイル +- 課題・懸念事項 + +### チェックリスト駆動 + +作業計画のチェックリストに記載されているタスクを優先して実行してください。 + +**固定チェックリスト:** +- 全作業に共通する固定チェックリストが定義されています +- **作業開始時**: ファイル作成 → 承認 → ブランチ作成 +- **作業完了時**: PR作成 → レビュー対応 → マージ → ブランチ削除 +- 個別タスクはこれらの間に配置されます + +### Git保護 + +作業中断・完了時は必ずGit commit & pushを実行し、成果を保護してください: +- **作業中断**: 未完了の変更も含めてコミット(WIP: Work In Progress) +- **作業完了**: コミット漏れがないか必ず確認 + +### 進捗記録 + +作業ログに主要な決定と変更を記録してください。次回再開時や引き継ぎに必要です。 + +## 作業ファイル規則 + +| 項目 | 内容 | +|:-----|:-----| +| **配置** | `.work/` | +| **命名** | `YYYY-MM-DD_作業名.md` | +| **日付** | 作業開始日(更新日ではない) | +| **Git管理** | 対象内(履歴追跡のため) | +| **並行作業** | 複数ファイルで並行管理可能 | + +## Supporting Files + +- [terminology.md](terminology.md) - 用語定義と使い分け +- [workflows.md](workflows.md) - 各処理の詳細手順 +- [template.md](template.md) - 作業ファイルのテンプレート diff --git a/.claude/skills/work/template.md b/.claude/skills/work/template.md new file mode 100644 index 0000000..929606b --- /dev/null +++ b/.claude/skills/work/template.md @@ -0,0 +1,59 @@ +# [作業名] 作業管理 + +## ステータス + +⏰ **最終更新**: YYYY-MM-DD HH:MM + +🎯 **進捗率**: XX% + +📍 **フェーズ**: [調査中/設計中/実装中/テスト中/レビュー待ち/完了] + +📂 **作業中ファイル**: +- `path/to/file1.ext` +- `path/to/file2.ext` + +⚠️ **課題・懸念事項**: +- [課題1] +- [懸念事項1] + +--- + +## 基本情報 +- **開始日時**: YYYY-MM-DD HH:MM +- **作業者**: [名前 または 自動] +- **関連Issue/PR**: [該当する場合] + +## 作業指示 +[作業の目的と背景] + +## 作業計画(チェックリスト) + +### 作業開始時 +- [ ] 作業内容のヒアリングと作業ファイル作成 +- [ ] 作業ファイルの承認 +- [ ] 作業ブランチの作成 + +### [個別タスク名を記入] +- [ ] タスク1 +- [ ] タスク2 + +### 作業完了時 +- [ ] PR作成とレビュー依頼 +- [ ] PRレビュー対応(resolve-prスキル使用) +- [ ] ユーザーのPR承認確認 +- [ ] PRマージ +- [ ] 作業ブランチの削除 + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| YYYY-MM-DD | [決定内容] | [理由] | + +## 作業ログ +### YYYY-MM-DD HH:MM +- [実施した作業内容] +- [発見した問題] +- [次回への引き継ぎ事項] + +## 備考 +[その他のメモや参考情報] diff --git a/.claude/skills/work/terminology.md b/.claude/skills/work/terminology.md new file mode 100644 index 0000000..5f92ac0 --- /dev/null +++ b/.claude/skills/work/terminology.md @@ -0,0 +1,259 @@ +# 用語定義 + +workスキルで使用する用語の定義と使い分けを説明します。 + +## 基本用語 + +### 作業(Work) + +workスキルで管理する単位。`.work/YYYY-MM-DD_作業名.md`ファイル1つが1つの作業を表します。 + +**特徴:** +- 長期にわたる可能性がある(数日〜数週間) +- 複数のセッションにまたがる +- 複数のタスクで構成される +- Git管理対象(履歴追跡のため) + +**例:** +- 新機能の実装 +- バグ修正 +- リファクタリング +- 調査・検証作業 + +### タスク(Task) + +作業内の個別チェックリスト項目。作業を構成する具体的なステップです。 + +**特徴:** +- 1つの作業に複数のタスクが含まれる +- チェックボックスで管理 +- 完了/未完了が明確 + +**例:** +```markdown +## 作業計画(チェックリスト) + +### 調査フェーズ +- [x] 既存コードの調査 +- [x] 問題点の洗い出し +- [ ] 解決方法の検討 + +### 実装フェーズ +- [ ] 機能Aの実装 +- [ ] 機能Bの実装 +- [ ] テストコード作成 +``` + +## 作業の状態 + +### フェーズ + +作業の進行段階を示します。 + +| フェーズ | 意味 | 進捗率目安 | +|:---------|:-----|:-----------| +| 調査中 | 情報収集・分析 | 0-20% | +| 設計中 | 設計・計画立案 | 20-40% | +| 実装中 | コーディング | 40-80% | +| テスト中 | テスト・検証 | 80-95% | +| レビュー待ち | レビュー依頼中 | 95-99% | +| 完了 | すべて完了 | 100% | + +### 進捗率 + +作業全体の完了度をパーセンテージで示します。 + +**計算方法:** +``` +進捗率 = (完了タスク数 / 全タスク数) × 100 +``` + +**注意点:** +- タスクの重みは考慮しない(簡易計算) +- 主観的な評価も許容(厳密でなくてOK) +- 作業中断・完了時に更新 + +## 作業のライフサイクル + +``` +作業開始 → 作業実行 → 作業中断(任意) → 作業再開(任意) → 作業完了 + ↓ ↓ ↓ ↓ ↓ +ファイル作成 (手動更新) 保護コミット 状況確認 最終コミット +ブランチ作成 プッシュ 再開 プッシュ +``` + +### 作業開始(Start) + +新しい作業を開始するタイミング。 + +**処理内容:** +1. 作業内容のヒアリング +2. 作業管理ファイル作成 +3. **ユーザー承認**(ファイル内容表示→口頭確認→必要なら修正→再承認) +4. Gitブランチ作成 + +**固定チェックリスト:** +- [ ] 作業内容のヒアリングと作業ファイル作成 +- [ ] 作業ファイルの承認 +- [ ] 作業ブランチの作成 + +### 作業再開(Resume) + +既存の作業を再開するタイミング。 + +**処理内容:** +- 作業ファイル選択 +- ステータス確認 +- 次のタスク確認 + +### 作業中断(Suspend/Pause) + +作業を一時停止し、成果を保護するタイミング。 + +**目的:** +- workスキルが動いていない間の成果を失わないようにする +- 未完了の変更もコミット・プッシュして保護 + +**処理内容:** +- 現在の状況ヒアリング +- ファイル更新 +- Git commit & push + +**使用場面:** +- 長時間作業を中断する前 +- 他の作業に切り替える前 +- 作業終了時(完了でない場合) + +### 作業完了(Complete) + +作業を終了するタイミング。 + +**処理内容:** +1. チェックリスト完了確認 +2. PR作成とレビュー依頼 +3. PRレビュー対応(resolve-prスキル使用) +4. ユーザーのPR承認確認 +5. PRマージ +6. 作業ブランチの削除(ローカル・リモート) +7. ファイル更新(進捗100%、フェーズ完了) +8. Git commit & push + +**固定チェックリスト:** +- [ ] PR作成とレビュー依頼 +- [ ] PRレビュー対応(resolve-prスキル使用) +- [ ] ユーザーのPR承認確認 +- [ ] PRマージ +- [ ] 作業ブランチの削除 + +**完了条件:** +- 基本的にすべてのタスクが完了している +- 未完了タスクがある場合は理由を記録 +- PRがマージされている +- 作業ブランチが削除されている + +## 作業ファイルの構造 + +### ステータスセクション + +作業の現在状況を一目で確認できるセクション。**最も重要**。 + +```markdown +## ステータス + +⏰ **最終更新**: 2026-01-22 15:00 + +🎯 **進捗率**: 70% + +📍 **フェーズ**: 実装中 + +📂 **作業中ファイル**: +- `src/api/user.ts` +- `tests/api/user.test.ts` + +⚠️ **課題・懸念事項**: +- API仕様が未確定 +- パフォーマンステストが必要 +``` + +### チェックリスト + +タスクの一覧と進捗を管理。 + +```markdown +## 作業計画(チェックリスト) + +### 1. 調査フェーズ +- [x] 既存実装の確認 +- [x] 問題点の洗い出し + +### 2. 実装フェーズ +- [ ] API実装 +- [ ] テスト作成 +``` + +### 作業ログ + +重要な決定や変更を時系列で記録。 + +```markdown +## 作業ログ + +### 2026-01-22 14:00 - 実装開始 +- API設計を完了 +- user.tsの実装開始 + +### 2026-01-22 15:30 - 方針変更 +- REST APIからGraphQLに変更 +- 理由: クライアント要件の変更 +``` + +## 命名規則 + +### 作業ファイル名 + +``` +YYYY-MM-DD_作業名.md +``` + +**例:** +- `2026-01-22_user-api-implementation.md` +- `2026-01-22_fix-login-bug.md` +- `2026-01-22_refactor-database-layer.md` + +**注意点:** +- 日付は作業開始日(更新日ではない) +- 作業名は英語推奨(日本語も可) +- スペースはハイフンに置き換え +- 簡潔で内容がわかる名前に + +### ブランチ名 + +``` +feature/作業名 +``` + +**例:** +- `feature/user-api-implementation` +- `feature/fix-login-bug` +- `feature/refactor-database-layer` + +**注意点:** +- 作業ファイル名と対応させる +- `feature/`, `fix/`, `refactor/`などのプレフィックスを使用 + +## 並行作業 + +複数の作業を並行して管理できます。 + +**例:** +``` +.work/ +├── 2026-01-20_feature-a.md (進捗80%, 実装中) +├── 2026-01-21_bugfix-b.md (進捗100%, 完了) +└── 2026-01-22_refactor-c.md (進捗30%, 調査中) +``` + +**運用のコツ:** +- アクティブな作業は2-3個まで推奨 +- 完了した作業ファイルもGit履歴として保持 +- 作業中断を活用して、切り替え時に成果を保護 diff --git a/.claude/skills/work/workflows.md b/.claude/skills/work/workflows.md new file mode 100644 index 0000000..66021e1 --- /dev/null +++ b/.claude/skills/work/workflows.md @@ -0,0 +1,710 @@ +# 詳細ワークフロー + +workスキルの各処理の詳細な手順を説明します。 + +## 1. 作業管理ディレクトリの確認と初期化 + +最初に実行する準備処理です。 + +**手順:** +1. `.work/`ディレクトリの存在を確認 +2. 存在しない場合は作成 +3. 既存の作業ファイル(`*.md`)を検索 +4. 更新日時順にソート + +**使用コマンド例:** +```bash +# ディレクトリ確認 +ls -la .work/ + +# 既存ファイル一覧(更新日時順) +ls -lt .work/*.md +``` + +--- + +## 2. 初期選択肢の提示 + +ユーザーに作業の種類を選択してもらいます。 + +**手順:** +1. AskUserQuestionツールを使用 +2. 以下の4つの選択肢を提示: + - **作業開始** - 新しい作業を開始する + - **作業再開** - 既存の作業を再開する + - **作業中断** - 作業を一時停止し、成果を保護する + - **作業完了** - 作業を終了する + +**選択に応じた処理:** +- **作業開始** → セクション「3. 作業開始時の処理」へ +- **作業再開** → セクション「4. 作業再開時の処理」へ +- **作業中断** → セクション「5. 作業中断時の処理」へ +- **作業完了** → セクション「6. 作業完了時の処理」へ + +--- + +## 3. 作業開始時の処理 + +新規作業を開始する際の処理です。 + +### ステップ1: テンプレート読み込み + +Readツールで`.claude/skills/work/template.md`を読み込みます。 + +### ステップ2: 作業内容のヒアリング + +ユーザーに以下を確認: +- 作業名(ファイル名に使用) +- 作業の目的と背景 +- 関連Issue/PR(あれば) +- 初期タスク(チェックリスト) + +### ステップ3: ファイル作成 + +テンプレートの以下の項目を埋めて、`.work/YYYY-MM-DD_作業名.md`ファイルを作成: + +- **ステータス**: + - 最終更新: 現在日時 + - 進捗率: 0% + - フェーズ: 調査中(または適切なフェーズ) + - 作業中ファイル: (空欄) + - 課題・懸念事項: (空欄) +- **基本情報**: + - 開始日時: 現在日時 + - 作業者: Claude + - 関連Issue/PR: ヒアリング結果 +- **作業指示**: + - ヒアリングした目的と背景 +- **作業計画**: + - 具体的なチェックリスト + +### ステップ4: ユーザー承認 + +作成したファイルの内容をユーザーに提示し、承認を得ます。 + +**詳細手順:** +1. Readツールで作成したファイルを読み込む +2. ファイル内容をユーザーに提示(マークダウン形式で表示) +3. 「この内容で作業を開始してよろしいですか?」と口頭で確認 +4. **承認が得られた場合**: 次のステップ(ブランチ作成)へ +5. **修正が必要な場合**: + - ユーザーから修正指示を受ける + - Editツールでファイルを修正 + - 手順1に戻る(再度確認) + +**重要**: 承認を得るまで作業ブランチを作成しないこと。 + +### ステップ5: ブランチ作成 + +承認後、ブランチ名を提案(例: `feature/作業名`)し、以下を実行: + +```bash +git checkout -b feature/作業名 +``` + +### ステップ6: 作業開始確認 + +最初のタスクの実行可否を確認し、作業を開始します。 + +--- + +## 4. 作業再開時の処理 + +既存の作業を再開する際の処理です。 + +### ステップ1: ファイル選択 + +**既存ファイルがある場合:** +1. 最新3件をリストアップ +2. 以下の選択肢を提示: + - 最新ファイルで再開(推奨) + - リストから選択 + - 手動パス指定 + +**既存ファイルがない場合:** +- 「作業ファイルが見つかりません」と通知 +- 新規作成(作業開始)を提案 + +### ステップ2: ファイル読み込み + +指定されたファイルをReadツールで読み込みます。 + +### ステップ3: ステータス確認 + +**「ステータス」セクション**を確認(ここに全ての現在状況が集約されている): +- 最終更新日時 +- 進捗率 +- 現在のフェーズ +- 作業計画チェックリスト +- 作業中ファイル +- 課題・懸念事項 + +### ステップ4: 状況報告 + +ユーザーに以下を報告: + +``` +📋 作業: [ファイル名から推測] +📍 ステータス: [フェーズ] (進捗: XX%) | 最終更新: [日時] + +📂 作業中: [ファイル一覧] +⚠️ 注意事項: [課題があれば] + +チェックリストから次のタスクを確認してください +``` + +### ステップ5: 次のタスク確認 + +次のタスクの実行可否を確認し、作業を再開します。 + +--- + +## 5. 作業中断時の処理 + +作業を一時停止し、成果を保護する処理です。 + +### 目的 + +workスキルが動いていない間の成果を保護します。未完了の変更も含めてコミット・プッシュすることで、作業内容を失わないようにします。 + +### ステップ1: ファイル選択 + +既存の作業ファイルから中断する作業を選択: +- 最新3件をリストアップ +- 選択肢を提示 + +### ステップ2: ファイル読み込み + +選択したファイルをReadツールで読み込みます。 + +### ステップ3: 現在の状況ヒアリング + +ユーザーに以下を確認: +- **進捗率**: 現在何%完了しているか +- **作業中のファイル**: 変更したファイルのリスト +- **課題・懸念事項**: 現在抱えている問題 +- **次回再開時に必要な情報**: 引き継ぎ事項 + +### ステップ4: ファイル更新 + +作業管理ファイルのステータスを更新: +- ⏰ **最終更新**: 現在日時に更新 +- 🎯 **進捗率**: ヒアリング結果に更新 +- 📍 **フェーズ**: 必要に応じて更新 +- 📂 **作業中ファイル**: ヒアリング結果に更新 +- ⚠️ **課題・懸念事項**: ヒアリング結果に更新 + +### ステップ5: 作業ログ記録 + +作業ログに中断時の状況を記録: + +```markdown +### YYYY-MM-DD HH:MM - 作業中断 +- 進捗: XX% +- 完了: [完了した内容] +- 未完了: [残りの作業] +- 次回: [次回実施すべきこと] +``` + +### ステップ6: Git状態確認 + +```bash +git status +``` + +変更ファイルがあるかを確認します。 + +### ステップ7: コミット + +変更があれば、コミットメッセージを提案してコミット: + +**コミットメッセージ例:** +``` +作業中断: 進捗70% - API実装途中 + +- UserAPIのGET/POST実装完了 +- PUT/DELETE未実装 +- テストコード未作成 + +WIP: Work In Progress + +Co-Authored-By: Claude +``` + +**コマンド:** +```bash +git add -A +git commit -m "作業中断メッセージ" +``` + +### ステップ8: プッシュ + +```bash +git push +``` + +リモートに保護します。 + +### ステップ9: 中断完了報告 + +中断完了をユーザーに報告します。 + +### 注意事項 + +- コミットメッセージには進捗状況を含める +- 未完了の変更も含めてコミット(WIP: Work In Progressとして記録) +- プッシュは必須(ローカルのみでは保護不十分) + +--- + +## 6. 作業完了時の処理 + +作業を終了し、PR作成からマージ、ブランチ削除までを実行する処理です。 + +### 目的 + +- 作業を正式に完了させる +- PRを作成し、レビューを受け、マージする +- すべての変更がコミット・プッシュされていることを確認 +- 作業ブランチを削除し、クリーンアップする +- 未完了タスクや残課題を記録 + +### ステップ1: ファイル選択 + +既存の作業ファイルから完了する作業を選択: +- 最新3件をリストアップ +- 選択肢を提示 + +### ステップ2: ファイル読み込み + +選択したファイルをReadツールで読み込みます。 + +### ステップ3: チェックリスト完了確認 + +チェックリストの完了状況を確認: +- すべてのタスクが完了しているか +- 未完了タスクがあればユーザーに通知 +- 理由と今後の対応を確認 + +### ステップ4: ファイル更新 + +作業管理ファイルのステータスを更新: +- ⏰ **最終更新**: 現在日時に更新 +- 🎯 **進捗率**: 100%に更新 +- 📍 **フェーズ**: 「完了」に更新 +- ⚠️ **課題・懸念事項**: 残課題があれば記録 + +### ステップ5: 作業ログ記録 + +作業ログに完了記録を追加: + +```markdown +### YYYY-MM-DD HH:MM - 作業完了 +- 全タスク完了 +- 成果物: [主要な成果物] +- 残課題: [あれば記載] +``` + +### ステップ6: Git状態確認 + +```bash +git status +``` + +コミット漏れがないかを確認します。 + +### ステップ7: コミット漏れ対応 + +変更がある場合: +1. ユーザーに通知 +2. コミットすべき内容かを確認 +3. コミットメッセージを提案してコミット + +**コミットメッセージ例:** +``` +作業完了: UserAPI実装完了 + +- GET/POST/PUT/DELETE実装 +- テストコード作成 +- ドキュメント更新 + +Co-Authored-By: Claude +``` + +### ステップ8: プッシュ + +```bash +git push +``` + +リモートに最終状態を保護します。 + +### ステップ9: PR作成 + +詳細は「7. PR作成とマージ」セクションを参照。 + +**概要:** +1. 変更内容を最終確認 +2. `gh pr create`でPRを作成 +3. PR URLをユーザーに通知 + +### ステップ10: PRレビュー対応 + +**resolve-prスキルを使用:** +``` +/resolve-pr [PR番号] +``` + +resolve-prスキルは以下を自動実行します: +- PRのunresolvedなレビューコメントを取得 +- 指摘に対応するコード修正を実施 +- 修正内容をコミット +- コメントにリプライ(コミットリンク付き) + +**繰り返し条件:** +- ユーザーのPR承認が得られるまで繰り返す +- 新しいレビューコメントがある場合は再度実行 + +### ステップ11: ユーザーのPR承認確認 + +ユーザーに以下を確認: +- 「PRが承認されましたか?」 +- 承認されていない場合はステップ10に戻る +- 承認された場合は次へ + +### ステップ12: PRマージ + +詳細は「7. PR作成とマージ」セクションを参照。 + +**概要:** +1. マージ方法を確認(merge/squash/rebase) +2. `gh pr merge`でマージを実行 +3. マージ完了を確認 + +### ステップ13: 作業ブランチの削除 + +**ローカルブランチ削除:** +```bash +git checkout main # または適切なデフォルトブランチ +git branch -d branch-name +``` + +**リモートブランチ削除:** +```bash +git push origin --delete branch-name +``` + +削除完了をユーザーに通知します。 + +### ステップ14: 作業完了報告 + +作業完了をユーザーに報告します。 + +**報告内容:** +- チェックリストの完了状況 +- PRマージ完了 +- ブランチ削除完了 +- 作業ファイルのステータス(進捗100%、フェーズ「完了」) + +### 注意事項 + +- 未完了タスクがある場合は、理由と今後の対応を記録 +- 残課題がある場合は明記し、引き継ぎ情報を記載 +- コミット漏れは作業完了の妨げにならないが、必ず確認する +- 作業完了後も作業ファイルは削除せず、Git履歴として保持 +- PRマージ前に必ずユーザーの承認を確認すること +- ブランチ削除は必須(古いブランチを残さない) + +--- + +## Git操作のベストプラクティス + +### コミットメッセージの形式 + +**基本形式:** +``` +[作業中断|作業完了]: タイトル + +- 箇条書きで詳細 +- 変更内容を明記 +- 理由や背景も記載 + +[WIP/残課題があれば記載] + +Co-Authored-By: Claude +``` + +### 変更ファイルの確認 + +```bash +# 状態確認 +git status + +# 差分確認 +git diff + +# ステージング状態確認 +git diff --cached +``` + +### コミット前のチェックリスト + +- [ ] 変更内容が意図通りか確認 +- [ ] コミットメッセージが明確か +- [ ] 機密情報が含まれていないか +- [ ] 作業管理ファイルが最新化されているか + +### プッシュ前のチェックリスト + +- [ ] コミットが完了しているか +- [ ] リモートブランチ名が正しいか +- [ ] force pushは避ける(必要な場合のみ) + +--- + +## トラブルシューティング + +### ケース1: ファイルが見つからない + +**症状:** +- 作業ファイルが存在しない +- `.work/`ディレクトリがない + +**対処:** +1. `.work/`ディレクトリを作成 +2. 新規作業(作業開始)を提案 + +### ケース2: Gitコンフリクト + +**症状:** +- `git push`がrejectされる +- コンフリクトが発生 + +**対処:** +1. ユーザーに状況を説明 +2. `git pull --rebase`を提案 +3. コンフリクト解決をサポート +4. 再度プッシュ + +### ケース3: 複数ブランチで作業中 + +**症状:** +- 異なるブランチで複数の作業が並行している + +**対処:** +1. 現在のブランチを確認: `git branch` +2. 作業ファイルとブランチの対応を確認 +3. 必要に応じてブランチ切り替え: `git checkout branch-name` +4. 作業中断を実施してからブランチ切り替えを推奨 + +### ケース4: 作業ファイルとブランチの不一致 + +**症状:** +- 作業ファイル名とブランチ名が一致しない + +**対処:** +1. ユーザーに状況を確認 +2. どちらが正しいかを判断 +3. 必要に応じて作業ファイル名またはブランチ名を修正 + +--- + +## 7. PR作成とマージ + +作業完了時にPRを作成し、レビューを経てマージする手順です。 + +### 前提条件 + +- 作業ブランチで作業が完了している +- すべての変更がコミット・プッシュされている +- 作業ファイルのチェックリストが完了している + +### ステップ1: 変更内容の最終確認 + +PRを作成する前に、以下を確認: + +```bash +# 現在のブランチ確認 +git branch --show-current + +# 変更ファイル一覧 +git diff --name-only main...HEAD + +# コミット履歴 +git log main..HEAD --oneline +``` + +### ステップ2: PR作成 + +`gh pr create`コマンドでPRを作成します。 + +**基本コマンド:** +```bash +gh pr create --title "PRタイトル" --body "$(cat <<'EOF' +## Summary +<1-3 bullet points> + +## Test plan +[Bulleted markdown checklist of TODOs for testing the pull request...] + +🤖 Generated with [Claude Code](https://claude.com/claude-code) +EOF +)" +``` + +**PRタイトルのガイドライン:** +- 70文字以内 +- 変更内容を簡潔に表現 +- 例: "workスキル: 承認フローと固定チェックリストを追加" + +**PR本文のガイドライン:** +- **Summary**: 変更内容を1-3つの箇条書きで要約 +- **Test plan**: テスト手順をチェックリスト形式で記載 +- 作業ファイルの内容を参考に作成 + +### ステップ3: PR URL通知 + +作成されたPR URLをユーザーに通知します。 + +``` +✅ PRを作成しました: https://github.com/owner/repo/pull/123 +``` + +### ステップ4: PRレビュー対応(resolve-prスキル使用) + +**resolve-prスキルを実行:** +``` +/resolve-pr 123 +``` + +resolve-prスキルは以下を自動実行: +1. PRのunresolvedなレビューコメントを取得 +2. 指摘内容を理解し、コード修正を実施 +3. 修正内容をコミット(Co-Authored-By付き) +4. レビューコメントにリプライ(コミットリンク付き) + +**繰り返し条件:** +- ユーザーのPR承認が得られるまで繰り返す +- 新しいレビューコメントがある場合は再度実行 + +### ステップ5: ユーザーのPR承認確認 + +ユーザーに確認: +- 「PRが承認されましたか?」 +- 承認されていない場合はステップ4に戻る +- 承認された場合は次へ + +### ステップ6: マージ方法の確認 + +ユーザーにマージ方法を確認: + +**選択肢:** +1. **merge** - 通常のマージコミット(デフォルト) +2. **squash** - すべてのコミットを1つにまとめる +3. **rebase** - コミット履歴を線形に保つ + +**推奨:** +- 小さな変更や単一機能: **squash** 推奨 +- 複数の論理的なコミット: **merge** 推奨 +- チームのルールに従う + +### ステップ7: PRマージ実行 + +```bash +# merge方式 +gh pr merge 123 --merge + +# squash方式 +gh pr merge 123 --squash + +# rebase方式 +gh pr merge 123 --rebase +``` + +### ステップ8: マージ確認 + +マージが成功したことを確認: + +```bash +# PRステータス確認 +gh pr view 123 + +# マージ先ブランチを更新 +git checkout main +git pull +``` + +### ステップ9: 作業ブランチの削除 + +マージ後、作業ブランチを削除します。 + +**ローカルブランチ削除:** +```bash +git checkout main +git branch -d branch-name +``` + +**リモートブランチ削除:** +```bash +git push origin --delete branch-name +``` + +**注意:** +- `-d`オプションは安全削除(マージ済みの場合のみ削除) +- マージされていない場合は警告が表示される +- 強制削除が必要な場合は`-D`オプションを使用(ユーザー確認必須) + +### PR作成とマージのチェックリスト + +- [ ] 変更内容を最終確認(git diff、git log) +- [ ] PRタイトルとSummaryを作成 +- [ ] `gh pr create`でPRを作成 +- [ ] PR URLをユーザーに通知 +- [ ] resolve-prスキルでレビュー対応 +- [ ] ユーザーのPR承認を確認 +- [ ] マージ方法を確認(merge/squash/rebase) +- [ ] `gh pr merge`でマージ実行 +- [ ] マージ完了を確認 +- [ ] ローカルブランチを削除 +- [ ] リモートブランチを削除 + +### トラブルシューティング + +#### ケース1: PR作成に失敗 + +**症状:** +- `gh pr create`がエラーになる + +**対処:** +1. GitHubにログインしているか確認: `gh auth status` +2. リモートブランチにプッシュされているか確認: `git push` +3. ベースブランチが正しいか確認 + +#### ケース2: マージがコンフリクト + +**症状:** +- マージ時にコンフリクトが発生 + +**対処:** +1. ユーザーに状況を説明 +2. ローカルでコンフリクト解決を提案: + ```bash + git checkout feature-branch + git pull origin main + # コンフリクト解決 + git add . + git commit + git push + ``` +3. 再度マージを試行 + +#### ケース3: ブランチ削除に失敗 + +**症状:** +- ブランチ削除がエラーになる + +**対処:** +1. マージされているか確認: `gh pr view 123` +2. リモートブランチが存在するか確認: `git branch -r` +3. 既に削除済みの可能性を確認 +4. 必要に応じて強制削除を提案(ユーザー確認必須) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0515aff --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +setting.local.json diff --git a/.work/2026-01-21_ntf-5.0-test-basics.md b/.work/2026-01-21_ntf-5.0-test-basics.md new file mode 100644 index 0000000..90adb76 --- /dev/null +++ b/.work/2026-01-21_ntf-5.0-test-basics.md @@ -0,0 +1,187 @@ +# NTF 5.0 テストの基礎 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-22 00:00 + +🎯 **進捗率**: 100%(5.0作成完了) + +📍 **フェーズ**: 完了 - 5.0(テストの基礎)完成 + +⏭️ **次のアクション**: +- [x] 5.0の初稿作成 +- [x] 5.0の評価・改善 +- [x] 5.0の品質改善(概要・目次追加、構成改善、ログ検証追加) + +📂 **完成ファイル**: +- `context/5_test/5.0_test_basics.md` - ✅ 完了(品質改善済み) + +⚠️ **課題・懸念事項**: +- なし + +💡 **今後の方針**: +- 5.3以降は章ごとに別の作業ファイルを作成して進める + +--- + +## 作業指示 + +NTF(Nablarch Testing Framework)のコンテキスト情報を段階的に作成する。 + +### 基本方針 +- 既存コンテキスト情報の記載形式・ルールに準拠 +- AI実装支援に特化した最小限の情報を集約 +- コード例中心の構成 +- 段階的な確認とフィードバックを実施 + +### 作業ステップ +1. ✅ 既存コンテキスト情報とNablarch解説書の比較・分析 +2. ✅ NTFコンテキスト情報の記載単位決定 +3. ✅ 5.0(テストの基礎)の作成・評価・改善・品質改善 +4. ✅ 完了(5.3以降は章ごとに別の作業ファイルで進める) + +--- + +## 作業計画(チェックリスト) + +### 前提知識(0番目) + +- [x] **5.0 テストの基礎** `5.0_test_basics.md` + - [x] 初稿作成 + - [x] 評価・改善(セクション統合、Excel例テーブル化) + - [x] 全面再構成(01_Abstract.htmlベース) + - [x] 最終調整(特殊記法表統一、用途見直し) + - [x] リクエスト単体テスト基本形追加(testShots、グループID) + - [x] 品質改善(概要・目次追加、構成改善、ログ検証追加) + - [x] 完成 + - **順序理由**: Excel記法、データタイプ、特殊記法など、全テストタイプ共通の前提知識 + - **情報源**: `06_TestFWGuide/01_Abstract.html` + +### 今後の作業 + +5.3以降は章ごとに別の作業ファイルを作成して進める方針に変更。 + +--- + +## 作業結果 + +### ステップ1完了: 既存コンテキスト分析(2026-01-21) + +#### 記載単位 +- カテゴリ別ディレクトリ構成(1_common, 2_rest, 3_batch, 4_web) +- 機能単位のファイル分割 +- 命名規則: `{番号}_{カテゴリ}/{番号}.{数字}_{機能名}.md` + +#### 記載形式 +- H1: メインタイトル +- H2: 主要セクション +- H3: サブセクション +- コードブロック: 言語別に```java/xml/jspで記載 +- 強調: `> **重要:**`, `⚠️`, `★`, `✅`/`❌`の対比 + +#### 記載ルール +- AI実装支援に特化、説明最小限 +- コピー&ペースト可能な実装パターン提供 +- 基本実装 → 応用パターン → 制約の順 +- ユースケース別構成 +- 制約と誤用例を明示 + +#### 記載内容 +- アノテーション・API仕様 +- 典型的実装パターン +- エラーハンドリング +- 責務分離・レイヤリング +- セキュリティ・パフォーマンス考慮事項 + +### ステップ2完了: 記載単位決定(2026-01-21) + +12ファイル構成で全NTF機能をカバー(優先度A: 4ファイル、B: 3ファイル、C: 5ファイル) + +### ステップ2完了(再実施): 作業計画見直し(2026-01-21) + +**見直し内容**: +- 5.0_test_basics.md を前提ファイルとして追加 +- 5.3のレビュー・修正タスクを追加 +- 作業順序を変更:5.0 → 5.3修正 → 5.4以降 + +**見直し理由**: +- 5.3作成中にExcel記法の前提知識不足が判明 +- LIST_MAP、グループID、データタイプ等の基礎説明が必要 +- 各テストファイルでの重複を避け、保守性向上 + +### ステップ3完了: 5.0ファイル作成・評価・改善(2026-01-21) + +#### 5.0_test_basics.md 完成(2026-01-21) + +**最終内容**: +- Excelファイルの配置と命名(同名・同階層、.xls/.xlsx対応) +- シートの構造(1メソッド1シート、シート名=メソッド名) +- データタイプの基礎(基本書式、データタイプ一覧13種) +- データタイプ詳細(SETUP_TABLE、EXPECTED_TABLE等の使用例) +- データ記述の重要ルール(データタイプごとにまとめる) +- セルの書式設定(全セルを文字列に設定) +- マーカーカラム([カラム名]で読み込み対象外) +- セル内の特殊記法(null値、日付、変数記法、改行コード)- 表形式で統一 +- コメント機能(//以降は読み込み対象外) +- テストの独立性(実行順序に依存しない設計) +- よくある間違い(5パターン) + +**改善プロセス**: +1. 初稿作成(誤った理解でグループID等を記載) +2. 01_Abstract.htmlを確認し、正確な情報に基づき全面再構成 +3. 特殊記法を1つの表に統一(データタイプ一覧と同様の形式) +4. 用途を「〜したい場合」に統一し、実装者視点で明確化 +5. 冗長な使用例セクションを削除 + +**評価結果**: ★★★★★(5/5) +- 01_Abstract.htmlの内容を正確に反映 +- 実装時に必要な基礎知識を網羅 +- 表形式で一覧性が高く、既存コンテキスト形式に準拠 +- 特殊記法漏れなし(null、日付、変数記法11種、改行コード) + +**作業プロセス**: +1. 初稿作成(誤った理解でグループID等を記載) +2. 01_Abstract.htmlを確認し、正確な情報に基づき全面再構成 +3. 特殊記法を1つの表に統一(データタイプ一覧と同様の形式) +4. 用途を「〜したい場合」に統一し、実装者視点で明確化 +5. 冗長な使用例セクションを削除 +6. リクエスト単体テスト基本形追加(testShots、グループID) +7. 品質改善(概要・目次追加、構成改善、ログ検証追加) + +**最終的な内容構成**: +- 概要(NTFの説明、特徴、このファイルのスコープ) +- 目次(10項目の構成を一覧化) +- テストクラスとExcelファイルの対応 +- リクエスト単体テストのExcelシート基本形 +- データタイプの基礎 +- データタイプ詳細 +- データ記述の重要ルール +- セルの書式設定 +- セル内の特殊記法 +- その他の重要な仕様 +- よくある間違い + +--- + +## 決定事項 + +### ファイル配置 + +``` +context/ + 5_test/ + 5.0_test_basics.md ✅ 完成 +``` + +### 情報源 +- Nablarch解説書: https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/ +- 特に06_TestFWGuide/01_Abstract.html を重点的に参照 +- 既存コンテキスト: context/1_common/, 2_rest/, 3_batch/, 4_web/ + +--- + +## 備考 + +- 5.0(テストの基礎)完成 +- 今後は章ごとに別の作業ファイルで進める +- 5.0の記載形式を後続ファイルで踏襲する diff --git a/.work/2026-01-22_agent-stop-notification-hook.md b/.work/2026-01-22_agent-stop-notification-hook.md new file mode 100644 index 0000000..86acc23 --- /dev/null +++ b/.work/2026-01-22_agent-stop-notification-hook.md @@ -0,0 +1,143 @@ +# エージェント停止通知フック追加 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-22 14:25 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +⏭️ **次のアクション**: +- [x] Claude Codeのフック機能について調査 +- [x] Windows通知の実現方法をテスト(PowerShell バルーン通知で成功) +- [x] `.claude/settings.local.json`にフック設定を追加 +- [x] Claude Code再起動後の動作確認 +- [x] 通知が2回発生する問題を修正(SubagentStop削除) +- [x] 並行作業対応(プロジェクト名+ブランチ名を表示) + +📂 **完成ファイル**: +- `.claude/settings.json` - Stopフック設定完了(チーム共有用) +- `.claude/hooks/notify-stop.sh` - 通知スクリプト + +⚠️ **完了**: 全作業完了 + +--- + +## 基本情報 + +📅 **開始日時**: 2026-01-22 13:30 +👤 **作業者**: Claude +🔗 **関連Issue/PR**: なし + +--- + +## 作業指示 + +Claude Codeのエージェント(Task toolのsubagent)が停止・完了した際に、ユーザーに通知するフックを追加する。 + +### 目的 +- エージェントの作業完了をユーザーが見逃さないようにする +- 長時間実行されるエージェントの完了を確実に通知する + +### 背景 +- 現在、エージェントが停止してもユーザーへの明示的な通知がない +- プロジェクト設定(`.claude/settings.local.json`)にフックを追加することで実現する + +### スコープ +- このリポジトリのプロジェクト設定にのみ適用 +- エージェント停止時の通知フックを追加 + +--- + +## 作業計画(チェックリスト) + +### 1. 調査フェーズ +- [x] Claude Codeのフック機能の仕様を調査 + - [x] フックの種類(Stop, SubagentStop等) + - [x] 設定ファイルの構文 + - [x] 利用可能な通知方法 +- [x] Windows通知方法のテスト + - [x] msg.exe(失敗) + - [x] PowerShellバルーン通知(成功) + +### 2. 実装フェーズ +- [x] `.claude/settings.local.json`にフック設定を追加 + - [x] Stopフック定義(メインエージェント完了時) + - [x] SubagentStopフック定義(サブエージェント完了時) + - [x] PowerShell通知コマンドの設定 +- [x] 設定ファイルのバリデーション(JSON構文チェック通過) + +### 3. 検証フェーズ +- [x] Claude Code再起動 +- [x] Stopフックの動作確認(メインエージェント応答完了時) +- [x] 2回通知問題の修正(SubagentStop削除) + +--- + +## 作業ログ + +### 2026-01-22 13:30 - 作業開始 +- 作業ファイル作成 +- 次のステップ: Claude Codeのフック機能調査 + +### 2026-01-22 13:45 - フック機能調査完了 +- claude-code-guideエージェントでフック機能を調査 +- `SubagentStop`フックがTaskツール完了時に発火することを確認 +- `Stop`フックがメインエージェント応答完了時に発火することを確認 + +### 2026-01-22 13:50 - Windows通知方法のテスト +- `msg.exe` → 失敗(ライセンスエラー) +- PowerShellバルーン通知 → 成功! +- WSL + DevContainer環境から`powershell.exe`経由で通知可能を確認 + +### 2026-01-22 14:00 - 設定ファイルへの追加完了 +- `.claude/settings.local.json`に以下を追加: + - `Stop`フック: 「応答が完了しました」 + - `SubagentStop`フック: 「エージェントが作業を完了しました」 +- 次のステップ: Claude Code再起動後の動作確認 + +### 2026-01-22 14:10 - 動作確認完了&調整 +- Claude Code再起動後、通知が正常に動作することを確認 +- `/work`スキル終了時に2回通知が発生する問題を発見 + - 原因: StopとSubagentStopの両方が発火 + - 対応: SubagentStopフックを削除し、Stopフックのみに変更 + +### 2026-01-22 14:15 - チーム共有対応 +- `.claude/settings.json`を新規作成(hooksセクションのみ) +- チーム全員がStopフック通知を利用可能に + +### 2026-01-22 14:25 - 並行作業対応の実装 +- 通知メッセージにプロジェクト名とブランチ名を追加 +- `.claude/hooks/notify-stop.sh`スクリプトを作成 + - タイトル: `Claude Code - プロジェクト名` + - メッセージ: `ブランチ名: Ready!` +- 並行作業時にどのプロジェクトが完了したか識別可能に +- 作業完了 + +--- + +## 決定事項 + +### フック種別 +- **`Stop`フックのみ**に通知を設定 + - 当初は`SubagentStop`も含めていたが、2回通知が発生する問題が発生 + - 最終的に`Stop`フックのみで十分と判断 + +### 通知方法 +- **PowerShellのバルーン通知**を採用 + - WSL + DevContainer環境から動作確認済み + - `System.Windows.Forms.NotifyIcon`を使用 + - タイムアウト: 10秒 + +### 通知メッセージ +- タイトル: `Claude Code - プロジェクト名` +- メッセージ: `ブランチ名: Ready!` +- プロジェクト名とブランチ名を含めることで、並行作業時にどのプロジェクトが完了したか識別可能 + +--- + +## 備考 + +- 現在の`.claude/settings.local.json`には`permissions`セクションのみ存在 +- フック設定を追加する必要がある diff --git a/.work/2026-01-22_file-test-context.md b/.work/2026-01-22_file-test-context.md new file mode 100644 index 0000000..aa8ef7d --- /dev/null +++ b/.work/2026-01-22_file-test-context.md @@ -0,0 +1,243 @@ +# 5.8 ファイル処理テストコンテキスト作成 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-26 12:03 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: ✅ 完了 + +📂 **成果物**: +- `context/5_test/5.8_file_test.md` - ファイル処理テストの完全ガイド +- `.claude/skills/resolve-pr/` - PRレビュー対応自動化スキル + +⚠️ **課題・懸念事項**: +- なし + +✅ **完了事項**: +- ファイル処理テストコンテキスト作成(5.8_file_test.md) +- 10回のPRレビュー対応を経て内容を精緻化 +- resolve-prスキル開発とPR対応での実証 +- 全チェックリスト項目の完了 + +--- + +## 基本情報 +- **開始日時**: 2026-01-22 16:57 +- **作業者**: Claude Code +- **関連Issue/PR**: PR #4 (https://github.com/kiyotis/nablarch-tools-for-ai/pull/4) + +## 作業指示 +Nablarch Testing Framework 5.8のファイル処理テストに関するコンテキスト情報を作成する。 + +**背景**: +- 既存のテストコンテキスト(5.0_test_basics.md)にファイルテストの基本情報はあるが、詳細情報が不足 +- バッチ処理のファイル入出力パターン(3.5、3.7)との統合が必要 +- SETUP_FIXED/EXPECTED_FIXED、SETUP_VARIABLE/EXPECTED_VARIABLEの使い方を詳細に説明 + +**目標**: +- ファイル処理テストの完全なガイドを作成 +- Excelシートの記述方法を具体例で説明 +- よくある間違いと対策を明示 + +## 作業計画(チェックリスト) +- [x] 既存のコンテキスト情報を確認 +- [x] ファイル処理関連のコンテキストを確認(1.6、3.5、3.7) +- [x] Nablarch解説書でファイルテスト情報を調査 +- [x] 5.8_file_test.mdを作成 +- [x] 作業管理ファイルを作成 + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-22 16:57 | 5.8のファイル番号を採用 | テストセクション(5.x)の連番として適切 | +| 2026-01-22 16:57 | 固定長と可変長の両方を1ファイルで説明 | ファイルテストは形式の違いよりも概念が重要 | +| 2026-01-22 16:57 | 実践的なサンプルを3つ含める | CSV入力、固定長出力、変換処理の典型パターンをカバー | +| 2026-01-22 17:01 | グループID詳細説明を削除し5.0参照に変更 | 基本概念は5.0で説明済み、5.8はファイル処理特有の例のみに絞る | + +## 作業ログ +### 2026-01-22 16:57 +- 既存コンテキスト情報を確認 + - 5.0_test_basics.md: テストの基礎情報を確認 + - 1.6_file_path_management.md: FilePathSettingの情報を確認 + - 3.5_input_file_patterns.md: ファイル入力の実装パターンを確認 + - 3.7_output_file_patterns.md: ファイル出力の実装パターンを確認 + +- Explore agentでNablarch解説書を調査 + - 参照元URL(LATEST版): + - データタイプ一覧: https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/01_Abstract.html + - バッチ処理単体テスト: https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/05_UnitTestGuide/02_RequestUnitTest/batch.html + - Tips(グループID詳細): https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/03_Tips.html + - SETUP_FIXED/EXPECTED_FIXEDの詳細 + - SETUP_VARIABLE/EXPECTED_VARIABLEの詳細 + - グループIDによる紐付け方法 + - FilePathSettingとの連携方法 + - テストケースのサンプル + +- 5.8_file_test.mdを作成 + - 固定長ファイルのテスト(SETUP_FIXED/EXPECTED_FIXED) + - 可変長ファイルのテスト(SETUP_VARIABLE/EXPECTED_VARIABLE) + - グループIDによる紐付け(複数ファイル・テーブルの統合) + - ファイルパス指定方法(相対パス、絶対パス、論理名) + - FilePathSettingとの連携(論理名を使ったファイル管理) + - Excel記述の実践(3つのサンプル) + - よくある間違い(7つのパターン) + +- 作業管理ファイルを作成 + +### 作成した成果物 +- **context/5_test/5.8_file_test.md**: ファイル処理テストの完全ガイド(約600行) + +### 2026-01-22 17:01 +- ユーザーフィードバックに基づき、グループIDセクションを簡略化 + - グループIDの詳細説明は5.0で行っているため、重複を削除 + - 5.0への参照を追加し、ファイル処理での具体例のみに絞った + - 「グループIDによる紐付け」セクションを「ファイル処理でのグループID使用」に変更 + - 約70行を約20行に簡略化(約70%削減) + +### 2026-01-22 17:24 +- PRレビューコメントに対応し、さらなる重複削除 + - 固定長ファイルのテストセクション内の「### グループIDを使った紐付け」サブセクションを削除(約29行) + - 可変長ファイルのテストセクション内の「### グループIDを使った紐付け」サブセクションを削除(約29行) + - 両セクションのポイントに5.0への参照を追加 + - 計58行削減し、5.0との重複を完全に解消 + - コミット: 7bbc70b + - PRコメントに返信完了 + +### 2026-01-22 17:31 +- 2回目のPRレビューコメントに対応し、グループIDセクションを完全削除 + - 「## ファイル処理でのグループID使用」セクション全体を削除(約27行) + - 目次から該当項目を削除 + - グループIDは5.0を読んでいる前提とし、5.8では一切触れない方針に統一 + - コミット: 41d2492 + - PRコメントに返信完了(コミットリンク付き) + +### 2026-01-23 13:30 +- 3回目のPRレビューコメントに対応(Nablarch解説書の内容に整合) + - 固定長/可変長のディレクティブ行説明とExcel記述ルールを追加 + - フォーマット定義セクションを削除(プロダクションコードの話) + - FilePathSettingセクションを削除(プロダクションコードの話) + - DataReaderセクションを削除(プロダクションコードの話) + - ファイルパス指定方法セクションを削除(相対パスのみNablarch解説書に記載) + - ファイル配置セクションを削除(出典なし) + - コミット: 8084d1f + - PRコメントに返信完了(8件) + - 2件のコメントについてユーザーに質問(Excel記述の実践セクション、よくある間違いセクション) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 14:40 +- 4回目のPRレビューコメントに対応 + - コミットリンク修正(誤ったハッシュを修正) + - よくある間違いセクションを削除(出典なし・想像で書いた内容) + - 目次を更新(削除済みセクションを目次からも削除) + - コミット: 3cc57ed + - PRコメントに返信完了(2件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:07 +- 5回目のPRレビューコメントに対応(解説書の例に整合させて簡略化) + - 実践例セクションを削除(解説書に明示的な記載がないため) + - 記述例にデータタイプ行を追加して分かりやすく + - レコード種別を「User」から「データ」に変更(解説書に合わせる) + - 固定長ファイル出力バッチの例を削除(5.3と重複) + - CSVファイル入力バッチの例を削除(解説書に明示的な記載なし) + - コミット: a1e5ac8 + - PRコメントに返信完了(4件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:12 +- 6回目のPRレビューコメントに対応(レコード種別を複数種類に変更) + - 固定長ファイルの記述例にヘッダとデータの2種類のレコード種別を含める + - 可変長ファイルの記述例にヘッダとデータの2種類のレコード種別を含める + - Nablarch解説書の例(ヘッダ、データ、トレーラ、エンド)に合わせた構造に変更 + - コミット: 592ed35 + - PRコメントに返信完了(1件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:20 +- 7回目のPRレビューコメントに対応(解説書の例に完全に合わせる) + - 固定長・可変長ファイルの記述例を解説書に完全に合わせて修正 + - ヘッダ、データ、トレーラ、エンドの4種類のレコード種別を含める + - 各レコード種別を縦方向に展開(フィールド名称→データ型→フィールド長→データ値) + - データ型表記を解説書に合わせる(半角数字、数値、半角等) + - 全体構成とフィールド定義の説明を新しい記述方法に合わせて更新 + - コミット: 3364f58 + - PRコメントに返信完了(1件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:28 +- 8回目のPRレビューコメントに対応(列配置の修正) + - 「データタイプ=値」ヘッダー行を削除 + - フィールド名称やデータ型を2列目から始めるように修正 + - レコード種別名(ヘッダ、データ等)を1列目に配置 + - フィールド定義(フィールド名称、データ型、フィールド長、データ値)を2列目から開始 + - 固定長・可変長ファイル両方を修正 + - コミット: a390190 + - PRコメントに返信完了(2件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:34 +- 9回目のPRレビューコメントに対応(レコード種別名とフィールド名を同じ行に) + - レコード種別名(ヘッダ、データ等)の直後の空セルを削除 + - フィールド名(レコード区分、会員番号等)をレコード種別名と同じ行に配置 + - 解説書の例と同じ配置に修正 + - 固定長・可変長ファイル両方を修正 + - コミット: fb14514 + - PRコメントに返信完了(1件) + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-23 17:45 +- PRレビュー状況確認 + - 未解決スレッド: 1件(Database ID: 2720030932) + - 最終コメント: 9回目の対応返信(Database ID: 2720206757、コミットfb14514) + - 状態: レビュー中、次回フィードバック待ち + - 来週継続予定 + +### 2026-01-26 11:46 +- resolve-prスキルを追加 + - PRのunresolvedレビューコメントに自動対応する機能 + - 修正→コミット→プッシュ→リプライの流れを自動化 + - gh CLI + GraphQL APIでunresolvedスレッドを取得 + - 各レビューコメント毎にプッシュ→リプライする構造 + - スクリプト(get-unresolved-threads.sh)に実行権限を付与 + - コミット: 879a627 + - プッシュ完了 + +### 2026-01-26 +- 10回目のPRレビューコメントに対応(resolve-prスキル初使用) + - 重複するグループID説明を削除(5.0と重複) + - 前提知識セクションを削除(5.0を読んでいる前提) + - 記述例の不要な空行を削除(SETUP_FIXED/VARIABLE前の表ヘッダー) + - 固定長ファイル生成例を削除(読者が想像可能) + - 可変長ファイルをデータレコードのみに簡素化(CSVではヘッダ/トレーラは一般的でない) + - CSV生成例を削除(読者が容易に想像できる) + - 全7件を1コミットにまとめて対応: f140d5b + - 各レビューコメントにコミットリンク付きリプライを投稿完了 + - PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/4 + +### 2026-01-26 12:03 - 作業完了 +- 全チェックリスト項目の完了を確認 +- 作業ステータスを「完了」に更新 +- 進捗率: 100% +- 成果物: + - `context/5_test/5.8_file_test.md`: ファイル処理テストの完全ガイド + - `.claude/skills/resolve-pr/`: PRレビュー対応自動化スキル +- PRレビュー待ち状態で作業終了 +### 次回への引き継ぎ事項 +- このコンテキスト情報は他のテストドキュメント(5.1 Web、5.2 REST、5.3 Batch)から参照される想定 +- 必要に応じて、各処理方式のテストドキュメントから5.8へのリンクを追加すると良い +- コンテキストファイル間の重複を避ける方針を継続(基本は5.0、詳細は各ファイル) +- resolve-prスキルを使ってPRレビュー対応を効率化できる + +## 備考 +作成したコンテキスト情報の主要セクション: +1. 固定長ファイルのテスト +2. 可変長ファイルのテスト +3. グループIDによる紐付け +4. ファイルパス指定方法 +5. FilePathSettingとの連携 +6. Excel記述の実践(3サンプル) +7. よくある間違い(7パターン) + +関連情報へのリンクも適切に配置し、5.0、1.5、1.6、3.5、3.7との統合を実現。 diff --git a/.work/2026-01-22_git-history-cleanup.md b/.work/2026-01-22_git-history-cleanup.md new file mode 100644 index 0000000..c13f7c3 --- /dev/null +++ b/.work/2026-01-22_git-history-cleanup.md @@ -0,0 +1,119 @@ +# Git履歴整理 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-22 15:59 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **作業中ファイル**: +- なし(Git履歴操作のみ) + +⚠️ **課題・懸念事項**: +- なし(完了) + +--- + +## 基本情報 +- **開始日時**: 2026-01-22 15:45 +- **作業者**: Claude +- **関連Issue/PR**: なし + +## 作業指示 +feature/add-ntf-contextブランチにおいて、ブランチを切らずにプッシュしていった結果、コミット履歴から変更内容をトレースするのに無駄にコミットを見て回る必要がある状態になっている。 + +目的ごとにコミットを集約し、履歴を整理する。 + +## 現状分析 +origin/masterから30個のコミットが進んでいる。以下のカテゴリに分類可能: + +1. **workスキル関連** (3コミット) + - 1443a18 workスキル改善: UX向上とベストプラクティス適合化 (#1) + - eecc89f 作業管理: workスキル形式に準拠した更新 + - 575a6f4 workスキル: ベストプラクティスに基づいた作業管理機能を追加 + +2. **通知機能関連** (2コミット) + - 57f1cad Claude Code: 通知機能を改善し並行作業に対応 + - 70597e3 Claude Code: 応答完了時のWindows通知を追加 + +3. **NTFコンテキスト関連** (9コミット) + - 0ea1dda 作業管理: 5.0完了に伴いワークファイル名を更新 + - f9c6bf8 NTFコンテキスト: 5.3削除とスコープ明確化 + - e567e7d NTFコンテキスト: 5.0と5.3の品質改善完了 + - ee0d144 NTFコンテキスト: 5.0にリクエスト単体テスト基本形を追加 + - b08f332 NTFコンテキスト: 5.3削除(作り直しのため) + - 27931d5 NTFコンテキスト: 5.0 テストの基礎を追加 + - f84e40e NTFコンテキスト: 作業計画見直し(5.0前提ファイル追加) + - d5902e3 NTFコンテキスト: 5.3 リクエスト単体テスト(Batch)を追加 + - 8e8baff setting.local.jsonをgit対象外に設定 + +4. **Web実装テスト関連** (4コミット) + - f3b19b4 Web実装テストのフィードバック + - 8dd3057 Web実装テストのフィードバック + - 231de43 JSP関連項目の圧縮とファイル分割・非推奨機能の削除 + - 0c3e997 Web向けコンテキスト追加 + +5. **バッチ実装テスト関連** (13コミット) + - 5bcc7a6 バッチ実装テストのフィードバック + - c22242d 圧縮しすぎて無視されたので戻す + - a0ec7c5 圧縮 + - 5d1a97e バッチ実装テストのフィードバック + - 25bf5f1 バッチ実装テストのフィードバック + - ac28489 日付・時刻ユーティリティ追記 + - 494d68d JDBCラッパー追記・ファイルパス管理追加・全体書式統一 + - 3c4e7b3 構成見直し(インプットとアウトプットそれぞれDB or Fileでファイル分割) + - 0159344 データバインド追加 + - a2b9a1a 構成見直し + - 999c614 構成見直し + - b9a18df 重複削除 + - 7703f52 バッチ初版 + +6. **REST実装テスト関連** (1コミット) + - 875a0f4 RESTの実装テスト完了時点 + +## 作業計画(チェックリスト) +- [x] ユーザーに整理方針を確認(カテゴリごとにsquashするか、時系列を維持するか等) +- [x] リモートへのforce pushのリスクと対応方針を確認 +- [x] バックアップブランチを作成 +- [x] git reset + 新規コミットで履歴を整理 +- [x] 整理後の履歴を確認 +- [x] ユーザーに整理後の履歴を提示して承認を得る +- [x] リモートへforce push(承認後) + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-22 15:45 | origin/developから14個のコミットを対象 | developブランチのコミットは除外 | +| 2026-01-22 15:47 | 最終成果物から4カテゴリに分類 | 変更ファイルベースで整理 | +| 2026-01-22 15:50 | .work/ファイルの変更も含める | 作業履歴も含めて管理 | +| 2026-01-22 15:52 | git reset + 新規コミットで実行 | 自動実行が可能 | + +## 作業ログ +### 2026-01-22 15:45 +- 作業開始 +- 現在のコミット履歴を分析 +- 作業計画を策定 + +### 2026-01-22 15:47-15:52 +- origin/developからの差分を確認(14コミット) +- 変更ファイルから4カテゴリに再分類 +- 整理方針をユーザーと確認 + +### 2026-01-22 15:56-15:59 +- バックアップブランチ作成: feature/add-ntf-context-backup +- git reset --soft origin/developで履歴をリセット +- カテゴリごとに新規コミットを作成: + 1. 47bf7cd 設定: setting.local.jsonをgit対象外に追加 + 2. cbde3b6 NTFコンテキスト: テストの基礎を追加 + 3. dac1f33 Claude Code拡張: workスキルを追加 + 4. 94ced4f Claude Code拡張: 通知機能を追加 +- ユーザーへ整理後の履歴を提示・承認 +- git push --force-with-leaseでリモートへプッシュ完了 + +## 備考 +- バックアップブランチ: feature/add-ntf-context-backup +- 14コミット → 4コミットに集約 +- 全ての変更ファイル(.work/含む)を保持 +- git reset + 新規コミットで実行(rebase -iより自動化しやすい) diff --git a/.work/2026-01-22_ntf-5.3-batch-request-test.md b/.work/2026-01-22_ntf-5.3-batch-request-test.md new file mode 100644 index 0000000..9ba1fd9 --- /dev/null +++ b/.work/2026-01-22_ntf-5.3-batch-request-test.md @@ -0,0 +1,121 @@ +# 5.3 リクエスト単体テスト(Batch)コンテキスト情報作成 + +## ステータス + +⏰ **最終更新**: 2026-01-23 13:30 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **作業中ファイル**: +- `context/5_test/5.3_batch_request_test.md`(作成完了、PRレビュー対応完了) + +⚠️ **課題・懸念事項**: +- なし + +--- + +## 基本情報 +- **開始日時**: 2026-01-22 16:31 +- **作業者**: Claude Code +- **関連ブランチ**: feature/ntf-5.3-batch-request-test +- **関連Issue/PR**: なし + +## 作業指示 + +Nablarch Testing Framework(NTF)の「5.3 リクエスト単体テスト(Batch)」のコンテキスト情報を作成します。 + +**目的**: +- バッチリクエスト単体テストのExcelファイル記述方法を網羅的に説明 +- 5.0(テストの基礎)で説明した共通部分と、Batch固有の部分を明確に区別 +- テスト作成者が迷わずExcelファイルを作成できるようにする + +**背景**: +- 既に`context/5_test/5.0_test_basics.md`でテストの基礎が作成済み +- 処理方式(Batch/REST/Web)固有の内容は、それぞれのファイルで説明する設計 +- 5.3のコンテキスト情報が未作成 + +## 作業計画(チェックリスト) + +- [x] 既存のNTFドキュメント・サンプルコードを調査 +- [x] 5.0との役割分担を明確化 +- [x] Batch固有のtestShotsカラムを特定 +- [x] 5.3コンテキストファイルの構成を設計 +- [x] ユーザーへ構成・内容案を提示し確認を得る +- [x] 5.3コンテキストファイルを作成 +- [x] PR作成 +- [x] PRレビュー対応 + +## 決定事項 + +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-22 16:31 | 作業開始 | NTF 5.3のコンテキスト情報が不足しているため | +| 2026-01-22 16:45 | 5.0への言及を削除しBatch固有の内容のみに絞る | 5.0は前の章なので読んでいる前提 | +| 2026-01-22 17:00 | 8セクション構成で5.3ファイルを作成 | Batch固有の情報に特化した構成 | + +## 作業ログ + +### 2026-01-22 16:31(作業開始) +- 作業開始を選択 +- 既存の`.work/`ディレクトリを確認(4ファイル存在) +- 既存のテストコンテキスト`context/5_test/5.0_test_basics.md`を確認 +- 作業ファイル`.work/2026-01-22_ntf-5.3-batch-request-test.md`を作成 +- ブランチ`feature/ntf-5.3-batch-request-test`(既存)で作業開始をコミット + +### 2026-01-22 16:31(チェックポイント) +- ユーザーからチェックポイント作成の要求 +- 作業計画に「ユーザーへ構成・内容案を提示し確認を得る」ステップを追加 +- 作業中断処理を実行(Git commit & push予定) + +### 2026-01-22 16:40(作業再開) +- workスキルで作業再開を選択 +- 既存の作業ファイル5件を確認し、「5.3 Batch単体テスト」を選択 +- 過去に作成された5.3ファイル(Git履歴から)を参考に調査開始 + +### 2026-01-22 16:45(構成案作成・承認) +- 5.0との役割分担を整理 + - 5.0: Excelファイルの基本、testShots共通カラム、データタイプ、データ記述ルール + - 5.3: Batch固有のtestShotsカラム、BatchRequestTestSupport、setUpDb()、実装パターン +- Batch固有のtestShotsカラムを特定: diConfig、requestPath、userId +- 8セクション構成を提案し、ユーザーから5.0への言及削除の指示を受ける +- Batch固有の内容のみに絞った構成で承認を得る + +### 2026-01-22 17:00(ファイル作成完了) +- `context/5_test/5.3_batch_request_test.md`を作成完了 +- 構成: 概要、テストクラス構造、testShotsのBatch固有カラム、ステータスコード、完全な実装例、setUpDb()、実装パターン、よくある間違い +- 既存コンテキストの形式(テーブル、コードブロック、✅❌表記)に準拠 +- PR作成依頼を受ける + +### 2026-01-23 12:00(作業再開・チェックリスト更新) +- workスキルで作業再開 +- PRが作成済みであることを確認 +- チェックリストに「PRレビュー対応」を追加 +- ステータスを「PRレビュー待ち」(進捗率90%)に更新 + +### 2026-01-23 12:30(PRレビュー対応中) +- PRレビューのフィードバック8件を確認 +- フィードバック対応を開始(PRリンク: https://github.com/kiyotis/nablarch-tools-for-ai/pull/3) +- 5件のフィードバックに対応完了(コミット: 23f3cb8, d014182, 5e99e45, 2370814) +- 3件のフィードバックはユーザー確認待ち(ステータスコード、setUpDb配置、よくある間違い) + +### 2026-01-23 13:00(PRレビュー対応完了) +- ユーザーから3件の確認回答を受領(すべて削除の指示) +- 残りの3件のフィードバックに対応完了(コミット: b4eb0eb) + - ステータスコードセクション削除 + - setUpDbセクション削除(5.0への追加は別タスク) + - よくある間違いセクション削除 +- 全8件のフィードバックに対応完了し、再レビュー依頼 + +### 2026-01-23 13:30(作業完了) +- 全チェックリスト項目完了を確認 +- PRレビュー対応が完了し、作業完了処理を実行 +- 成果物: `context/5_test/5.3_batch_request_test.md` +- PRリンク: https://github.com/kiyotis/nablarch-tools-for-ai/pull/3 + +## 備考 + +**参考ファイル**: +- `.work/2026-01-21_ntf-5.0-test-basics.md`: 5.0作成時の作業履歴 +- `context/5_test/5.0_test_basics.md`: テストの基礎(既存) diff --git a/.work/2026-01-22_ntf-5.4-database-test.md b/.work/2026-01-22_ntf-5.4-database-test.md new file mode 100644 index 0000000..257689a --- /dev/null +++ b/.work/2026-01-22_ntf-5.4-database-test.md @@ -0,0 +1,161 @@ +# ntf-5.4-database-test 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-23 午後 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **作業中ファイル**: +- `context/5_test/5.4_database_test.md` (完了) + +⚠️ **課題・懸念事項**: +- (なし) + +--- + +## 基本情報 +- **開始日時**: 2026-01-22 +- **作業者**: 自動 +- **ブランチ**: feature/ntf-5.4-database-test +- **関連Issue/PR**: #5 (PR to feature/add-ntf-context) + +## 作業指示 + +Nablarch Testing Framework (NTF) 5.4 データベーステストのコンテキスト情報を作成する。 + +**目的**: +- AIがデータベーステスト(SETUP_TABLE、EXPECTED_TABLE等)を正しく実装できるよう、必要最小限の技術仕様を提供する +- 既存の5.0テストの基礎と整合性を保ちながら、データベーステスト固有の内容を詳細化する + +**成果物**: +- `context/5_test/5.4_database_test.md` - データベーステストのコンテキスト情報 +- `context/README.md` - 5.4の説明を「作成予定」から「完成」に更新 + +## 作業計画(チェックリスト) +- [x] 既存のテストコンテキスト構造を理解する(5.0_test_basics.mdを読了) +- [x] Nablarchのデータベーステスト機能を調査する + - [x] SETUP_TABLE、EXPECTED_TABLE、EXPECTED_COMPLETE_TABLEの詳細 + - [x] トランザクション制御とDB初期化の仕組み + - [x] グループIDによる複数テーブル管理 + - [x] 実装例の収集 +- [x] 調査結果をユーザーに報告し、作成方針を確認する + - [x] 調査で得られた情報をまとめる + - [x] 5.4_database_test.mdの構成案を提示する + - [x] ユーザーの承認を得る +- [x] 5.4_database_test.mdを作成する + - [x] 基本構造(概要、データタイプ、実装パターン) + - [x] SETUP_TABLEの詳細説明 + - [x] EXPECTED_TABLEとEXPECTED_COMPLETE_TABLEの使い分け + - [x] グループID活用パターン + - [x] トランザクション制御と注意点 + - [x] よくある間違いと対策 +- [x] context/README.mdを更新する(5.4の記載を更新) +- [x] 作業ファイルを完了状態に更新し、Git commit & push +- [x] ユーザーに成果物をレビューしてもらう +- [x] レビューフィードバックに対応する + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| (まだありません) | - | - | + +## 作業ログ + +### 2026-01-23 午後(作業完了) +- ユーザーから第4ラウンドのレビューOKを受領 +- 全てのレビューフィードバック対応完了 +- 作業ファイルを完了状態に更新 +- 作業完了 + +### 2026-01-23 午後(第4ラウンド) +- PRレビューフィードバック対応(第4ラウンド)完了 +- 3件のレビューコメントに対応: + - タスク#1: データタイプの見出しを簡潔化 → 修正完了(コミット: 758a66d) + - タスク#2: 主要メソッドのセクション削除 → 修正完了(コミット: 284c0ba) + - タスク#3: グループIDによる複数テーブル管理セクション削除 → 修正完了(コミット: 354b647) +- 修正コミット: 3件(758a66d, 284c0ba, 354b647) +- PR #5: https://github.com/kiyotis/nablarch-tools-for-ai/pull/5 +- 再レビュー待ち + +### 2026-01-23 午後(第3ラウンド) +- PRレビューフィードバック対応(第3ラウンド)完了 +- 13件のレビューコメントに対応: + - タスク#1: 5.0章のデータタイプとの重複解消 → 質問コメント追加(確認依頼) + - タスク#2: 制御メソッドの説明の出典確認 → 公式ドキュメントに記載あり、回答 + - タスク#3: 更新系テストのコミット必須パターンの重複削除 → 修正完了(コミット: 05d950c) + - タスク#4: グループIDの説明削除 → 質問コメント追加(確認依頼) + - タスク#5: 共通初期データの説明削除 → 既に削除済み、回答 + - タスク#6: トランザクション制御の説明簡略化 → 既に簡略化済み、回答 + - タスク#7: リクエスト単体テストの説明簡略化 → 質問コメント追加(確認依頼) + - タスク#8: 記載内容の出典確認(クリーンアップ) → 既に削除済み、回答 + - タスク#9: 外部キー制約の説明簡略化 → 質問コメント追加(確認依頼) + - タスク#10: よくある間違いの出典確認 → 既に削除済み、目次も削除(コミット: 6ab34e0) + - タスク#11: 実装例集の必要性確認 → 質問コメント追加(確認依頼) + - タスク#12: EXPECTED_TABLEの用途説明改善 → 既に改善済み、回答 + - タスク#13: クラス定義とメソッドの統合 → 既に統合済み、回答 +- 修正コミット: 2件(05d950c, 6ab34e0) +- 質問コメント: 6件(確認待ち) +- 回答コメント: 7件 +- PR #5: https://github.com/kiyotis/nablarch-tools-for-ai/pull/5 +- 再レビュー待ち + +### 2026-01-23 午前 +- PRレビューフィードバック対応(第1ラウンド)完了 +- 11件のレビューコメントに対応: + 1-9. 重複削減、5.0章へのリンク追加、説明簡潔化(コミット: 843fc5d) + 10-11. 確認事項について質問リプライ +- ユーザーからの追加回答を受け、追加対応実施: + - よくある間違いと対策セクション削除(想像ベース内容のため) + - 実装例集セクション削除(各セクションの例で十分なため) + - コミット: cc164fe +- 第1ラウンド全11件のフィードバック対応完了 + +### 2026-01-23 午後 +- PRレビューフィードバック対応(第2ラウンド)開始 +- 4件の新しいレビューコメントに対応: + 1. Line 24: リンクの方向を修正(5.0→5.4に変更)- コミット: 5787f44 + 2. Line 458: リクエスト単体テストの実装例セクションを削除 - コミット: 2e9da51 + 3. Line 32: EXPECTED_TABLEの用途に「自動採番されるカラムを検証から除外」を追加 - コミット: e619c25 + 4. Line 54: クラス定義とメソッドを1つのコードブロックに統合 - コミット: f8dadd6 +- 第2ラウンド全4件のフィードバック対応完了 +- PR #5: https://github.com/kiyotis/nablarch-tools-for-ai/pull/5 +- 再レビュー待ち + +### 2026-01-22 午後 +- workスキルで作業管理を開始、作業ファイルを作成 +- 作業指示と詳細な作業計画を記入 +- context/5_test/5.0_test_basics.mdを読んで既存のテスト構造を理解 + - テストクラスとExcelファイルの対応関係 + - リクエスト単体テストの基本形(testShots、グループID) + - データタイプの基礎(SETUP_TABLE、EXPECTED_TABLE等) +- TodoListで進捗管理を開始 + +### 2026-01-22 夕方 +- workスキルで作業再開 +- Exploreエージェントを使ってデータベーステスト機能を詳細調査 + - SETUP_TABLE、EXPECTED_TABLE、EXPECTED_COMPLETE_TABLEの役割と違い + - トランザクション制御の重要性(commitTransactions()必須) + - グループIDによる複数テーブル管理の仕組み + - 外部キー制約の自動判定機能 + - クラス単体テストとリクエスト単体テストの実装例 +- 調査結果を整理してユーザーに報告 +- 5.4_database_test.mdの構成案を提示し、ユーザーの承認を得る +- context/5_test/5.4_database_test.mdを作成(全1,300行超) + - データタイプの詳細説明(SETUP/EXPECTED/EXPECTED_COMPLETE) + - クラス単体テスト・リクエスト単体テストの使用方法 + - トランザクション制御の説明 + - グループIDによる複数テーブル管理 + - よくある間違いと対策(4つの具体例) + - 完全な実装例(クラス単体テスト、リクエスト単体テスト) +- context/README.mdを更新(5.4の記載を「作成予定」から完成状態に) +- 作業ファイルを完了状態に更新 +- Git commit & push実行(コミット: 6cceea0, 5ac1699, 6f251ac) +- チェックリストにレビュー項目を追加 +- feature/add-ntf-contextブランチに向けてPR作成(#5) +- **現在**: ユーザーレビュー待ち(PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/5) + +## 備考 +(その他のメモや参考情報) diff --git a/.work/2026-01-22_test-basics-documentation-update.md b/.work/2026-01-22_test-basics-documentation-update.md new file mode 100644 index 0000000..e9ec57b --- /dev/null +++ b/.work/2026-01-22_test-basics-documentation-update.md @@ -0,0 +1,95 @@ +# テストの基礎ドキュメント更新 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-23 01:22 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **作業中ファイル**: +- `context/5_test/5.0_test_basics.md` + +⚠️ **課題・懸念事項**: +- なし + +--- + +## 基本情報 +- **開始日時**: 2026-01-22 +- **作業者**: Claude Code +- **関連Issue/PR**: なし + +## 作業指示 +Nablarch Testing Frameworkのテストの基礎ドキュメント(5.0_test_basics.md)を修正する。 + +### 修正内容 +1. セル内の特殊記法にダブルクォート文字(")を指定する方法を追加 +2. テストクラスとExcelファイルの配置説明を正確に修正 +3. Nablarch解説書を確認し、記載漏れがあれば追加 + +## 作業計画(チェックリスト) +- [x] Nablarch解説書の該当ページを確認 +- [x] セル内の特殊記法にダブルクォート文字の記述を追加 +- [x] テストクラスとExcelファイルの配置説明を修正 +- [x] 記載漏れがないか確認して必要に応じて追加 +- [x] PRレビュー + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-22 | ダブルクォート文字の記述は `"""` で表現 | Nablarch公式ドキュメントに基づく | +| 2026-01-22 | 配置ルールは「同じパッケージ階層」と明記 | 物理的には異なるディレクトリだが論理的には同じ階層 | + +## 作業ログ + +### 2026-01-22 セッション開始 +- Nablarch公式ドキュメント(https://nablarch.github.io/docs/LATEST/doc/)を確認 +- 自動テストフレームワークのドキュメントから以下の情報を収集: + - ダブルクォート処理: 前後のダブルクォートは自動的に取り除かれる + - エスケープ処理: `\,` でカンマ、`\\` でバックスラッシュ + - 空行の扱い: `""` で表現、完全な空行は無視される + - デフォルト値: 数値型=0、文字列型=半角スペース、日付型=1970-01-01 + - 主キーは必須 + +### 修正内容詳細 + +#### 1. セル内の特殊記法に追加 (context/5_test/5.0_test_basics.md) +- **ダブルクォート文字**: `"""` → `"` という記述方法を追加 (行437) +- **エスケープ処理**: `\,` でカンマ、`\\` でバックスラッシュのエスケープ方法を追加 (行453-455) +- **空行の扱い**: `""` で空行を表現する方法と、完全な空行は無視される仕様を追加 (行456-462) +- **重要事項**: ダブルクォート処理のルールを明記 + +#### 2. テストクラスとExcelファイルの配置 (context/5_test/5.0_test_basics.md) +- 配置図を簡潔化(空行削除) +- コメントの「同じディレクトリ」という誤解を招く表現を削除 (行61-63) +- ルールで「`src/test/resources`配下に、テストクラスと同じパッケージ階層で配置」と明確に記載 (行68) + +#### 3. デフォルト値の規則を追加 (context/5_test/5.0_test_basics.md) +- EXPECTED_COMPLETE_TABLEセクションに、カラム省略時のデフォルト値を追加 (行281-285) + - 数値型: 0 + - 文字列型: 半角スペース + - 日付型: 1970-01-01 + - Timestamp型: `yyyy-MM-dd HH:mm:ss.fffffffff` 形式 + +#### 4. 主キーに関する重要なルールを追加 (context/5_test/5.0_test_basics.md) +- SETUP_TABLEセクション: 主キーカラムは必須であることを明記 (行255-257) +- EXPECTED_TABLEセクション: 主キーカラムは必須(突合に使用)、レコード順序は不問であることを明記 (行273-275) + +### 作業完了 +全ての修正が完了し、Nablarch公式ドキュメントとの整合性を確認。 + +### 2026-01-23 PRレビュー対応 +- PR #2のレビューフィードバックに対応 +- テストクラスとExcelファイルを同一ディレクトリに配置する記述に変更 +- 開発現場でのメンテナンス性向上の観点を注意書きとして追加 +- コミット: https://github.com/kiyotis/nablarch-tools-for-ai/commit/88ae694 +- PR: https://github.com/kiyotis/nablarch-tools-for-ai/pull/2 + +## 備考 +- 参照した公式ドキュメント: + - https://nablarch.github.io/docs/LATEST/doc/index.html + - https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/01_Abstract.html + - https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/02_DbAccessTest.html + - https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/03_Tips.html diff --git a/.work/2026-01-22_work-skill-improvements.md b/.work/2026-01-22_work-skill-improvements.md new file mode 100644 index 0000000..a4473b5 --- /dev/null +++ b/.work/2026-01-22_work-skill-improvements.md @@ -0,0 +1,200 @@ +# workスキル改善 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-22 15:00 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **作業中ファイル**: +- `.claude/skills/work/SKILL.md` +- `.claude/skills/work/template.md` + +⚠️ **課題・懸念事項**: +- なし + +--- + +## 基本情報 + +📅 **開始日時**: 2026-01-22 14:35 +👤 **作業者**: Claude +🔗 **関連Issue/PR**: なし + +--- + +## 作業指示 + +workスキルを改善し、より使いやすく堅牢なワークフローを実現する。 + +### 目的 +- 新規作業開始時のユーザビリティ向上 +- テンプレートファイル参照の問題解決 +- ブランチ作成の自動化 +- 作業開始前の承認フロー追加 +- テンプレートの重複解消(次のアクションとチェックリストの統一) + +### 背景 +- 現在のworkスキルでテンプレートファイルが見つからない問題が発生 +- 新規作業ファイル作成後すぐに作業開始するため、ユーザーが内容を確認できない +- ブランチ作成が手動で、作業ファイルとの連携がない +- スキル起動時の選択肢が不明確 +- 「次のアクション」と「作業計画チェックリスト」が重複しており管理が煩雑 + +### スコープ +- `.claude/skills/work/SKILL.md`の改善 +- `.claude/skills/work/template.md`の改善(次のアクションセクション削除) +- テンプレートファイル参照ロジックの修正 +- 新規作業時のフロー改善(承認→ブランチ作成→作業開始) +- スキル起動時の初期選択肢の追加 + +--- + +## 作業計画(チェックリスト) + +### 1. 要件整理フェーズ +- [x] ユーザー要件の詳細確認 +- [x] 現在のSKILL.mdとtemplate.mdの問題点洗い出し +- [x] 改善仕様の確定 + +### 2. 実装フェーズ - SKILL.md +- [x] **テンプレートファイル参照の修正** + - [x] テンプレートファイルのパスを明確に記載(`.claude/skills/work/template.md`) + - [x] Readツール使用を指示 +- [x] **スキル起動時の初期選択肢追加** + - [x] 「新規作業/作業再開/その他」の選択肢を最初に提示するフローに変更 + - [x] 各選択肢に応じたフロー分岐を明記 +- [x] **新規作業時の承認フロー追加** + - [x] 作業管理ファイル作成後、内容をユーザーに提示 + - [x] 承認を得てから作業開始する手順を追加 +- [x] **ブランチ作成の自動化** + - [x] 新規作業承認後にブランチ名を提案 + - [x] git checkoutでブランチ作成する手順を追加 + - [x] ブランチ名規則の明記(feature/作業名など) + +### 3. 実装フェーズ - template.md +- [x] **テンプレートの重複解消** + - [x] 「次のアクション」セクションを削除 + - [x] チェックリストのみで進捗管理する形式に変更 + - [x] ステータスセクションを絵文字付きで明確化 + +### 4. 検証フェーズ +- [x] SKILL.mdとtemplate.mdの更新完了確認 +- [x] 改善内容のレビュー + +--- + +## 決定事項 + +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-22 14:35 | テンプレートファイルパスは`.claude/skills/work/template.md`で明記 | 相対パス参照の曖昧性を排除 | +| 2026-01-22 14:35 | ブランチ名は`feature/作業名`形式を推奨 | Gitフローとの整合性 | +| 2026-01-22 14:35 | 「次のアクション」セクションを廃止 | チェックリストとの重複を解消し管理を簡素化 | + +--- + +## 作業ログ + +### 2026-01-22 14:35 - 作業開始 +- 作業管理ファイル作成 +- 改善要件5点を確定 +- ブランチ`feature/work-skill-improvements`を作成 + +### 2026-01-22 14:40 - 問題点洗い出し完了 +- SKILL.md: テンプレート参照曖昧、初期フロー不明確、承認なし、ブランチ作成なし +- template.md: 「次のアクション」と「チェックリスト」の重複 + +### 2026-01-22 14:45 - SKILL.md改善実装 +- テンプレートパスを`.claude/skills/work/template.md`と明記 +- セクション2に初期選択肢フロー追加(新規作業/作業再開/その他) +- セクション3を作業再開時の処理として統合 +- セクション4に承認フロー追加(ファイル作成後、内容提示→承認) +- セクション4にブランチ作成手順追加(feature/作業名形式) +- セクション5から「次のアクション」への言及を削除 + +### 2026-01-22 14:55 - template.md改善実装 +- 「次のアクション」「作業中ファイル」「課題・懸念事項」セクションを削除 +- ステータスセクションを絵文字付きで見やすく再構成 +- チェックリストのみでタスク管理する形式に統一 + +### 2026-01-22 15:00 - 作業完了 +- すべての改善項目を実装完了 +- 変更内容をレビューして問題なしを確認 +- コミット: 8cc5a1d + +### 2026-01-22 15:05 - 追加改善 +- 「新規作業」を「作業開始」に変更(より直感的な表現) +- セクション6「作業終了時の処理」を追加 + - ファイル選択フロー + - 終了処理(チェックリスト確認、ステータス更新、完了報告) + - 注意事項(未完了タスクや残課題の記録) +- 重要な注意事項を更新(「次のアクション」→「チェックリスト」) +- コミット: 4611768 + +### 2026-01-22 15:15 - 用語統一と作業中断機能追加 +- 用語を統一: + - **作業(Work)**: workスキルで管理する単位(.work/*.mdファイル) + - **タスク(Task)**: 作業内の個別チェックリスト項目 +- 使用タイミングを明確化(作業開始/作業再開/作業中断/作業完了) +- 初期選択肢を4つに変更(「その他」削除、「作業中断」追加) +- セクション5を「タスク完了時の更新」に変更 +- セクション6を「作業中断時の処理」に変更: + - 目的: workスキルが動いていない間の成果を保護 + - 現在の状況ヒアリング + - ファイル更新→git status確認→コミット→プッシュ +- セクション7を「作業完了時の処理」として追加: + - チェックリスト完了確認 + - コミット漏れ確認→通知→コミット→プッシュ +- コミット: 4bb5efa + +### 2026-01-22 15:20 - セクション5削除 +- セクション5「タスク完了時の更新」を削除 + - 理由: workスキルが動いていない間の処理なので、SKILL.mdに書いても読まれない + - 作業中断・完了時のヒアリングで対応 +- セクション番号を整理: + - セクション5: 作業中断時の処理(旧6) + - セクション6: 作業完了時の処理(旧7) +- コミット: 50eb101 + +### 2026-01-22 15:30 - ベストプラクティス適合化 +- 公式スキル作成ベストプラクティスに基づく改善: + +**フロントマター改善:** +- descriptionを自然な英語に変更(キーワード列挙を廃止) +- argument-hintを英語に統一 +- disable-model-invocation: true を追加(Git操作があるため手動制御) +- allowed-toolsを明示(Read, Write, Edit, Bash, AskUserQuestion) + +**Supporting files分離:** +- terminology.md作成(240行)- 用語定義と使い分け +- workflows.md作成(429行)- 各処理の詳細手順 + +**SKILL.md簡潔化:** +- 168行 → 87行(約48%削減) +- 詳細フローをworkflows.mdに移動 +- 概要と重要原則のみに絞る +- supporting filesへの参照を追加 + +**ベストプラクティス適合度:** +- 明確なdescription: △ → ○ +- SKILL.md簡潔性: △ → ○ +- supporting files活用: △ → ○ +- 呼び出し制御: △ → ○ +- ツール制限: ✗ → ○ +- argument-hint: △ → ○ + +### 2026-01-22 16:00 - 動作確認完了 +- workスキルの全フローについて動作確認を実施 +- 作業再開、作業選択、ステータス表示が期待通りに動作 +- PR #1に動作確認完了のコメントを追加 +- 問題なし、レビュー待ち状態 + +--- + +## 備考 + +- 改善後のSKILL.mdは、既存の作業ファイルとの互換性を考慮 +- 既存の作業ファイル(次のアクション形式)も引き続き機能するように配慮 diff --git a/.work/2026-01-26_context-readme-links.md b/.work/2026-01-26_context-readme-links.md new file mode 100644 index 0000000..d250049 --- /dev/null +++ b/.work/2026-01-26_context-readme-links.md @@ -0,0 +1,132 @@ +# context/README.md リンク化 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-26 13:45 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: ✅ 完了 + +📂 **作業中ファイル**: +- なし + +⚠️ **課題・懸念事項**: +- なし + +--- + +## 基本情報 +- **開始日時**: 2026-01-26 12:30 +- **作業者**: Claude Code +- **関連Issue/PR**: PR #6 + +## 作業指示 +context/README.mdの見出しをすべてリンクにして、各コンテキストファイルにたどれるようにする。 +- 作成未定: そのままラベルとして残す +- 作成予定: ファイルが存在すればリンクにする +- その他: すべてリンク化 + +## 作業計画(チェックリスト) +- [x] 既存のマークダウンファイルを確認 +- [x] README.mdを更新(見出しをリンク化) +- [x] 作業ファイルを完了状態に更新 +- [x] 作業ブランチの作成 +- [x] Git commit & push +- [x] PR作成してレビュー依頼 +- [x] settings.jsonにNotificationフックを追加 +- [x] PRレビュー承認まで resolve-pr スキルでPRレビュー対応を繰り返す +- [x] PRレビュー承認後、作業完了フロー実行 + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-26 12:30 | すべての見出しをリンクまたはラベルに変換 | ナビゲーションを改善 | + +## 作業ログ +### 2026-01-26 12:30 +- context/以下のマークダウンファイルを確認 +- 以下のファイルが存在することを確認: + - 1_common: 1.1~1.8 すべて存在 + - 2_rest: 2.1~2.4 すべて存在 + - 3_batch: 3.1~3.8 すべて存在 + - 4_web: 4.1~4.4 すべて存在 + - 5_test: 5.0, 5.3, 5.4, 5.8 が存在 + - 5_test: 5.1, 5.2, 5.5~5.7, 5.9~5.12 が未作成 + +### 2026-01-26 12:40 +- README.mdを更新完了 +- 1_common: 全8ファイルをリンク化 +- 2_rest: 全4ファイルをリンク化 +- 3_batch: 全8ファイルをリンク化(3.4-3.7を個別ファイルとして記載) +- 4_web: 全4ファイルをリンク化 +- 5_test: 5.0, 5.3, 5.4, 5.8をリンク化し、「作成予定」ラベルを削除 +- 5_test: 5.1, 5.2, 5.5~5.7, 5.9~5.12は「作成未定」または「作成予定」ラベルのまま + +### 2026-01-26 12:45 +- 作業ブランチ `feature/context-readme-links` を作成 +- 変更をコミット(fd7510e) +- リモートにプッシュ完了 +- PR #6 を作成: https://github.com/kiyotis/nablarch-tools-for-ai/pull/6 +- PRレビュー待ち状態 + +### 2026-01-26 12:50 +- settings.json に Notification フックを追加 +- Stop フックと同じ内容(notify-stop.sh)を実行 +- 許可の際も通知が送られるように設定 + +### 2026-01-26 13:15 +- resolve-pr スキルでPR #6のレビューコメント対応を実行 +- レビュアーからの質問(5.6 テストデータ管理の内容について)に返信 +- 5.0との重複可能性を確認し、5.6の削除または内容変更について意見を求めた +- 返信リンク: https://github.com/kiyotis/nablarch-tools-for-ai/pull/6#discussion_r2726368844 +- レビュアーの追加フィードバック待ち + +### 2026-01-26 13:20 +- レビュアーから新しいコメントがあり、再度 resolve-pr スキルで対応 +- Nablarch解説書を調査し、5.6で想定していた内容は5.0で既にカバーされていることを確認 +- 5.6 テストデータ管理セクションを削除(重複解消) +- コミット dacf521 を作成し、レビューコメントにリプライ +- コミットリンク: https://github.com/kiyotis/nablarch-tools-for-ai/commit/dacf52142ed9cf619dbc0e66239483c8f0fa022f +- 再レビュー待ち + +### 2026-01-26 13:25 +- レビュアーから抜け番解消の指摘があり、再度 resolve-pr スキルで対応 +- 5.7以降のセクションを1つずつ繰り上げ(5.7→5.6, 5.8→5.7, ..., 5.12→5.11) +- ファイル名も更新: 5.8_file_test.md → 5.7_file_test.md +- README.mdのリンクも修正 +- コミット d2478a1 を作成し、レビューコメントにリプライ +- コミットリンク: https://github.com/kiyotis/nablarch-tools-for-ai/commit/d2478a1fa6722ee562a5602b79950e7e6b508a2d +- 再レビュー待ち + +### 2026-01-26 13:30 +- resolve-prスキルを修正してCo-Authored-Byを追加 +- エージェントが作成したコメントであることを明示化 +- settings.jsonのNotificationフック設定と作業管理ファイルを含めてコミット 77b92dc +- feature/context-readme-linksブランチにプッシュ + +### 2026-01-26 13:35 +- レビュアーから「(作成未定)」表記削除の指摘があり、resolve-pr スキルで対応 +- 全ての「(作成未定)」表記を削除(リンクの有無で判別可能なため) +- コミット 7f22d2a を作成し、レビューコメントにリプライ(Co-Authored-By付き) +- コミットリンク: https://github.com/kiyotis/nablarch-tools-for-ai/commit/7f22d2a5c7604912bb531c33781a829f71b3afd2 +- 最終レビュー待ち + +### 2026-01-26 13:40 +- レビュアーからリスト項目の改行ミス指摘があり、resolve-pr スキルで対応 +- 5_testセクションのリスト項目が連結していた問題を修正 +- 5.1-5.3, 5.5-5.7, 5.8-5.11が1行に連結していたのを各項目独立した行に修正 +- コミット 7b536b6 を作成し、レビューコメントにリプライ(Co-Authored-By付き) +- コミットリンク: https://github.com/kiyotis/nablarch-tools-for-ai/commit/7b536b6af844d79c749495aad7206a43717504f3 +- すべてのunresolvedレビューコメント対応完了 +- 最終レビュー待ち + +### 2026-01-26 13:45 +- PRレビュー承認を確認 +- 作業ファイルを完了状態に更新(進捗率100%、フェーズ完了) +- チェックリスト更新 +- 作業完了 + +## 備考 +- 5.3, 5.4, 5.8は既に作成済みだが、README.mdで「作成予定」と記載されている +- これらもリンク化する必要がある diff --git a/.work/2026-01-27_ntf-common-db-setup.md b/.work/2026-01-27_ntf-common-db-setup.md new file mode 100644 index 0000000..44b7c4b --- /dev/null +++ b/.work/2026-01-27_ntf-common-db-setup.md @@ -0,0 +1,115 @@ +# NTFコンテキスト: 共通データベース初期値 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-27 17:00 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: ✅ 完了 + +📂 **作業中ファイル**: +- `context/5_test/5.4_database_test.md`(追記完了・マージ済み) + +🔗 **PR**: https://github.com/kiyotis/nablarch-tools-for-ai/pull/8 (マージ済み) + +⚠️ **課題・懸念事項**: +- なし + +--- + +## 基本情報 +- **開始日時**: 2026-01-27 15:07 +- **作業者**: Claude Code +- **作業ブランチ**: feature/add-setupdb-context +- **関連Issue/PR**: https://github.com/kiyotis/nablarch-tools-for-ai/pull/8 + +## 作業指示 + +### 背景 +Nablarch公式ドキュメントには「テストクラスで共通のデータベース初期値」に関する記載がありますが、既存のNTFコンテキストファイルにこの情報が含まれていません。 + +URL: https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/05_UnitTestGuide/02_RequestUnitTest/index.html#request-test-setup-db + +### 目的 +setUpDbシートの使い方を既存のNTFコンテキストに追記し、テストクラス内で共通的に使用するデータベース初期値の設定方法を文書化する。 + +## 作業計画(チェックリスト) + +- [x] 公式ドキュメントから setUpDb に関する詳細情報を収集 +- [x] 既存コンテキストファイル (5.0, 5.3, 5.4) の内容を精査し、追記先を決定 +- [x] setUpDbシートの記述例を作成(計画に含む) +- [x] 選択したコンテキストファイルに情報を追記 +- [x] context/README.md のリンクや説明の更新が必要か確認 +- [x] 作業内容をGit commitで保存 +- [x] PR作成してレビュー依頼 +- [x] PRレビュー承認まで resolve-pr スキルでPRレビュー対応を繰り返す +- [x] PRレビュー承認後、作業完了フロー実行 + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-27 15:07 | 作業開始 | ユーザーからの要求 | +| 2026-01-27 16:30 | 5.4_database_test.md に追記 | setUpDbはDB初期化機能であり、5.4はDBテスト専門ファイル。既存の「リクエスト単体テスト」セクション内に追加することで構造的に整合 | +| 2026-01-27 16:30 | README.md の更新は不要 | 既に「DB初期化」という表現でカバーされている | +| 2026-01-27 16:45 | 新しいブランチで作業をやり直し | feature/add-ntf-contextを起点に、feature/add-setupdb-contextブランチを作成 | +| 2026-01-27 16:55 | 実装例とユースケースを削除 | レビューコメントにより、他のセクションと重複するため削除 | +| 2026-01-27 17:00 | 作業完了 | PR #8 がマージされ、全ての作業が完了 | + +## 作業ログ + +### 2026-01-27 15:07 +- 作業ファイル作成 +- 既存コンテキストファイルの構造を確認: + - `5.0_test_basics.md`: テストの基礎(testShots、グループID、データタイプ) + - `5.3_batch_request_test.md`: バッチリクエスト単体テスト + - `5.4_database_test.md`: データベーステスト(SETUP_TABLE、EXPECTED_TABLE等) + - `5.7_file_test.md`: ファイルテスト +- WebFetchで公式ドキュメントから情報を取得済み + - setUpDbシートに共通初期データを記載 + - フレームワークが自動で各テストメソッド実行前に投入 + - テストケース固有データと組み合わせ可能 + +### 2026-01-27 16:30 +- `5.4_database_test.md` に「テストクラス共通のデータベース初期値(setUpDbシート)」セクションを追加 + - 追記位置: リクエスト単体テストセクション内、トランザクション制御の後(196行目以降) + - 内容: + - setUpDbシートの概要と特徴 + - setUpTableとの違い(比較表付き) + - 実装例(JavaコードとExcelファイル構成) + - ユースケース(マスターデータ、外部キー親テーブル、認証データ) +- `context/README.md` の確認: 既に「DB初期化」でカバーされているため更新不要と判断 +- 作業管理ファイル更新: チェックリスト、決定事項、ステータスを更新 + +### 2026-01-27 16:45 +- ユーザーの指摘により、作業ブランチの作成方法を修正 +- PR #7 をクローズし、feature/add-ntf-contextブランチをリセット +- feature/add-setupdb-contextブランチを新規作成 +- 変更内容を再適用 + +### 2026-01-27 16:50 +- Git commit実行(コミット: 7a072aa) +- origin/feature/add-setupdb-context にpush +- PR #8 を作成(ベースブランチ: feature/add-ntf-context): https://github.com/kiyotis/nablarch-tools-for-ai/pull/8 +- 作業管理ファイル更新: PR情報追加、ステータス更新 + +### 2026-01-27 16:55 +- /resolve-pr スキルでレビューコメントに対応 +- レビューコメント「実装例とユースケースは他と重複するので削除しましょう。」を受けて修正 +- 実装例セクション(line 226-282)とユースケースセクション(line 285-302)を削除 +- コミット: 4c9ee18 +- 再レビュー依頼完了 + +### 2026-01-27 17:00 +- PR #8 がマージされ、feature/add-ntf-contextブランチに統合 +- 作業管理ファイルのステータスを完了に更新 +- ローカルブランチ feature/add-setupdb-context を削除 +- リモートブランチ origin/feature/add-setupdb-context を削除 +- 全ての作業が完了 + +## 備考 + +### 取得済みの情報(WebFetch結果) +- setUpDbシートを作成し、共通データベース初期値を定義 +- フレームワークが各テストメソッド実行時に自動注入 +- testShotsのsetUpTableと組み合わせて使用可能(共通 + ケース固有) diff --git a/.work/2026-01-27_work-skill-approval-flow.md b/.work/2026-01-27_work-skill-approval-flow.md new file mode 100644 index 0000000..c6c0868 --- /dev/null +++ b/.work/2026-01-27_work-skill-approval-flow.md @@ -0,0 +1,226 @@ +# workスキル承認フロー改善 作業管理 + +## ステータス + +⏰ **最終更新**: 2026-01-29 12:15 + +🎯 **進捗率**: 100% + +📍 **フェーズ**: 完了 + +📂 **成果物**: +- `.claude/skills/work/SKILL.md` - ユーザー承認と固定チェックリストを追加 +- `.claude/skills/work/workflows.md` - 承認フローとPR関連手順を追加 +- `.claude/skills/work/template.md` - 固定チェックリストをテンプレート化 +- `.claude/skills/work/terminology.md` - 作業開始・完了の処理を詳細化 +- `.work/2026-01-27_work-skill-approval-flow.md` - 作業管理ファイル + +⚠️ **残課題**: +- なし + +--- + +## 基本情報 +- **開始日時**: 2026-01-27 14:30 +- **作業者**: Claude +- **関連Issue/PR**: なし + +## 作業指示 + +workスキルの作業開始フローを改善し、承認プロセスを組み込む。また、全作業に共通する固定チェックリストを定義して、作業の標準化を図る。 + +### 背景 +- 現状、作業ファイル作成後すぐに作業を開始してしまい、ユーザーの承認を得ていない +- 作業フローが個別最適化されており、PR作成やレビュー対応などの標準手順が明示されていない +- 作業完了後のクリーンアップ(ブランチ削除など)が漏れやすい + +### 目標 +1. 作業開始時に必ずユーザーの承認を得る仕組みを導入 +2. 全作業に共通する固定チェックリストを定義 +3. 関連ドキュメントを更新して全体整合性を確保 + +## 作業計画(チェックリスト) + +### フェーズ1: 要件整理と設計 +- [x] 現状のworkスキルの問題点を整理 +- [x] 固定チェックリストの項目と順序を確定 +- [x] 承認フローの具体的な実装方法を決定 +- [x] 各フローでの固定チェックリストの適用方法を設計 + +### フェーズ2: 実装 +- [x] workflows.mdの「作業開始時の処理」を更新 + - ステップ4「ユーザー承認」の詳細化 + - ファイル内容表示と口頭確認の手順を追加 +- [x] workflows.mdの「作業完了時の処理」を更新 + - PR作成・レビュー対応・マージ・ブランチ削除の手順を追加 +- [x] workflows.mdに新セクション「7. PR作成とマージ」を追加 + - 詳細な手順とトラブルシューティングを記載 +- [x] template.mdに固定チェックリストを追加 + - 作業開始時3項目、作業完了時6項目を追加 + - 個別タスクと固定タスクの区別を明確化 +- [x] SKILL.mdを更新 + - 作業開始フローに「ユーザー承認」を追加 + - 作業完了フローに「PR作成・レビュー・マージ」を追加 + - 固定チェックリストの説明を追加 + +### フェーズ3: 整合性確認と改善 +- [x] terminology.mdとの整合性確認 +- [x] 各ドキュメント間のリンクを確認 +- [x] サンプル作業ファイルで動作確認 +- [x] 不整合や改善点があれば修正 + +### フェーズ4: PR作成と完了(固定チェックリスト) +- [x] PR作成とレビュー依頼 +- [x] PRレビュー対応(resolve-prスキル使用、ユーザー承認まで繰り返し) +- [x] ユーザーのPR承認確認 +- [x] PRマージ +- [x] 作業ブランチの削除(ローカル・リモート) + +## 固定チェックリストの提案 + +以下は全作業に共通して含める固定チェックリスト項目です: + +### 作業開始時(最初に実行) +1. **作業内容のヒアリングと作業ファイル作成** +2. **作業ファイルの承認** + - ファイル内容を表示 + - ユーザーに「この内容で進めてよいですか?」と口頭確認 + - 修正が必要な場合は修正後、再度承認を得る +3. **作業ブランチの作成** + - ブランチ名を提案(例: `feature/作業名`) + - `git checkout -b branch-name`を実行 + +### 作業中(個別タスク) +- [ここに作業固有のタスクが入る] +- 例: + - [ ] 要件調査 + - [ ] 設計書作成 + - [ ] 実装 + - [ ] テスト作成 + +### 作業完了時(最後に実行) +4. **PR作成とレビュー依頼** + - 変更内容をコミット + - PRを作成 + - レビュー依頼メッセージを記載 +5. **PRレビュー対応** + - resolve-prスキルを使用してレビュー指摘に対応 + - ユーザーの承認が得られるまで繰り返し +6. **ユーザーのPR承認確認** + - 「PRが承認されました」の確認 + - 承認されていない場合は手順5に戻る +7. **作業完了フローの実行** + - 作業ファイルのステータスを「完了」に更新 + - 最終コミットとプッシュ +8. **PRマージ** + - `gh pr merge`コマンドでマージ + - マージ方法(merge/squash/rebase)を確認 +9. **作業ブランチの削除** + - ローカルブランチ削除: `git branch -d branch-name` + - リモートブランチ削除: `git push origin --delete branch-name` + +### チェックリストの配置ルール +- 作業開始時の固定項目(1-3)は常に最初に配置 +- 作業中の個別タスクは中間に配置 +- 作業完了時の固定項目(4-9)は常に最後に配置 + +## 決定事項 +| 日時 | 決定内容 | 理由 | +|:-----|:---------|:-----| +| 2026-01-27 14:30 | 承認方法は「ファイル内容表示→口頭確認」 | シンプルで確実。AskUserQuestionより柔軟 | +| 2026-01-27 14:30 | 既存の2026-01-22作業は触らず新規作業として開始 | 履歴保持のため、過去の作業ファイルは残す | +| 2026-01-27 14:30 | 固定チェックリストは作業開始・完了の両端に配置 | 個別タスクと区別しやすく、標準化しやすい | + +## 作業ログ +### 2026-01-29 12:15 - 作業完了 +- PR #9をSquashマージで完了 +- 作業ブランチを削除: + - リモートブランチ: `origin/feature/work-skill-approval-flow` 削除完了 + - ローカルブランチ: `feature/work-skill-approval-flow` 削除完了 +- 全チェックリスト完了(進捗100%) +- ベースブランチ `feature/add-ntf-context` に統合済み + +**成果**: +- workスキルに承認フローと固定チェックリストを導入 +- 作業開始時のユーザー承認を必須化 +- PR作成・レビュー対応・マージ・ブランチ削除の標準手順を追加 +- 全ドキュメントの整合性を確保 +- Claude Code公式ベストプラクティスに準拠 + +### 2026-01-29 12:10 - ベストプラクティス対応完了 +- Claude Code公式のスキル作成ベストプラクティスでチェック +- 検出された問題点: + 1. descriptionが不十分(トリガーフレーズがない) + 2. $ARGUMENTSの使用方法が本文に記載されていない +- SKILL.mdを修正: + - descriptionに具体的なトリガーフレーズを追加(「作業開始」「作業再開」等) + - $ARGUMENTSの処理を「1. 準備」セクションに追加 +- ベストプラクティス適合を確認: + - SKILL.md長さ: 108行(推奨500行以下)✅ + - 詳細分割: workflows.md(710行)に分割済み✅ + - disable-model-invocation: true ✅ + - allowed-tools: 適切✅ + - サポートファイル参照: 明示的✅ +- 次回: 変更をコミットしてPRに追加 + +### 2026-01-29 11:55 - フェーズ3完了 +- terminology.mdを更新: + - 作業開始の処理内容を詳細化(4ステップ+固定チェックリスト) + - 作業完了の処理内容を詳細化(8ステップ+固定チェックリスト+完了条件) +- ドキュメント間リンクを確認(全て正常) +- 固定チェックリストの整合性を確認 +- 不整合を修正: + - 「作業完了フローの実行」をチェックリストから削除(内部処理のため) + - terminology.md、template.md、作業ファイルを統一 +- 次回: フェーズ4のPR作成・レビュー・マージ + +### 2026-01-29 11:45 - フェーズ2完了 +- workflows.mdを大幅更新: + - 「3. 作業開始時の処理」のステップ4承認フローを詳細化(5ステップに拡張) + - 「6. 作業完了時の処理」にPR関連ステップを追加(ステップ9-14) + - 新セクション「7. PR作成とマージ」を追加(詳細手順・チェックリスト・トラブルシューティング) +- template.mdを更新: + - 固定チェックリストを追加(作業開始時3項目、作業完了時6項目) + - 個別タスクセクションを明確に区別 +- SKILL.mdを更新: + - 「ユーザー承認」セクションを新規追加 + - 「チェックリスト駆動」に固定チェックリストの説明を追加 + - 実行フローの説明を更新(承認とPR関連を明記) +- 次回: フェーズ3の整合性確認 + +### 2026-01-29 11:30 - フェーズ1完了、フェーズ2開始 +- 現状分析を実施し、4つの主要問題を特定: + 1. 承認フローが不明確(workflows.md:84の記載が1行のみ) + 2. 固定チェックリストが存在しない + 3. PR関連フロー(作成・レビュー対応・マージ)が欠落 + 4. ブランチ削除フローが欠落 +- 固定チェックリストの構成を確定(作業開始3項目、作業完了6項目) +- 承認方法を具体化(ファイル内容表示→口頭確認→必要なら修正→再承認) +- template.mdとworkflows.mdの更新方針を設計 +- 次回: フェーズ2の実装(workflows.md、template.md、SKILL.mdの更新) + +### 2026-01-27 14:35 - 作業中断(本日終了) +- 作業ファイルの承認を取得 +- 作業ブランチ `feature/work-skill-approval-flow` を作成 +- 作業ファイルをコミット&プッシュ +- 次回: フェーズ1から実装開始 + +### 2026-01-27 14:30 - 作業ファイル作成 +- ユーザーからworkスキル改善の要望をヒアリング +- 要件を整理して作業ファイルを作成 +- 固定チェックリストの構成を提案 +- ユーザーの承認を取得 + +## 備考 + +### 参考: 現在のworkスキル構成 +- `.claude/skills/work/SKILL.md` - メインドキュメント +- `.claude/skills/work/workflows.md` - 詳細ワークフロー +- `.claude/skills/work/template.md` - 作業ファイルテンプレート +- `.claude/skills/work/terminology.md` - 用語定義 + +### 改善ポイント +1. **承認フロー**: 作業ファイル作成後、承認を得てから作業開始 +2. **固定チェックリスト**: 全作業共通の手順を標準化 +3. **resolve-prスキル連携**: PRレビュー対応の自動化 +4. **クリーンアップ**: 作業完了後のブランチ削除を標準化 diff --git a/context/5_test/5.0_test_basics.md b/context/5_test/5.0_test_basics.md new file mode 100644 index 0000000..937e4e9 --- /dev/null +++ b/context/5_test/5.0_test_basics.md @@ -0,0 +1,558 @@ +# 5.0 テストの基礎 + +## 概要 + +Nablarch Testing Framework(NTF)は、Nablarchアプリケーションのテストを支援するフレームワークです。 + +**特徴**: +- テストデータをExcelファイルで管理 +- データベースやファイルの準備・検証を自動化 +- リクエスト単体テスト、クラス単体テスト等をサポート + +**このファイルで説明する内容**: +- Excelファイルの基本(配置、シート構造、データタイプ) +- リクエスト単体テストの基本形(testShots、グループID) +- データ記述のルールとよくある間違い + +各処理方式(Batch/REST/Web)固有の内容は、それぞれのファイル(5.3、5.2、5.1)で説明します。 + +## 目次 + +1. **テストクラスとExcelファイルの対応**: テストクラス、Excelファイル、シートの関係 +2. **リクエスト単体テストのExcelシート基本形**: testShots、3つの基本要素、グループID +3. **データタイプの基礎**: 基本書式、データタイプ一覧、各データタイプの詳細 +4. **データ記述の重要ルール**: データタイプごとにまとめる +5. **セルの書式設定**: 全セルを文字列形式に +6. **マーカーカラム**: テストデータに含めない列 +7. **セル内の特殊記法**: null値、日付、変数記法、改行コード +8. **コメント機能**: //以降を読み込み対象外に +9. **テストの独立性**: 実行順序に依存しない設計 +10. **よくある間違い**: 5つの典型的なミスとその対策 + +## テストクラスとExcelファイルの対応 + +### テストクラスの基本構造 + +NTFを使用したテストクラスは、専用の基底クラスを継承して作成します。 + +```java +public class UserBatchActionTest extends BatchRequestTestSupport { + @Test + public void testInsert() { + execute(); + } + + @Test + public void testUpdate() { + execute(); + } +} +``` + +**ポイント**: +- 処理方式に応じた基底クラスを継承(`BatchRequestTestSupport`、`RestTestSupport`、`HttpRequestTestSupport`等) +- テストメソッドには`@Test`アノテーションを付ける +- `execute()`メソッドがExcelファイルからテストデータを読み込んで実行 + +### テストクラスとExcelファイルの配置 + +``` +src/test/java/com/example/batch/ + UserBatchActionTest.java # テストクラス + UserBatchActionTest.xlsx # Excelファイル +``` + +**ルール**: +- Excelファイル名 = テストクラス名(拡張子のみ異なる) +- テストクラスと同じディレクトリに配置 +- Excel 2003(.xls)および2007以降(.xlsx)をサポート + +> **注意**: Nablarch公式ドキュメントでは`src/test/resources`配下への配置が標準とされていますが、実際の開発現場ではソースコードと同じディレクトリに配置することでメンテナンス性を高める運用が行われています。 + +### テストメソッドとシートの対応 + +1つのExcelファイルには、複数のシートを作成します。各シートは1つのテストメソッドに対応します。 + +**ルール**: +- 1テストメソッド = 1シート +- シート名 = テストメソッド名 + +**例**: + +| Javaコード | Excelシート | +|-----------|------------| +| `testInsert()` | シート名: `testInsert` | +| `testUpdate()` | シート名: `testUpdate` | + +`execute()`メソッドは、呼び出し元のテストメソッド名と同じ名前のシートを自動的に読み込みます。 + +**利点**: +- 1つのExcelファイルで関連するテストをまとめて管理 +- テストメソッド追加時は、同名のシートを追加するだけ + +## リクエスト単体テストのExcelシート基本形 + +### 概要 + +リクエスト単体テスト(Batch/REST/Web)で使用するExcelシートは、共通の基本構造を持ちます。 +本セクションでは、3つの基本要素とグループIDによる紐付けを説明します。 + +### 3つの基本要素 + +リクエスト単体テストのExcelシートは、以下の3要素で構成されます。 + +1. **テストケース(LIST_MAP=testShots)**: どのテストを実行するかを定義 +2. **テストデータ準備(SETUP_XXX)**: テスト実行前にDBやファイルを準備 +3. **期待値(EXPECTED_XXX)**: テスト実行後にDBやファイルを検証 + +これら3要素をグループIDで紐づけることで、1つのテストケースで複数のテーブルやファイルを扱えます。 + +以下、各要素の詳細を説明します。 + +#### 1. テストケース(LIST_MAP=testShots) + +testShotsは**データタイプの値**で、どのテストを実行するかを定義します。 + +**Excelシート例**: + +| データタイプ=値 | | | | | +|---------------|---|---|---|---| +| **LIST_MAP=testShots** | | | | | +| **no** | **description** | **expectedStatusCode** | **setUpTable** | **expectedTable** | +| 1 | 正常系_単一テーブル | 0 | case1 | case1 | + +**共通カラム例**: +- `no`: テストケース番号 +- `description`: テストケースの説明 +- `expectedStatusCode`: 期待するステータスコード + +**準備・検証を紐づけるカラム**: +- `setUpTable`: テストデータ準備(テーブル)のグループID +- `expectedTable`: 期待値(テーブル)のグループID +- `setUpFile`: テストデータ準備(ファイル)のグループID +- `expectedFile`: 期待値(ファイル)のグループID + +**処理方式による違い**: +- **Batch**: `diConfig`、`requestPath`、`userId`等のカラムが必要 +- **REST**: `uri`、`httpMethod`等のカラムが必要 +- **Web**: `uri`、`httpMethod`等のカラムが必要 + +詳細は各処理方式のファイル(5.3 Batch、5.2 REST、5.1 Web)を参照してください。 + +#### 2. テストデータ準備(SETUP_XXX) + +SETUP_TABLE、SETUP_FIXED、SETUP_VARIABLE等の**データタイプ**(大文字)を使用して、テスト実行前にDBやファイルを準備します。 + +testShotsの`setUpTable`、`setUpFile`等のカラムで指定したグループIDで紐付けます。 + +#### 3. 期待値(EXPECTED_XXX) + +EXPECTED_TABLE、EXPECTED_FIXED、EXPECTED_VARIABLE等の**データタイプ**(大文字)を使用して、テスト実行後にDBやファイルを検証します。 + +testShotsの`expectedTable`、`expectedFile`等のカラムで指定したグループIDで紐付けます。 + +### グループID + +**役割**: +複数のSETUP_XXX/EXPECTED_XXXデータタイプを1つのテストケースに紐づけるための識別子。 + +**定義方法**: +testShotsのカラム値として指定します。例: `setUpTable=case1`の「case1」がグループID。 + +**記法**: +``` +SETUP_TABLE[グループID]=テーブル名 +EXPECTED_TABLE[グループID]=テーブル名 +``` + +**利点**: +1つのテストケースで複数テーブル・複数ファイルを扱えます。 + +### Excel例(複数テーブルの紐付け) + +**Excelシート例**: + +| データタイプ=値 | | | | | +|---------------|---|---|---|---| +| **LIST_MAP=testShots** | | | | | +| **no** | **description** | **expectedStatusCode** | **setUpTable** | **expectedTable** | +| 1 | 正常系_複数テーブル | 0 | case1 | case1 | + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE[case1]=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 1 | + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE[case1]=ORDER_MST** | | | +| **ORDER_ID** | **USER_ID** | **AMOUNT** | +| O001 | U001 | 1000 | + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE[case1]=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 2 | + +| データタイプ=値 | | +|---------------|---| +| **EXPECTED_TABLE[case1]=ORDER_MST** | | +| **ORDER_ID** | **STATUS** | +| O001 | 9 | + +グループID「case1」により、USER_MSTとORDER_MSTの準備・検証がno=1のテストケースに紐付けられます。 + +### 重要な注意点 + +- **testShots**: データタイプの値(LIST_MAP=testShots) +- **SETUP_XXX、EXPECTED_XXX**: データタイプ(大文字) +- **グループID**: 任意の文字列(シート内で一意) + +## データタイプの基礎 + +### 基本書式 + +``` +データタイプ=値 +(2行目以降はデータタイプにより異なる) +``` + +**データタイプ**: そのデータが何を表すかを特定する予約語 + +### データタイプ一覧 + +| データタイプ名 | 説明 | 値 | +|--------------|------|-----| +| **SETUP_TABLE** | テスト実行前にDBに登録 | テーブル名 | +| **EXPECTED_TABLE** | テスト後の期待値(省略カラムは比較対象外) | テーブル名 | +| **EXPECTED_COMPLETE_TABLE** | テスト後の期待値(省略カラムはデフォルト値として扱う) | テーブル名 | +| **LIST_MAP** | List>形式 | シート内で一意のID | +| **SETUP_FIXED** | 事前準備用固定長ファイル | ファイルパス | +| **EXPECTED_FIXED** | 期待値固定長ファイル | ファイルパス | +| **SETUP_VARIABLE** | 事前準備用可変長ファイル | ファイルパス | +| **EXPECTED_VARIABLE** | 期待値可変長ファイル | ファイルパス | +| **MESSAGE** | メッセージング処理用 | setUpMessages / expectedMessages | +| **EXPECTED_REQUEST_HEADER_MESSAGES** | 要求電文ヘッダ期待値 | リクエストID | +| **EXPECTED_REQUEST_BODY_MESSAGES** | 要求電文本文期待値 | リクエストID | +| **RESPONSE_HEADER_MESSAGES** | 応答電文ヘッダ | リクエストID | +| **RESPONSE_BODY_MESSAGES** | 応答電文本文 | リクエストID | + +> **参照**: データベーステスト用のデータタイプ(SETUP_TABLE、EXPECTED_TABLE、EXPECTED_COMPLETE_TABLE)の詳細については、[5.4 データベーステスト](5.4_database_test.md) を参照してください。 + +### SETUP_TABLE + +**Excelシート例**: + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 1 | +| U002 | 佐藤花子 | 1 | + +テスト実行前に、USER_MSTテーブルに2件のデータが登録される。 + +**重要**: +- **主キーカラムは必須**:テーブルの主キーカラムは省略できません +- 非主キーカラムは省略可能(省略時はデフォルト値が設定される) + +### EXPECTED_TABLE + +**Excelシート例**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 2 | +| U002 | 佐藤花子 | 2 | + +テスト実行後、USER_MSTテーブルのデータが期待値と一致するか検証。 +省略したカラムは比較対象外。 + +**重要**: +- **主キーカラムは必須**:レコードの突合に使用されるため、主キーカラムは省略できません +- レコードの順序は不問(主キーで突合するため記述順序は自由) + +### EXPECTED_COMPLETE_TABLE + +**Excelシート例**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_COMPLETE_TABLE=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 2 | + +省略したカラムにはデフォルト値が設定されているものとして扱われる。 + +**デフォルト値の規則**: +- **数値型**: 0 +- **文字列型**: 半角スペース +- **日付型**: 1970-01-01(エポック時刻) +- **Timestamp型**: `yyyy-MM-dd HH:mm:ss.fffffffff` 形式(ナノ秒まで対応) + +### LIST_MAP + +**Excelシート例**: + +| データタイプ=値 | | | +|---------------|---|---| +| **LIST_MAP=testData** | | | +| **key** | **value** | **type** | +| user01 | 山田太郎 | 1 | +| user02 | 佐藤花子 | 2 | + +List>形式のデータ。シート内で一意のIDを指定。 + +### SETUP_FIXED / EXPECTED_FIXED + +**Excelシート例**: + +| データタイプ=値 | +|---------------| +| **SETUP_FIXED=src/test/data/input.dat** | + +| データタイプ=値 | +|---------------| +| **EXPECTED_FIXED=src/test/data/expected.dat** | + +固定長ファイルの準備・検証。 + +### SETUP_VARIABLE / EXPECTED_VARIABLE + +**Excelシート例**: + +| データタイプ=値 | +|---------------| +| **SETUP_VARIABLE=src/test/data/input.csv** | + +| データタイプ=値 | +|---------------| +| **EXPECTED_VARIABLE=src/test/data/expected.csv** | + +可変長ファイルの準備・検証。 + +### ログ検証用LIST_MAP + +リクエスト単体テストでログメッセージを検証する場合、LIST_MAP形式でログの期待値を定義します。 + +**Excelシート例**: + +| データタイプ=値 | | +|---------------|---| +| **LIST_MAP=expectedLogMessages** | | +| **logLevel** | **message** | +| INFO | バッチ処理を開始します。 requestPath=\[ImportUserBatch\] | +| INFO | バッチ処理が正常に終了しました。 recordCount=\[100\] | + +| データタイプ=値 | | +|---------------|---| +| **LIST_MAP=expectedErrorLog** | | +| **logLevel** | **message** | +| ERROR | ユーザー名は必須です。 行番号=\[1\] | +| WARN | バッチ処理がエラーで終了しました。 | + +**カラム**: +- `logLevel`: ログレベル(INFO、WARN、ERROR等) +- `message`: ログメッセージ(完全一致で検証される) + +**重要**: +- ログメッセージは完全一致で検証されます +- 角括弧`[]`等の特殊文字は`\[`のようにエスケープが必要な場合があります +- testShotsの`expectedLog`カラムでLIST_MAP IDを指定して使用します + +## データ記述の重要ルール + +### データタイプごとにまとめる + +❌ **誤り(混在)**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=TABLE1** | | | +| USER_ID | USER_NAME | | +| U001 | 山田太郎 | | + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_COMPLETE_TABLE=TABLE2** | | | +| ORDER_ID | AMOUNT | | +| O001 | 1000 | | + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=TABLE3** | | | +| ITEM_ID | ITEM_NAME | | +| I001 | 商品A | | + +データの読み込みが途中で終了し、テストが正しく実行されない。 + +✅ **正しい(まとめて記述)**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=TABLE1** | | | +| USER_ID | USER_NAME | | +| U001 | 山田太郎 | | + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=TABLE3** | | | +| ITEM_ID | ITEM_NAME | | +| I001 | 商品A | | + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_COMPLETE_TABLE=TABLE2** | | | +| ORDER_ID | AMOUNT | | +| O001 | 1000 | | + +同じデータタイプをまとめて記述。 + +## セルの書式設定 + +> **重要**: テストデータ作成前に、全てのセルの書式を**文字列**に設定すること + +**設定方法**: +1. Excel全体を選択(Ctrl+A) +2. セルの書式設定で「文字列」を選択 +3. データを入力 + +**理由**: 数値や日付の自動変換を防ぐため + +## マーカーカラム + +テストデータには含めないが、Excel上の見易さのために記述する列。 + +**書式**: カラム名を半角角括弧で囲む `[カラム名]` + +**Excelシート例**: + +| データタイプ=値 | | | | +|---------------|---|---|---| +| **SETUP_TABLE=USER_MST** | | | | +| **[no]** | **USER_ID** | **USER_NAME** | **STATUS** | +| 1 | U001 | 山田太郎 | 1 | +| 2 | U002 | 佐藤花子 | 1 | + +`[no]`列はテスト実行時に読み込まれない。 + +## セル内の特殊記法 + +| 記述 | 変換結果 | 用途 | +|------|---------|------| +| **null値** | | | +| null、NULL | null値 | DBのNULL値を登録・検証したい場合 | +| "null"、"NULL" | 文字列"null" | 文字列として"null"という値を扱いたい場合 | +| **ダブルクォート囲み** | | | +| " 山田 " | 「 山田 」 | 前後の空白を明示的に設定したい場合 | +| "" | 空文字列 | 空文字列とNULLを区別したい場合 | +| """ | 「"」 | ダブルクォート文字そのものを指定したい場合 | +| **日付** | | | +| yyyyMMddHHmmssSSS | 例: 20240101123045123 | ミリ秒まで含む日時を指定したい場合 | +| yyyy-MM-dd HH:mm:ss.SSS | 例: 2024-01-01 12:30:45.123 | 可読性の高い形式で日時を指定したい場合 | +| yyyyMMddHHmmss | 例: 20240101123045 | 秒単位の日時を指定したい場合 | +| yyyyMMdd | 例: 20240101 | 日付のみを指定したい場合 | +| yyyy-MM-dd | 例: 2024-01-01 | 可読性の高い形式で日付のみを指定したい場合 | +| **変数記法** | | | +| ${systemTime} | システム日時 | テスト実行時の現在時刻を記録したい場合 | +| ${updateTime} | システム日時 | 更新日時の期待値を検証したい場合(${systemTime}の別名) | +| ${setUpTime} | 固定日時 | 複数レコードで同じ日時を設定したい場合 | +| ${文字種,文字数} | ランダム生成文字列 | 最大長テストや大量データ生成が必要な場合。指定文字種: 半角英字、半角数字、半角記号、半角カナ、全角英字、全角数字、全角ひらがな、全角カタカナ、全角漢字、全角記号その他、外字 | +| ${binaryFile:ファイルパス} | バイナリデータ | 画像・PDF等のバイナリデータをBLOB列でテストしたい場合 | +| **改行コード** | | | +| \\r | CR(0x0D) | 改行コードを含むデータをテストしたい場合 | +| \\n | LF(0x0A) | 改行コードを含むデータをテストしたい場合 | +| **エスケープ** | | | +| \\, | カンマ「,」 | カンマ区切りの値でカンマ自体を含めたい場合 | +| \\\\ | バックスラッシュ「\\」 | バックスラッシュ自体を値に含めたい場合 | +| **空行** | | | +| "" | 空行 | 可変長ファイルで空行を表現したい場合(完全な空行は無視される) | + +**重要**: +- ダブルクォートで囲まれた文字列は、前後のダブルクォートが自動的に取り除かれます +- 完全な空行(全てのセルが空)はフレームワークにより無視されます +- 可変長ファイルで空行を表現する場合は、左端のセルに`""`を記載することを推奨します + +## コメント機能 + +`//` から開始する文字列をセルに記述すると、そのセルから右のセルは全て読み込み対象外。 + +**Excelシート例**: + +| SETUP_TABLE=USER_MST | | | | | +|---------------------|---|---|---|---| +| **USER_ID** | **USER_NAME** | **STATUS** | **// コメント** | **備考** | +| U001 | 山田太郎 | 1 | // テスト用 | この列も無視される | +| U002 | 佐藤花子 | 1 | | | + +`// コメント`以降の列(備考)は読み込まれない。 + +## テストの独立性 + +> **重要**: テストメソッドの実行順序によって、テスト結果が変わらないように留意する + +**実装のポイント**: +- テスト内で必要な事前条件はテストクラス内で全て準備 +- 他のテストメソッドの実行結果に依存しない +- マスタデータは共通Excelファイルで一元管理 + +```java +@Test +public void testInsert() { + // このテスト固有の事前データをExcelで準備 + execute(); +} + +@Test +public void testUpdate() { + // testInsertの結果に依存せず、独立したデータを準備 + execute(); +} +``` + +## よくある間違い + +### セルの書式が文字列でない + +❌ Excelの自動変換で意図しないデータになる: +- `001` → `1` +- `2024-01-01` → 日付型 +- `1E10` → 科学的記数法 + +✅ 全セルを文字列形式に設定してから入力 + +### データタイプが混在 + +❌ EXPECTED_TABLE → EXPECTED_COMPLETE_TABLE → EXPECTED_TABLE + +✅ 同じデータタイプをまとめて記述 + +### ファイル配置ミス + +❌ パッケージ不一致: +``` +src/test/java/com/example/UserTest.java +src/test/resources/UserTest.xlsx # NG +``` + +✅ パッケージ一致: +``` +src/test/java/com/example/UserTest.java +src/test/resources/com/example/UserTest.xlsx # OK +``` + +### マーカーカラムの誤用 + +❌ 全角角括弧: `[no]` +✅ 半角角括弧: `[no]` + +### null値の誤記述 + +| 意図 | 誤り | 正しい | +|------|------|--------| +| NULL値 | NULL(全角) | null(半角) | +| 文字列"null" | null | "null" | diff --git a/context/5_test/5.3_batch_request_test.md b/context/5_test/5.3_batch_request_test.md new file mode 100644 index 0000000..76fc3c5 --- /dev/null +++ b/context/5_test/5.3_batch_request_test.md @@ -0,0 +1,216 @@ +# 5.3 リクエスト単体テスト(Batch) + +## 概要 + +BatchRequestTestSupportを継承したテストクラスで、Excelシートにテストケースを記述することで以下を自動実行: + +- DB初期データ投入 +- 入力ファイル配置 +- BatchAction実行 +- DB期待値検証 +- 出力ファイル検証 +- ログメッセージ検証 + +**テストコードは`execute()`を呼ぶだけ。テストロジックはExcelで管理。** + +## テストクラスの基本構造 + +### 継承とクラス定義 + +```java +package com.example.batch; + +import nablarch.test.core.batch.BatchRequestTestSupport; +import org.junit.Test; + +// テスト対象Actionと同じパッケージに配置 +public class UserBatchActionRequestTest extends BatchRequestTestSupport { + + @Test + public void testNormalCase() { + execute(); // メソッド名と同名のExcelシートを実行 + } + + @Test + public void testErrorCase() { + execute(); // シート名: testErrorCase + } +} +``` + +### 命名規則 + +| 項目 | 規則 | 例 | +|------|------|-----| +| テストクラス名 | `RequestTest` | UserBatchActionRequestTest | +| パッケージ | テスト対象と同じ | com.example.batch | +| Excelファイル名 | テストクラスと同名 | UserBatchActionRequestTest.xlsx | + +### execute()メソッド + +```java +// パターン1: メソッド名=シート名(推奨) +@Test +public void testProcessSuccess() { + execute(); // シート名 "testProcessSuccess" を自動使用 +} + +// パターン2: 明示的なシート名指定 +@Test +public void testCase01() { + execute("testProcessSuccess"); // シート名を明示 +} +``` + +## testShotsカラム一覧 + +testShotsで使用できるカラムの全体像を示します。共通カラムとBatch固有カラムを区別して理解することで、実装時に必要なカラムが明確になります。 + +### 全カラム一覧 + +| カラム名 | 区分 | 説明 | 例 | 必須 | +|---------|------|------|-----|------| +| **no** | 共通 | テストケース番号 | 1 | ○ | +| **description** | 共通 | テストケースの説明 | 正常系_DB更新 | ○ | +| **diConfig** | Batch | DIコンフィグファイルパス | batch-config.xml | ○ | +| **requestPath** | Batch | バッチ起動用のリクエストパス | UserBatch | ○ | +| **userId** | Batch | 実行ユーザーID | batch_user | ○ | +| **args[0]**, **args[1]**... | Batch | コマンドライン引数 | input.csv | | +| **任意カラム** | Batch | コマンドラインオプション | valueA | | +| **expectedStatusCode** | 共通 | 期待するステータスコード | 0 | | +| **setUpTable** | 共通 | テストデータ(テーブル)のグループID | case1 | | +| **expectedTable** | 共通 | 期待値(テーブル)のグループID | case1 | | +| **setUpFile** | 共通 | テストデータ(ファイル)のグループID | fileCase1 | | +| **expectedFile** | 共通 | 期待値(ファイル)のグループID | fileCase1 | | +| **expectedLog** | 共通 | ログメッセージの期待値グループID | errorLog | | + +**Batch固有カラムの補足**: +- **diConfig**: DIコンフィグファイルのパス(src/test/resources/からの相対パス) +- **requestPath**: DIコンフィグファイル内のcomponent name(クラス名ではない) +- **userId**: バッチ実行時のユーザーID(コマンドライン引数の第1引数に相当) +- **args[n]**: コマンドライン引数(第2引数以降)を`args[0]`、`args[1]`...で指定 +- **任意カラム**: args[n]以外のカラムは`-カラム名=値`形式のオプションとして渡される + +**共通カラムの詳細**: 5.0「テストの基礎」を参照してください。 + +### コマンドライン引数とオプション + +バッチ起動時にコマンドライン引数やオプションを渡す場合は、testShotsに追加のカラムを定義します。 + +#### コマンドライン引数 + +`args[n]`(nは0以上の連続した整数)形式のカラムで指定します。 + +| カラム名 | 説明 | 例 | +|---------|------|-----| +| **args[0]** | 第1引数 | input.csv | +| **args[1]** | 第2引数 | output.csv | +| **args[2]** | 第3引数 | 2024-01-01 | + +**重要**: 添字nは連続した整数である必要があります。 + +**testShots例**: + +| LIST_MAP=testShots | | | | | | | | +|-------------------|---|---|---|---|---|---|---| +| **no** | **description** | **diConfig** | **requestPath** | **userId** | **args[0]** | **args[1]** | **expectedStatusCode** | +| 1 | 入力ファイル指定 | batch-config.xml | FileBatch | batch_user | input.csv | output.csv | 0 | + +#### コマンドラインオプション + +`args[n]`以外の任意のカラム名で指定します。カラム名が`-カラム名=値`形式のオプションとして渡されます。 + +**testShots例**: + +| LIST_MAP=testShots | | | | | | | | +|-------------------|---|---|---|---|---|---|---| +| **no** | **description** | **diConfig** | **requestPath** | **userId** | **paramA** | **paramB** | **expectedStatusCode** | +| 1 | オプション指定 | batch-config.xml | ParamBatch | batch_user | valueA | valueB | 0 | + +上記の例では、`-paramA=valueA -paramB=valueB`というオプションが指定されます。 + +### testShotsの完全な例 + +**Excelシート**: + +| データタイプ=値 | | | | | | | | | +|---------------|---|---|---|---|---|---|---|---| +| **LIST_MAP=testShots** | | | | | | | | | +| **no** | **description** | **diConfig** | **requestPath** | **userId** | **expectedStatusCode** | **setUpTable** | **expectedTable** | **expectedLog** | +| 1 | 正常_ステータス更新 | batch-config.xml | UserStatusBatch | batch_user | 0 | setup1 | expected1 | | +| 2 | 異常_バリデーションエラー | batch-config.xml | ImportBatch | batch_user | 199 | setup2 | expected2 | errorLog | + +**カラム説明**: +- `diConfig`, `requestPath`, `userId`: Batch固有の必須カラム +- `expectedStatusCode`, `setUpTable`, `expectedTable`, `expectedLog`: 共通カラム(5.0参照) + +## 完全な実装例 + +### Javaコード + +```java +package com.example.batch; + +import nablarch.test.core.batch.BatchRequestTestSupport; +import org.junit.Test; + +public class UserStatusBatchActionRequestTest extends BatchRequestTestSupport { + + @Test + public void testUpdateStatus() { + execute(); + } +} +``` + +### Excelシート: testUpdateStatus + +**testShots**: + +| データタイプ=値 | | | | | | | | +|---------------|---|---|---|---|---|---|---| +| **LIST_MAP=testShots** | | | | | | | | +| **no** | **description** | **diConfig** | **requestPath** | **userId** | **expectedStatusCode** | **setUpTable** | **expectedTable** | +| 1 | 正常_複数テーブル更新 | batch-config.xml | UserStatusBatch | batch_user | 0 | case1 | case1 | + +**SETUP_TABLE**: + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE[case1]=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 1 | +| U002 | 佐藤花子 | 1 | + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE[case1]=ORDER_MST** | | | +| **ORDER_ID** | **USER_ID** | **AMOUNT** | +| O001 | U001 | 1000 | +| O002 | U002 | 2000 | + +**EXPECTED_TABLE**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE[case1]=USER_MST** | | | +| **USER_ID** | **USER_NAME** | **STATUS** | +| U001 | 山田太郎 | 2 | +| U002 | 佐藤花子 | 2 | + +| データタイプ=値 | | +|---------------|---| +| **EXPECTED_TABLE[case1]=ORDER_MST** | | +| **ORDER_ID** | **STATUS** | +| O001 | 9 | +| O002 | 9 | + +### 実行の流れ + +1. `execute()`呼び出し +2. グループID「case1」のSETUP_TABLEでUSER_MST、ORDER_MSTにデータ投入 +3. diConfig(batch-config.xml)でDIコンテナ初期化 +4. requestPath(UserStatusBatch)でBatchAction起動 +5. BatchAction実行(userId=batch_userで実行) +6. グループID「case1」のEXPECTED_TABLEでUSER_MST、ORDER_MSTを検証 +7. expectedStatusCode=0を検証 diff --git a/context/5_test/5.4_database_test.md b/context/5_test/5.4_database_test.md new file mode 100644 index 0000000..525d958 --- /dev/null +++ b/context/5_test/5.4_database_test.md @@ -0,0 +1,245 @@ +# 5.4 データベーステスト + +## 概要 + +データベーステストは、テスト実行前にデータベースに準備データを投入し、テスト実行後にデータベースの状態を検証する機能です。 + +### 適用範囲 + +- **クラス単体テスト**: データベースアクセスクラス(DAO)のテスト +- **リクエスト単体テスト**: バッチ/Web/RESTアクションのテスト + +### 本ドキュメントで説明する内容 + +- データタイプ(SETUP_TABLE、EXPECTED_TABLE、EXPECTED_COMPLETE_TABLE)の詳細 +- クラス単体テストとリクエスト単体テストでの使用方法 +- トランザクション制御の重要性 + +--- + +## データベーステスト用のデータタイプ + +### データタイプ + +| データタイプ | 省略カラムの扱い | 用途 | +|:-------------|:-----------------|:-----| +| **EXPECTED_TABLE** | 比較対象外 | 自動採番されるカラムを検証から除外したい場合 | +| **EXPECTED_COMPLETE_TABLE** | デフォルト値として扱われる | 無関係なカラムが更新されていないことも確認したい場合 | + +--- + +## クラス単体テストでの使用方法 + +### 基本パターン + +```java +import nablarch.test.core.db.DbAccessTestSupport; + +public class EmployeeDbAccessTest extends DbAccessTestSupport { + + @Test + public void testFindById() { + // 1. 準備データを投入 + setUpDb("testFindById"); + + // 2. テスト対象を実行 + EmployeeDbAccess target = new EmployeeDbAccess(); + SqlResultSet actual = target.findById("E001"); + + // 3. 期待値と比較 + assertTableEquals("testFindById", actual); + } +} +``` + +--- + +### トランザクション制御 + +> **重要**: Nablarchは複数種類のトランザクションを併用することが前提となっています。そのため、テスト対象クラス実行後にデータベースの内容を確認する際には、**トランザクションをコミットしなければなりません**。 + +詳細は「更新系テストの例(コミット必須パターン)」を参照してください。 + +--- + +### 実装例 + +#### 参照系テストの例 + +**Javaコード** (`EmployeeDbAccessTest.java`): +```java +public class EmployeeDbAccessTest extends DbAccessTestSupport { + + @Test + public void testFindById() { + // 準備データを投入 + setUpDb("testFindById"); + + // テスト対象を実行 + EmployeeDbAccess target = new EmployeeDbAccess(); + SqlResultSet actual = target.findById("E001"); + + // 期待値と比較(参照系なのでコミット不要) + assertTableEquals("testFindById", actual); + } +} +``` + +**Excelファイル** (`EmployeeDbAccessTest.xlsx` / シート名: `testFindById`): + +**準備データ**: + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE=EMPLOYEE** | | | +| **ID** | **EMP_NAME** | **STATUS** | +| E001 | 山田太郎 | 1 | +| E002 | 田中一郎 | 1 | + +**期待値**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_TABLE=EMPLOYEE** | | | +| **ID** | **EMP_NAME** | **STATUS** | +| E001 | 山田太郎 | 1 | + +--- + +#### 更新系テストの例(コミット必須パターン) + +**Javaコード** (`EmployeeDbAccessTest.java`): +```java +public class EmployeeDbAccessTest extends DbAccessTestSupport { + + @Test + public void testUpdateStatus() { + // 準備データを投入 + setUpDb("testUpdateStatus"); + + // テスト対象を実行 + EmployeeDbAccess target = new EmployeeDbAccess(); + int count = target.updateStatus("E001", 2); + + // ★★★ 更新系では必ずコミット ★★★ + commitTransactions(); + + // 期待値と比較 + assertTableEquals("testUpdateStatus"); + } +} +``` + +**Excelファイル** (`EmployeeDbAccessTest.xlsx` / シート名: `testUpdateStatus`): + +**準備データ**: + +| データタイプ=値 | | | +|---------------|---|---| +| **SETUP_TABLE=EMPLOYEE** | | | +| **ID** | **EMP_NAME** | **STATUS** | +| E001 | 山田太郎 | 1 | + +**期待値**: + +| データタイプ=値 | | | +|---------------|---|---| +| **EXPECTED_COMPLETE_TABLE=EMPLOYEE** | | | +| **ID** | **EMP_NAME** | **STATUS** | +| E001 | 山田太郎 | 2 | + +--- + +## リクエスト単体テストでの使用方法 + +### 基本パターン + +**テストクラスの継承**: + +```java +// バッチの場合 +import nablarch.test.core.batch.BatchRequestTestSupport; + +public class UserBatchActionTest extends BatchRequestTestSupport { + @Test + public void testInsert() { + execute(); // Excelから自動でテストを実行 + } +} +``` + +```java +// Webの場合 +import nablarch.test.core.http.HttpRequestTestSupport; + +public class UserRegisterActionTest extends HttpRequestTestSupport { + @Test + public void testRegister() { + execute(); + } +} +``` + +**execute()メソッドの動作**: + +1. testShotsシートから各テストケースを読み込む +2. `setUpTable`カラムで指定されたグループIDのSETUP_TABLEを投入 +3. テスト対象のアクションを実行 +4. `expectedTable`カラムで指定されたグループIDのEXPECTED_TABLEで検証 + +--- + +### トランザクション制御 + +リクエスト単体テストでは、**トランザクション制御はフレームワークが自動的に実行**します。 + +--- + +### テストクラス共通のデータベース初期値(setUpDbシート) + +#### 概要 + +テストクラス内の全テストメソッドで共通的に使用するデータベース初期値を定義する機能です。 + +**特徴**: +- シート名を `setUpDb` として作成 +- フレームワークが各テストメソッド実行前に自動投入 +- testShotsの`setUpTable`カラムと組み合わせて使用可能 + +#### setUpTableとの違い + +| 項目 | setUpDbシート | setUpTableカラム | +|:-----|:--------------|:-----------------| +| **適用範囲** | テストクラス全体(全メソッド共通) | 各テストケース個別 | +| **記述場所** | `setUpDb`という名前の専用シート | testShotsシートの`setUpTable`カラムで指定 | +| **投入タイミング** | 各テストメソッド実行前に自動投入 | testShotsで指定されたテストケース実行前 | +| **用途** | マスターデータ、外部キー親テーブル等 | テストケース固有の準備データ | + +**組み合わせ使用**: +両者は組み合わせて使用できます。実行順序は以下の通り: +1. setUpDbシートのデータを投入(共通データ) +2. setUpTableで指定したグループIDのデータを投入(ケース固有データ) +3. テスト実行 + +--- + +## 外部キー制約の処理 + +Nablarchのテストフレームワークは、テーブルの親子関係を自動判定し、適切な順序でデータを削除・登録します。 + +Excel上の記述順序は自由です。フレームワークが自動的に親テーブル→子テーブルの順で処理します。 + +--- + +## 参照情報 + +### 公式ドキュメント + +- [Nablarch Testing Framework - データベースアクセスのテスト](https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/06_TestFWGuide/02_DbAccessTest.html) +- [Nablarch Testing Framework - リクエスト単体テスト(バッチ)](https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/05_UnitTestGuide/02_RequestUnitTest/batch.html) +- [Nablarch Testing Framework - リクエスト単体テスト(Web)](https://nablarch.github.io/docs/LATEST/doc/development_tools/testing_framework/guide/development_guide/05_UnitTestGuide/02_RequestUnitTest/http.html) + +### 関連するコンテキストファイル + +- `context/5_test/5.0_test_basics.md` - テストの基礎(testShots、グループID等) +- `context/5_test/README.md` - テストコンテキストの概要 diff --git a/context/5_test/5.7_file_test.md b/context/5_test/5.7_file_test.md new file mode 100644 index 0000000..c0cca49 --- /dev/null +++ b/context/5_test/5.7_file_test.md @@ -0,0 +1,152 @@ +# 5.8 ファイル処理のテスト + +## 概要 + +ファイル処理(固定長ファイル・可変長ファイル)のテスト方法を説明します。 + +**特徴**: +- SETUP_FIXED/EXPECTED_FIXEDで固定長ファイルをテスト +- SETUP_VARIABLE/EXPECTED_VARIABLEで可変長ファイル(CSV等)をテスト + +## 目次 + +1. **固定長ファイルのテスト**: SETUP_FIXED/EXPECTED_FIXEDの使い方と実践例 +2. **可変長ファイルのテスト**: SETUP_VARIABLE/EXPECTED_VARIABLEの使い方と実践例 + +## 固定長ファイルのテスト + +### Excelでの記述方法 + +#### 全体構成 + +固定長ファイルのテストデータは、Excelシートに以下の構成で記述します: + +1. **データタイプ行**: `SETUP_FIXED=ファイルパス` または `EXPECTED_FIXED=ファイルパス` +2. **ディレクティブ行**: `text-encoding`、`record-separator`の設定 +3. **レコード種別ごとのブロック**(ヘッダ、データ、トレーラ、エンド等): + - 1行目: フィールド名称 + - 2行目: データ型 + - 3行目: フィールド長 + - 4行目以降: データ値 + +#### 記述例 + +**SETUP_FIXEDの完全な記述例**: + +| SETUP_FIXED=work/members.txt | | | | +|---|---|---|---| +| text-encoding | Windows-31J | | | +| record-separator | CRLF | | | +| **ヘッダ** | レコード区分 | FILLER | | +| | 半角数字 | 半角 | | +| | 1 | 10 | | +| | 0 | | | +| **データ** | レコード区分 | 会員番号 | 入会日 | +| | 半角数字 | 半角数字 | 半角数字 | +| | 1 | 10 | 8 | +| | 1 | 0000000001 | 20100101 | +| | 1 | 0000000002 | 20100102 | +| **トレーラ** | レコード区分 | レコード件数 | FILLER | +| | 半角数字 | 数値 | 半角 | +| | 1 | 5 | 4 | +| | 8 | 2 | | +| **エンド** | レコード区分 | FILLER | | +| | 半角数字 | 半角 | | +| | 1 | 10 | | +| | 9 | | | + +#### 項目説明 + +**データタイプ**: + +| データタイプ | 説明 | +|------------|------| +| `SETUP_FIXED` | テスト実行前に固定長ファイルを準備 | +| `EXPECTED_FIXED` | テスト実行後に固定長ファイルを検証 | + +- ファイルパスはカレントディレクトリからの相対パスで指定 +- グループIDを使った紐付けについては [5.0 テストの基礎](5.0_test_basics.md#グループid) を参照 + +**ディレクティブ**: + +| ディレクティブ | 説明 | 例 | +|--------------|------|-----| +| `text-encoding` | 文字コード | `UTF-8`、`Shift_JIS` | +| `record-separator` | レコード区切り文字 | `\n`、`\r\n` | + +**フィールド定義**: + +各レコード種別ごとに、以下の行で構成されます: + +| 行 | 内容 | +|----|------| +| 1行目 | フィールド名称(レコード区分、会員番号等) | +| 2行目 | データ型(半角数字、数値、半角等) | +| 3行目 | フィールド長(バイト数) | +| 4行目以降 | 実際のデータ値 | + +## 可変長ファイルのテスト + +### Excelでの記述方法 + +#### 全体構成 + +可変長ファイル(CSV等)のテストデータは、Excelシートに以下の構成で記述します: + +1. **データタイプ行**: `SETUP_VARIABLE=ファイルパス` または `EXPECTED_VARIABLE=ファイルパス` +2. **ディレクティブ行**: `text-encoding`、`field-separator`、`record-separator`の設定 +3. **レコード種別ごとのブロック**(ヘッダ、データ、トレーラ、エンド等): + - 1行目: フィールド名称 + - 2行目: データ型 + - 3行目以降: データ値 + +**固定長との違い**: フィールド長の行が不要です。 + +#### 記述例 + +**SETUP_VARIABLEの完全な記述例**: + +| SETUP_VARIABLE=work/members.csv | | | | +|---|---|---|---| +| text-encoding | UTF-8 | | | +| field-separator | , | | | +| **データ** | 会員番号 | 氏名 | 入会日 | +| | 半角数字 | 全角 | 半角数字 | +| | 0000000001 | 山田太郎 | 20100101 | +| | 0000000002 | 佐藤花子 | 20100102 | + +#### 項目説明 + +**データタイプ**: + +| データタイプ | 説明 | +|------------|------| +| `SETUP_VARIABLE` | テスト実行前に可変長ファイルを準備 | +| `EXPECTED_VARIABLE` | テスト実行後に可変長ファイルを検証 | + +- ファイルパスはカレントディレクトリからの相対パスで指定 +- グループIDを使った紐付けについては [5.0 テストの基礎](5.0_test_basics.md#グループid) を参照 + +**ディレクティブ**: + +| ディレクティブ | 説明 | 例 | デフォルト | +|--------------|------|-----|-----------| +| `text-encoding` | 文字コード | `UTF-8`、`Shift_JIS` | `UTF-8` | +| `field-separator` | フィールド区切り文字 | `,`、`\t` | `,` | +| `record-separator` | レコード区切り文字 | `\n`、`\r\n` | システム依存 | + +**フィールド定義**: + +各レコード種別ごとに、以下の行で構成されます: + +| 行 | 内容 | +|----|------| +| 1行目 | フィールド名称(レコード区分、会員番号等) | +| 2行目 | データ型(半角数字、数値、半角等) | +| 3行目以降 | 実際のデータ値 | + +**固定長との違い**: フィールド長の行が不要です。 + +## 関連情報 + +- [5.0 テストの基礎](5.0_test_basics.md): Excel構造、グループID、データタイプの基本 diff --git a/context/README.md b/context/README.md index f4f0112..2a336b4 100644 --- a/context/README.md +++ b/context/README.md @@ -5,30 +5,49 @@ AIによるNablarch実装支援用技術仕様集。コード生成に必要な ## 構成 ### 1_common - 共通機能 -- **1.1 オブジェクト変換** - EntityUtil/BeanUtil使い分け、型変換ルール -- **1.2 BeanUtil詳細** - 特殊パターン、ネスト・検索・REST・バッチ変換 -- **1.3 入力値検証** - Bean Validation、ドメイン・相関バリデーション -- **1.4 DB アクセス** - UniversalDAO、SQLファイル管理 -- **1.5 データバインド** - CSV/固定長変換、ファイル処理 -- **1.6 ファイルパス** - 論理名管理、環境設定 -- **1.7 日付ユーティリティ** - BusinessDateUtil、DateUtil -- **1.8 メッセージ** - 定義・国際化・エラー制御 +- **[1.1 オブジェクト変換](1_common/1.1_object_conversion.md)** - EntityUtil/BeanUtil使い分け、型変換ルール +- **[1.2 BeanUtil詳細](1_common/1.2_bean_util.md)** - 特殊パターン、ネスト・検索・REST・バッチ変換 +- **[1.3 入力値検証](1_common/1.3_validation.md)** - Bean Validation、ドメイン・相関バリデーション +- **[1.4 DB アクセス](1_common/1.4_database_access.md)** - UniversalDAO、SQLファイル管理 +- **[1.5 データバインド](1_common/1.5_data_bind.md)** - CSV/固定長変換、ファイル処理 +- **[1.6 ファイルパス](1_common/1.6_file_path_management.md)** - 論理名管理、環境設定 +- **[1.7 日付ユーティリティ](1_common/1.7_date_util.md)** - BusinessDateUtil、DateUtil +- **[1.8 メッセージ](1_common/1.8_message.md)** - 定義・国際化・エラー制御 ### 2_rest - REST API -- **2.1 Action** - JAX-RS、レスポンス制御 -- **2.2 Form** - JSON変換、バリデーション -- **2.3 エラーハンドリング** - ステータスコード、例外処理 -- **2.4 Service** - 依存関係、テスト対応 +- **[2.1 Action](2_rest/2.1_action.md)** - JAX-RS、レスポンス制御 +- **[2.2 Form](2_rest/2.2_form.md)** - JSON変換、バリデーション +- **[2.3 エラーハンドリング](2_rest/2.3_error_handling.md)** - ステータスコード、例外処理 +- **[2.4 Service](2_rest/2.4_service.md)** - 依存関係、テスト対応 ### 3_batch - バッチ処理 -- **3.1 Form/DTO** - CSV/固定長定義 -- **3.2 DataReader** - DB/ファイル読込み -- **3.3 BatchAction** - エラー制御、処理パターン -- **3.4-3.7 入出力パターン** - DB/ファイル処理 -- **3.8 @ValidateData** - バリデーション制御 +- **[3.1 Form/DTO](3_batch/3.1_form_dto.md)** - CSV/固定長定義 +- **[3.2 DataReader](3_batch/3.2_reader.md)** - DB/ファイル読込み +- **[3.3 BatchAction](3_batch/3.3_action.md)** - エラー制御、処理パターン +- **[3.4 DB入力パターン](3_batch/3.4_input_db_patterns.md)** - DB読込み処理 +- **[3.5 ファイル入力パターン](3_batch/3.5_input_file_patterns.md)** - ファイル読込み処理 +- **[3.6 DB出力パターン](3_batch/3.6_output_db_patterns.md)** - DB書込み処理 +- **[3.7 ファイル出力パターン](3_batch/3.7_output_file_patterns.md)** - ファイル書込み処理 +- **[3.8 @ValidateData](3_batch/3.8_validatedata_implementation.md)** - バリデーション制御 ### 4_web - Web アプリケーション -- **4.1 Action** - 業務アクションクラス、URLルーティング、画面遷移 -- **4.2 Form** - 入力値受け取り、バリデーション、パスパラメータ -- **4.3 JSP** - カスタムタグ、画面表示、確認画面パターン -- **4.4 Service** - ビジネスロジック、DB アクセス、トランザクション +- **[4.1 Action](4_web/4.1_action.md)** - 業務アクションクラス、URLルーティング、画面遷移 +- **[4.2 Form](4_web/4.2_form.md)** - 入力値受け取り、バリデーション、パスパラメータ +- **[4.3 JSP](4_web/4.3_jsp.md)** - カスタムタグ、画面表示、確認画面パターン +- **[4.4 Service](4_web/4.4_service.md)** - ビジネスロジック、DB アクセス、トランザクション + +### 5_test - テスティングフレームワーク +バッチ関連のみ先行して作成。 + +- **[5.0 テストの基礎](5_test/5.0_test_basics.md)** - Excel配置・記法・データタイプ・特殊記法・リクエスト単体テスト基本形 +- **5.1 リクエスト単体テスト(Web)** - HttpRequestTestSupport、画面遷移、セッション管理 +- **5.2 リクエスト単体テスト(REST)** - RestTestSupport、HTTPメソッド、ステータスコード検証 +- **[5.3 リクエスト単体テスト(Batch)](5_test/5.3_batch_request_test.md)** - BatchRequestTestSupport、testShotsカラム、execute()、常駐バッチ対応 +- **[5.4 データベーステスト](5_test/5.4_database_test.md)** - SETUP_TABLE/EXPECTED_TABLE/EXPECTED_COMPLETE_TABLE、DB初期化・検証、トランザクション制御、グループID管理 +- **5.5 クラス単体テスト** - テストクラス基本構造、モック・スタブ、JUnit連携 +- **5.6 検証ユーティリティ** - JSON検証、HttpResponse検証、カスタムアサーション +- **[5.7 ファイル処理テスト](5_test/5.7_file_test.md)** - SETUP_FIXED/VARIABLE、EXPECTED_FIXED/VARIABLE、入出力ファイル検証 +- **5.8 メッセージングテスト** - 同期応答メッセージング、応答不要メッセージング +- **5.9 高度な機能** - パラメータ化テスト、日時固定化、マスタデータキャッシュ +- **5.10 二重サブミット防止テスト** - トークン検証、UseToken設定 +- **5.11 取引単体テスト** - リクエスト単体テストとの使い分け、複数アクション連携 \ No newline at end of file