diff --git a/.claude/skills/pr-create/SKILL.md b/.claude/skills/pr-create/SKILL.md new file mode 100644 index 00000000..16be2ccb --- /dev/null +++ b/.claude/skills/pr-create/SKILL.md @@ -0,0 +1,86 @@ +--- +name: pr-create +description: 現在のブランチの変更内容を確認し、GitHub CLIを使ってPR作成を支援してください。 +--- + +# PR作成 + +現在のブランチの変更内容を確認し、`.github/PULL_REQUEST_TEMPLATE.md`に準拠したフォーマットでPRを作成するスキル。 + +## PRテンプレート + +PRの本文は `.github/PULL_REQUEST_TEMPLATE.md` のフォーマットに従うこと。 + +**重要:** PR作成前に、必ず `.github/PULL_REQUEST_TEMPLATE.md` を読み取り、最新のフィールド構造を確認してください。テンプレートが更新されている可能性があります。 + +## ワークフロー + +### 1. マージ先ブランチの確認 + +ユーザーの指示からマージ先ブランチを特定する。指示に含まれていない場合は、必ずユーザーに確認する。推測してデフォルトを使わないこと。 + +### 2. 現在のブランチの状態を確認 + +以下のコマンドを並列で実行し、マージ先ブランチとの差分を把握する: + +```bash +# 未コミットの変更を確認 +git status + +# マージ先ブランチとの差分を確認 +git diff <マージ先ブランチ>...HEAD + +# マージ先ブランチからの全コミット履歴を確認 +git log --oneline <マージ先ブランチ>..HEAD + +# リモートとの同期状態を確認 +git branch -vv +``` + +### 3. 関連Issueの確認 + +オープン中のIssueを確認し、このPRに関連するIssueがないか調べる: + +```bash +gh issue list --state open +``` + +関連Issueがあれば、PR本文の経緯セクションに `#XX` でリンクする。 + +### 4. テンプレートの確認とPR本文の作成 + +`.github/PULL_REQUEST_TEMPLATE.md` を読み取り、そのフォーマットに従ってPR本文を作成する。 + +**各セクションの記載ガイドライン:** + +- **経緯**: なぜこのPRが必要になったか。関連Issueがあれば `#XX` でリンクする +- **実装内容**: 「何をしたか」だけでなく「なぜその実装を選んだか」の理由を重視して記載する +- **確認内容**: 修正が正しく動作することの確認方法をチェックボックス形式で記載する + +### 5. PRの作成 + +未pushの場合はpushした上で、`gh pr create`コマンドでPRを作成する: + +```bash +gh pr create \ + --base <マージ先ブランチ> \ + --head <現在のブランチ> \ + --title "タイトル" \ + --body "$(cat <<'EOF' +[テンプレートに準拠した本文] +EOF +)" +``` + +### 6. ユーザーへの報告 + +PR作成後、URLを報告する。 + +## 注意事項 + +1. **マージ先ブランチは必ずユーザーから受け取る** - 不明な場合は推測せず確認する +2. **差分はマージ先ブランチとの比較で確認する** - `<マージ先>...HEAD` を使う +3. **関連Issueを確認する** - オープン中のIssueと照合する +4. **全コミットを確認** - 最新コミットだけでなく、マージ先からの全コミットを分析する +5. **理由を重視** - 実装内容セクションでは「何をしたか」より「なぜそうしたか」を重視する +6. **テンプレート準拠** - 独自フォーマットではなく、必ずテンプレートのセクション構造に従う diff --git a/LocalPackage/.gitignore b/LocalPackage/.gitignore new file mode 100644 index 00000000..0023a534 --- /dev/null +++ b/LocalPackage/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/LocalPackage/Package.swift b/LocalPackage/Package.swift new file mode 100644 index 00000000..51ae1520 --- /dev/null +++ b/LocalPackage/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version: 6.2 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "LocalPackage", + products: [ + .library( + name: "LocalPackage", + targets: ["LocalPackage"] + ), + ], + targets: [ + .target( + name: "LocalPackage" + ), + .testTarget( + name: "LocalPackageTests", + dependencies: ["LocalPackage"] + ), + ] +) diff --git a/LocalPackage/Sources/LocalPackage/LocalPackage.swift b/LocalPackage/Sources/LocalPackage/LocalPackage.swift new file mode 100644 index 00000000..08b22b80 --- /dev/null +++ b/LocalPackage/Sources/LocalPackage/LocalPackage.swift @@ -0,0 +1,2 @@ +// The Swift Programming Language +// https://docs.swift.org/swift-book diff --git a/LocalPackage/Tests/LocalPackageTests/LocalPackageTests.swift b/LocalPackage/Tests/LocalPackageTests/LocalPackageTests.swift new file mode 100644 index 00000000..f1376e7e --- /dev/null +++ b/LocalPackage/Tests/LocalPackageTests/LocalPackageTests.swift @@ -0,0 +1,6 @@ +import Testing +@testable import LocalPackage + +@Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. +} diff --git a/Makefile b/Makefile index 64648384..8790f1c8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: help lint deploy emulator test-e2e setup-project +.PHONY: help lint deploy emulator test-e2e test-packages setup-project .DEFAULT_GOAL := setup-project @@ -17,6 +17,9 @@ emulator: ## エミュレーターを起動 test-e2e: ## E2Eテストを実行 cd firebase/functions && npm run test:e2e && cd ../.. +test-packages: ## LocalPackageのテストを実行 + swift test --package-path LocalPackage + setup-project: ## iOSプロジェクトのセットアップ @bash scripts/setup_ruby.sh @echo "Bundler依存関係をインストール中..." diff --git a/homete.xcodeproj/project.pbxproj b/homete.xcodeproj/project.pbxproj index fcd966b1..08c52b64 100644 --- a/homete.xcodeproj/project.pbxproj +++ b/homete.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 04B371962F404CBF00820C62 /* LocalPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = LocalPackage; sourceTree = ""; }; BC1BB2682E909B8C001D168F /* hometeSnapshotTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hometeSnapshotTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; BC1BB4912E90FE4B001D168F /* snapshotTesting.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = snapshotTesting.xctestplan; sourceTree = ""; }; BC4703632E9CF66D006CC530 /* CI.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CI.xctestplan; sourceTree = ""; }; @@ -123,6 +124,7 @@ BCC853EC2DB74BBC00C9A44B = { isa = PBXGroup; children = ( + 04B371962F404CBF00820C62 /* LocalPackage */, BC4703632E9CF66D006CC530 /* CI.xctestplan */, BC1BB4912E90FE4B001D168F /* snapshotTesting.xctestplan */, BC7469462DBCBE71007E4222 /* PrivacyInfo.xcprivacy */,