release v3.0.0-rc.0#123
Merged
KinjiKawaguchi merged 25 commits intomainfrom Mar 24, 2026
Merged
Conversation
## Summary - `domain/value-objects/` を廃止し、各値オブジェクトを使用元の集約ディレクトリに移動 - `Email`, `UniversityEmail`, `Departments` → `aggregates/member/` - `LightningTalkDuration`, `Url` → `aggregates/event/` - `ValueObject` 基底クラスを `domain/base/` に移動 - 型別ではなくドメイン概念別のディレクトリ構成に統一 ## Motivation 既存の構造では値オブジェクトがビルディングブロックの型別(`value-objects/`)にトップレベルで切り出されており、どの集約に属する概念なのかが不明瞭だった。 各値オブジェクトは実際には特定の集約でのみ使用されているため、使用元の集約ディレクトリに配置することで、ドメイン概念の凝集度を高める。 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - vitest v4をdevDependenciesに追加し、`npm test` / `npm run test:watch` スクリプトを追加 - `vitest.config.ts`でパスエイリアス(`#domain`, `#application`, `#infrastructure`)を解決 - `ValueObject`基底クラスのユニットテストをサンプルとして追加(8テストケース) - GitHub Actions `test.yml`ワークフローを追加(push/PR時に自動実行) ## Test plan - [x] `npm test` で8件のテストが全てパスすること - [x] `npx biome check` がパスすること - [x] GitHub Actions test workflowが正常に実行されること 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/83" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - 4つの個別CIワークフロー(build/lint/typecheck/test)を `ci.yml` に統合(Reusable Workflow) - `setup-node` Composite Action でセットアップ処理(setup-node + npm ci)を共通化 - `publish.yml` が `ci.yml` を前提条件として呼び出すオーケストレーションを追加 - 全ジョブに `permissions: contents: read` と `timeout-minutes: 10` を設定 - アクションを SHA pinning に更新(Node.js 20 deprecation 警告の解消) ## マージ後に必要な作業 - [ ] Branch Protection Rules の required status checks を `CI / lint`, `CI / typecheck`, `CI / test`, `CI / build` に更新 - [ ] NPM_TOKEN シークレットの更新(Publish失敗の根本原因) - [ ] GitHub Settings → Environments で `npm` 環境を作成 - [ ] 旧 `code_check.yml` ワークフローの無効化 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/88" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - 学籍番号(StudentId)の値オブジェクトをSharedKernelとして追加 - 旧形式(8桁数字)と新形式(3桁数字+英字+4桁数字)の両方に対応 - `fromString` ファクトリメソッドで小文字→大文字正規化・空白トリムを実施 - private constructorにより直接インスタンス化を防止 - 12件のユニットテストを追加 ## Test plan - [x] 旧形式・新形式の正常系テスト - [x] 大文字正規化・空白トリムのテスト - [x] 桁数不正・英字のみ・英字位置不正・空文字等の異常系テスト - [x] equalsメソッドの等価性テスト - [x] lint, typecheck, test全てパス ## Related - PR #81 から StudentId 部分を分割したPR - マージ後、PR #81 をリベースしてAffiliation部分のみにする 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/87" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - `Event.removeExhibitMemberId`のボディが空で、展示からのメンバー削除がno-opだった問題を修正 - 該当Exhibitからメンバーを削除し、他のExhibitにも所属していなければEvent.memberIdsからも削除する - PR #81 のレビューで指摘された pre-existing issue への対応 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/85" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - 値オブジェクトを所属する集約ディレクトリに移動し、`domain/base` に `ValueObject` を配置 - Shared Kernel として `Affiliation`(学部・修士・博士・専門職)と `StudentId` 値オブジェクトを追加 - 静岡大学の全組織構造を型レベルの判別共用体で表現(学部ごとに異なる階層構造を正確にモデル化) - Affiliation のバリデーションは型制約で保証し、ランタイム検証はシステム境界の責務とする設計 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/81" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## 概要
PC相談室のカルテ(相談記録)を表すKarte集約を追加する。
## 背景
PC相談室では相談対応の記録をカルテとして管理している。このPRではカルテのドメインモデルを定義し、ドメイン層に集約として追加する。
## 集約の構造
```
Karte(集約ルート / immutable)
├── Client 相談者(Student | Teacher | Staff | Other)
├── Consent 同意事項
├── Consultation 相談事
│ ├── categories 相談カテゴリ(複数選択)
│ ├── targetDevice 対象機器
│ └── troubleDetails トラブル詳細
└── SupportRecord 対応記録
├── assignedMemberIds 担当メンバー
├── content 対応内容
├── resolution 解決ステータス(resolved | unresolved → FollowUp)
└── workDuration 作業時間
```
## 設計の要点
### 1. immutableな「記録型」集約
カルテは一度書いたら変わらない「記録」としてimmutableに設計した。
- `create()` で新規作成、`correct()` で訂正(記録ミスの修正用)
- `correct()` は `recordedAt` を保持し `lastUpdatedAt` のみ更新する
- `reconstruct()` は永続化データからの復元用(バリデーションなし)
### 2. Recorded\<T\> — 過去データの欠損を型で表現
過去のカルテには一部フィールドが存在しない。null/undefinedに暗黙の意味を持たせず、`{ type: "recorded",
value: T } | { type: "notRecorded" }` の判別共用体で明示する。
- `create()` では全フィールドを生の値で受け取り、内部で `recorded()` に包む → 新規カルテは常に完全
- `reconstruct()` では `Recorded<T>` をそのまま受け取る → 過去データの欠損を許容
### 3. Branded型 + ファクトリ関数によるVO実装
`WorkDuration`, `KarteId` などの値オブジェクトは、既存の `ValueObject<T>`
基底クラスを使わずbranded型 + ファクトリ関数で実装した。
理由: `ValueObject<T>` 基底クラスは `equals()` が JSON.stringify
比較に依存しており実装として脆い。今後他の集約でも基底クラスから剥がしていく可能性があるため、新規コードでは採用しなかった。
### 4. KarteRepositoryは find/save のみ
ユースケースが明確なメソッドだけ定義し、CRUD網羅はしない(YAGNI)。検索や一覧のユースケースが出た時点で追加する。
### 5. Recorded\<T\> の値にはドメインルールを適用
`Recorded<T>` が `recorded` であれば、その値はドメインルールに従うべき。
- `assignedMemberIds`: `Recorded<NonEmptyArray<string>>` — 記録されているなら1人以上
- `categories`: `Recorded<NonEmptyArray<ConsultationCategory>>` —
記録されているなら1つ以上
## 議論したいこと
- **カルテは本当に変更すべきでないか?**
現在の設計は「記録型(immutable)」を前提としている。correct()は記録ミスの訂正用として用意したが、そもそもカルテは一度記録したら変更不可とすべきか、それとも訂正を許容すべきか。
- **変更履歴を残すべきか?**
現在のcorrect()は最新の状態だけを保持し、変更前の内容は残らない。訂正を許容する場合、誰がいつ何を変更したかの履歴(監査ログ)が必要ではないか。
- **FollowUp「その他」選択時の自由記述フィールド** が必要か(ドメインエキスパートとの議論待ち)
## テスト
- `WorkDuration`: バリデーション境界値(0分OK、負数/小数/NaN → 例外)
- `Karte`:
create/correctのドメインロジック(タイムスタンプ、Recorded包装、訂正時のid/recordedAt保持)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Why 集約ルートのID(Member, Event)および子エンティティのID(Exhibit)が`string`型であり、異なるID種別の取り違えがコンパイル時に検出できなかった。既存のKarteIdパターンに合わせてBranded Typeを導入し、型安全性を確保する。 ## What - `MemberId`, `EventId`, `ExhibitId` のBranded Type定義とファクトリ関数を追加 - ドメイン層(集約ルート、エンティティ、リポジトリインターフェース、値オブジェクト)の全ID参照をBranded Typeに変更 - アプリケーション層(全ユースケースのInput型)をBranded Typeに変更 - インフラ層(DrizzleRepository)のDB↔ドメイン変換境界でファクトリ関数によるキャストを追加 - テストコードのassignedMemberIdsをMemberIdに更新 ## BREAKING CHANGE 全集約ルートID(MemberId, EventId)およびExhibitIdの型が`string`からBranded Typeに変更。 呼び出し側は`memberId()`, `eventId()`, `exhibitId()`ファクトリ関数でIDを生成する必要がある。 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/92" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why 室員管理システムのドメインモデル設計書に基づき、Member集約を全レイヤーにわたって再設計する。 現行のMemberは単一クラスで全状態を扱い、Discord連携やDepartment(CS/BI/IA等)を集約内に持つ構造だが、仕様で求められる室員/未確認/元室員の状態遷移やAffiliationベースの所属管理に対応できていない。 BREAKING CHANGE: Member集約のAPI、DBスキーマ、ユースケースI/Oが全面的に変更される。 ## What ### ドメイン層 #### Member集約の3状態モデル - `ActiveMember`(室員): MemberId, email, 名前, 個人メール, 学籍番号, 所属 - `UnconfirmedMember`(未確認): MemberId, email, 名前, 個人メール - `FormerMember`(元室員): MemberId, email, 名前, 個人メール - `type Member = ActiveMember | UnconfirmedMember | FormerMember` #### 設計上の特徴 - **イミュータブル集約**: 全操作が新インスタンスを返す - **型レベルでの状態保証**: 元室員に学籍番号でアクセスしようとするとコンパイルエラー - **二重識別子**: `MemberId`(UUID, Branded Type)は技術的識別子、`UniversityEmail`はビジネス識別子 - **Affiliationによる区分表現**: 学部生/修士/博士の区分はAffiliationの型が内包 - **Recorded\<T\>**: personalEmailの記録有無をnullではなく型で明示(shared kernelに配置) - **ドメインイベント収集**: 12種のイベントを集約内で蓄積し`pullDomainEvents()`で取り出し #### DiscordAccount集約(独立した境界づけられたコンテキスト) - 旧MemberからDiscordAccountを分離し、独自の集約ルートとして再設計 - `DiscordId`(Branded Type)で型安全に識別 - `nickName`をDiscord固有の属性として保持 - `MemberId`でMember集約を参照 #### 削除・整理 - 旧`DiscordAccount`(Member集約内のエンティティ)→ 独立集約に移行 - `Departments`(CS/BI/IA等のenum)→ Affiliation(shared kernel)に置き換え - Discord関連例外、InvalidDepartmentException を削除 ### インフラ層 #### DBスキーマ変更 - `member_status` enum追加(active/unconfirmed/former) - `status`列追加、`affiliation`列追加(JSONB, SerializedAffiliation型) - `department`列削除 - `student_id`: text NOT NULL → varchar(8) nullable - `timestamp`: precision(3)削除 #### リポジトリ - `DrizzleMemberRepository`: 新Member型(ActiveMember/UnconfirmedMember/FormerMember)に対応。SerializedAffiliationでAffiliationを型安全にシリアライズ。 - `DrizzleDiscordAccountRepository`: 新規実装 ### アプリケーション層 #### ユースケースI/O更新 - 全InputをBranded Type/ドメイン型に統一(MemberId, DiscordId, UniversityEmail, StudentId, Recorded\<Email\>等) - RegisterMember: Department→Affiliationベース - UpdateMember: イミュータブル集約のchangeName/changeStudentId/changePersonalEmail使用 - Discord系: DiscordAccountRepositoryを使う形に書き直し #### 例外設計改善 - `InvalidAffiliationOperationException`: operation, currentAffiliationType, reasonフィールドで原因を明示 - `DiscordAccountNotFoundException`, `MemberNotActiveException`を新規追加 - 汎用Errorの使用を排除 ## Test plan - [x] ActiveMember: 登録、復元、除籍、未確認移行、名前変更、学籍番号変更 - [x] ActiveMember: 内部進学(学部→修士、修士→博士、不正遷移のエラー) - [x] ActiveMember: 転学部、転学科(同一学部制約)、転専攻(同一研究科制約) - [x] UnconfirmedMember: 確認復帰、除籍、名前変更 - [x] FormerMember: 再登録、名前変更 - [x] ライフサイクル全体のイベント蓄積(登録→除籍→再登録、登録→未確認→確認) - [x] ドメイン層の型エラー: 0件 - [x] 全64テスト合格 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/94" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why Claude Codeのワークツリー参照ファイルが誤ってリポジトリに追跡されていた。 ## What - `.claude/worktrees/` を `.gitignore` に追加 - 追跡済みの `.claude/worktrees/*` をリポジトリから除外 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/100" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
> Reopened from #98 (closed by history rewrite) ## Why AffiliationがValueObjectクラスだったため、JSONB永続化にSerializedAffiliation型とserialize/deserialize関数が必要だった。ドメイン型を直接シリアライズ可能にし、インフラ層の変換コードを削減する。 ## What - UndergraduateAffiliation等をクラスからplain typeのdiscriminated unionに変更 - SerializedAffiliation型を削除(Affiliation型がそのままJSONBに格納可能に) - serializeAffiliation() / deserializeAffiliation()を削除 - affiliationTypeNamesマップを追加(表示名のドメイン知識をAffiliation.tsに集約) - Member.tsの全instanceof分岐をtypeフィールド分岐に統一 - DrizzleMemberRepositoryからAffiliation変換コードを削除 ## How Affiliation = { type: "undergraduate"; value: UndergraduateAffiliationValue } | ... のdiscriminated unionにすることで、型自体がシリアライズ可能な形を持つ。validate()が全て空だったため、クラスを残す理由がなかった。 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/102" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- `StudentId.isValid()`: 学籍番号の妥当性チェック関数を公開(private regexの重複解消)
- `clientTypeNames`: 相談者種別(student/teacher/staff/other)→表示名マッピング
- `FOLLOW_UP_OPTIONS`: 後処理の選択肢一覧をランタイム配列として公開
## Why
its-karteで同じ文字列リテラルやregexをローカルに再定義していた。
coreからexportすることでDRY違反を解消する。
## Test plan
- [ ] `npm run typecheck` が成功すること
- [ ] `StudentId.isValid("70312031")` → true
- [ ] `StudentId.isValid("invalid")` → false
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- devin-review-badge-begin -->
---
<a href="https://app.devin.ai/review/su-its/core/pull/112"
target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
</picture>
</a>
<!-- devin-review-badge-end -->
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - universityStructure.tsをランタイムデータ→型導出(as const + typeof)に再設計 - 3ファイル(型定義・部分型・ランタイムデータ ~700行)→ 1ファイルに統合 - 文字列リテラルの二重管理を解消(値を1箇所で定義し、型は自動導出) - `getAffiliationSteps()`: 学部ごとに異なる所属階層の動的ステップ生成関数を追加 - PartialAffiliation型も同一データから導出 - 課程ラベルを正式名称(学士課程/修士課程/博士課程/専門職学位課程)に変更 ## What - `as const` でランタイムデータを定義し、分配条件型(distributive conditional types)で学部ごとの学科制約を維持したまま型を導出 - `keysOf()` ヘルパーで `Object.keys` のリテラル型を維持 - `CourseType` 型を導入しヘルパー関数を型安全に(`string` → `keyof typeof UNIVERSITY_STRUCTURE`) - `faculties` → `institutions`、`departments` → `subdivisions` にリネームし学部/研究科の意味的曖昧さを解消 - 修士/博士/専門職のステップで `field: "school"` を使用(ドメインモデルと一致) - 理学部の学科とコース(創造理学コース)を排他的な別ステップに分離 ## Why 型定義とランタイムデータで同じ組織名を手書きしていた(DRY違反)。 値を先に定義し型を導出することで、1箇所の変更で型もUIデータも更新される。 ## Test plan - [x] `npm run typecheck` が成功すること - [x] `npm run build` が成功すること - [x] `npm run lint` が成功すること - [ ] Affiliation型の互換性が保たれていること - [ ] getAffiliationSteps が全課程・学部で正しいステップを返すこと 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - Karte集約のドメインモデル、アプリケーション層(ユースケース)、インフラ層(Drizzleリポジトリ)を追加 - ConsultedAt型で日時精度(年/年月/日/日時)に対応 ## Dependencies このPRは以下がマージ済みであることを前提とします: - #111 大学組織構造の型をランタイム定義から導出する設計に変更 - #112 ドメイン定数を追加し型をランタイム定義から導出 ## What - **ドメイン層**: Karte集約(Karte, ConsultedAt, Assignee, SupportRecord, Consultation) - **アプリケーション層**: Create/Correct/Get/Import/List カルテユースケース - **インフラ層**: DrizzleKarteRepository、DBスキーマ(kartes, karte_assignees, karte_consultation_categories) - **ファクトリ**: createKarteUseCases ## Test plan - [ ] `npm run typecheck` が成功すること(依存PR マージ後) - [ ] `npm run test` が成功すること - [ ] Karteの作成・取得・一覧が動作すること 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/103" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why スキーマ変更後に `npm run db:generate` を忘れてコミットすると、Drizzleスキーマと生成済みマイグレーションファイルに差異が生じる。これをCIで検出し、未然に防ぐ。 ## What CIワークフローに `drizzle-check` ジョブを追加。`drizzle-kit generate` を実行し `drizzle/` ディレクトリに差分が生じた場合、エラーメッセージとdiffを表示して失敗させる。 ## Test plan - [ ] CIの `drizzle-check` ジョブが正常に通ること - [ ] スキーマを変更してgenerateせずにpushした場合にCIが失敗すること Closes #114 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/115" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why index.tsでモジュール境界を定義しているにもかかわらず、フルパスでの直接importが多く公開APIの意味がなくなっていた。 ## What - バレル(index.ts)のエクスポート漏れを補完(karte集約、NonEmptyArray/NonEmptyString) - karte集約の重複`Recorded.ts`を削除し`domain/shared`の定義に統一 - 全ファイルのimportを以下のルールで統一: - **同一集約内**: `./`相対パス - **domain内 → 共通基盤(base/exceptions/shared)**: 相対パスでバレル経由 - **集約間参照**: `#domain`バレル経由 - **application内部**: 相対パスでバレル経由 - **application/infrastructure/tests → domain**: `#domain`バレル経由 ## Test plan - [x] `tsc --noEmit` 型エラーなし(`baseUrl`非推奨警告は既存問題) - [x] `vitest run` 全112テストパス Closes #113 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/117" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
> Replaces #101 (clean rebase on latest develop) ## Why ドメインイベントは集約のメソッドで蓄積されるが、永続化されておらずメモリ上で消失していた。 監査ログとして変更履歴を追跡可能にするため、イベントの永続化基盤を導入する。 ## What - `member_domain_events` / `discord_account_domain_events` テーブルを追加 - Member: 共通カラム(member_id, email, event_name, occurred_at)+ 型安全なJSONBペイロード - DiscordAccount: 共通カラム(discord_id, member_id, event_name, occurred_at)+ ペイロード - リポジトリの `save()` 内で同一トランザクションにてイベントを書き込み - シリアライズ関数を別ファイルに切り出しテスト可能に - Affiliationはdiscriminated union(PR #102)のためserialize不要、直接格納 - ドメインイベントをクラスからplain discriminated unionに変更 - DomainEvent基底型をintersectionで適用 ## How - Drizzleの `.$type<>()` でJSONBカラムにコンパイル時型安全性を付与 - 追記専用(UPDATE/DELETE不要)の監査ログ設計 - FKなし(エンティティ削除後もイベントを保持するため) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bumps [rollup](https://github.com/rollup/rollup) from 4.57.1 to 4.60.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/releases">rollup's releases</a>.</em></p> <blockquote> <h2>v4.60.0</h2> <h2>4.60.0</h2> <p><em>2026-03-22</em></p> <h3>Features</h3> <ul> <li>Support source phase imports as long as they are external (<a href="https://redirect.github.com/rollup/rollup/issues/6279">#6279</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6279">#6279</a>: feat: external only Source Phase imports support (<a href="https://github.com/guybedford"><code>@guybedford</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>v4.59.1</h2> <h2>4.59.1</h2> <p><em>2026-03-21</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix a crash when using lazy dynamic imports with moduleSideEffects:false (<a href="https://redirect.github.com/rollup/rollup/issues/6306">#6306</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6281">#6281</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6282">#6282</a>: chore(deps): update github artifact actions (major) (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6283">#6283</a>: chore(deps): update dependency nyc to v18 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6284">#6284</a>: fix(deps): update swc monorepo (major) (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6285">#6285</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6290">#6290</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6291">#6291</a>: chore(deps): update dependency <code>@shikijs/vitepress-twoslash</code> to v4 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6292">#6292</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6297">#6297</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6298">#6298</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6299">#6299</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6300">#6300</a>: docs: update packagephobia link (<a href="https://github.com/bluwy"><code>@bluwy</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6301">#6301</a>: chore(deps): update dependency lint-staged to ^16.3.3 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6306">#6306</a>: fix: fix chunk assignment for deoptimized module with dynamic import (<a href="https://github.com/JoaoBrlt"><code>@JoaoBrlt</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6307">#6307</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6308">#6308</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6309">#6309</a>: chore(deps): update dependency vite to v8 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6310">#6310</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6311">#6311</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6312">#6312</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> </ul> <h2>v4.59.0</h2> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rollup/rollup/blob/master/CHANGELOG.md">rollup's changelog</a>.</em></p> <blockquote> <h2>4.60.0</h2> <p><em>2026-03-22</em></p> <h3>Features</h3> <ul> <li>Support source phase imports as long as they are external (<a href="https://redirect.github.com/rollup/rollup/issues/6279">#6279</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6279">#6279</a>: feat: external only Source Phase imports support (<a href="https://github.com/guybedford"><code>@guybedford</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> </ul> <h2>4.59.1</h2> <p><em>2026-03-21</em></p> <h3>Bug Fixes</h3> <ul> <li>Fix a crash when using lazy dynamic imports with moduleSideEffects:false (<a href="https://redirect.github.com/rollup/rollup/issues/6306">#6306</a>)</li> </ul> <h3>Pull Requests</h3> <ul> <li><a href="https://redirect.github.com/rollup/rollup/pull/6281">#6281</a>: fix(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6282">#6282</a>: chore(deps): update github artifact actions (major) (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6283">#6283</a>: chore(deps): update dependency nyc to v18 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6284">#6284</a>: fix(deps): update swc monorepo (major) (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6285">#6285</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6290">#6290</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot], <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6291">#6291</a>: chore(deps): update dependency <code>@shikijs/vitepress-twoslash</code> to v4 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6292">#6292</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6297">#6297</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6298">#6298</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6299">#6299</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6300">#6300</a>: docs: update packagephobia link (<a href="https://github.com/bluwy"><code>@bluwy</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6301">#6301</a>: chore(deps): update dependency lint-staged to ^16.3.3 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6306">#6306</a>: fix: fix chunk assignment for deoptimized module with dynamic import (<a href="https://github.com/JoaoBrlt"><code>@JoaoBrlt</code></a>, <a href="https://github.com/lukastaegert"><code>@lukastaegert</code></a>)</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6307">#6307</a>: chore(deps): update minor/patch updates (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6308">#6308</a>: chore(deps): update dependency lru-cache to v11 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6309">#6309</a>: chore(deps): update dependency vite to v8 (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6310">#6310</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6311">#6311</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> <li><a href="https://redirect.github.com/rollup/rollup/pull/6312">#6312</a>: chore(deps): lock file maintenance (<a href="https://github.com/renovate"><code>@renovate</code></a>[bot])</li> </ul> <h2>4.59.0</h2> <p><em>2026-02-22</em></p> <h3>Features</h3> <ul> <li>Throw when the generated bundle contains paths that would leave the output directory (<a href="https://redirect.github.com/rollup/rollup/issues/6276">#6276</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rollup/rollup/commit/6ecd69fb2ce736c8aabb50829edd227d1792c957"><code>6ecd69f</code></a> 4.60.0</li> <li><a href="https://github.com/rollup/rollup/commit/6b725b9f0aae80e4ca4bf3e7b9763b153b850d8b"><code>6b725b9</code></a> feat: external only Source Phase imports support (<a href="https://redirect.github.com/rollup/rollup/issues/6279">#6279</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/0cba9e079e1d6e56882558827b37557f36c52966"><code>0cba9e0</code></a> 4.59.1</li> <li><a href="https://github.com/rollup/rollup/commit/4eeea29bd42b6abf3dad53b760f53750cd698872"><code>4eeea29</code></a> Pin Vite</li> <li><a href="https://github.com/rollup/rollup/commit/1cd49ae2a2a3de50627e2790b17e3c8704012626"><code>1cd49ae</code></a> fix: fix chunk assignment for deoptimized module with dynamic import (<a href="https://redirect.github.com/rollup/rollup/issues/6306">#6306</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/c9dabc3744b5316a1a08c85b65fce73d465e5453"><code>c9dabc3</code></a> Downgrade Vite</li> <li><a href="https://github.com/rollup/rollup/commit/d46200fd92b083d0997c0216a21f5bcdc5e6efea"><code>d46200f</code></a> chore(deps): update dependency vite to v8 (<a href="https://redirect.github.com/rollup/rollup/issues/6309">#6309</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/aa6c853da554cd8b56b48e94fcfc21a5b027b271"><code>aa6c853</code></a> chore(deps): update dependency lru-cache to v11 (<a href="https://redirect.github.com/rollup/rollup/issues/6308">#6308</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/4208811aa6600f81d94a746a01bd0ff861718578"><code>4208811</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/rollup/rollup/issues/6312">#6312</a>)</li> <li><a href="https://github.com/rollup/rollup/commit/5348a82cee5e07a39164fb78ce9d69bfc557d341"><code>5348a82</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/rollup/rollup/issues/6311">#6311</a>)</li> <li>Additional commits viewable in <a href="https://github.com/rollup/rollup/compare/v4.57.1...v4.60.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/su-its/core/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Why #116(Dependabot rollup bump)のsquash mergeがdevelop上の#117の変更を巻き戻していた。 Dependabotブランチが#117マージ前のdevelopから作られていたため。 ## What #117(`e33a18f`)のcherry-pickで、公開APIバレル経由のimportルールを再適用。 新たに追加された`ConnectDiscordAccount`の例外と`schema.ts`のイベント関連importも`#domain`バレル経由に統一。 ## Test plan - [x] `tsc --noEmit` パス - [x] `vitest run` 全127テストパス 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/120" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - tsup / vitest / biome を vite-plus に統合し、設定を `vite.config.ts` に一元化 - CIワークフローを `vp check` / `vp test` / `vp pack` に更新 - テストのインポートを `vitest` → `vite-plus/test` に変更 ## Why 開発ツールチェーンをVite+に統一することで、設定ファイルの分散を解消し、ビルド・リント・テストを単一のツールで管理する。 ## What | 削除 | 追加/変更 | |------|-----------| | `tsup.config.ts` | `vite.config.ts`(pack設定) | | `vitest.config.ts` | `vite.config.ts`(test設定) | | `biome.json` | `vite.config.ts`(lint/fmt設定) | | `tsup`, `vitest`, `@biomejs/biome`, `tsc-alias` | `vite-plus` | ## Test plan - [x] `vp pack` でESM/CJS/DTSビルド成功 - [x] `vp test` で全64テストパス - [x] パスエイリアス(`#domain`等)がdist出力で正しく解決されている - [ ] CIワークフロー(`vp check`, `vp test`, `vp pack`)が通ること 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/107" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why PR #107(VP移行)のマージでdrizzle-checkジョブが欠落し、ブランチ保護の必須チェックが永遠にpendingになっていた。 ## What ci.ymlにdrizzle-checkジョブを復元。 ## Test plan - [x] CI通過を確認 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/121" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - メジャーバージョンアップ: `@types/node` (22→25), `typescript` (5→6), `uuid` (11→13) - マイナー/パッチ: `@types/pg`, `drizzle-kit`, `pg` ## Why Vite+移行に合わせて依存パッケージを最新化する。 ## Test plan - [x] `vp pack` でビルド成功 - [x] `vp test` で全64テストパス - [x] `npm outdated` で未更新パッケージなし - [ ] CIが通ること 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/108" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why バンドル出力だと消費者側のバンドラーがtree-shakingしにくいため、tsupのunbundleモードに切り替える。 ## What - `vite.config.ts`: tsupに`unbundle: true`を追加 - `package.json`: 出力拡張子を`.mjs`/`.d.mts`に変更(unbundleモードの出力に合わせる) - `package-lock.json`: 上記に伴う更新 ## Test plan - [ ] CIが通ること - [ ] `npm run build`で個別ファイルが出力されること 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- devin-review-badge-begin --> --- <a href="https://app.devin.ai/review/su-its/core/pull/122" target="_blank"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1"> <img src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1" alt="Open with Devin"> </picture> </a> <!-- devin-review-badge-end --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Why
公開APIが内部アーキテクチャパターン(UseCase/execute)を露出しており、消費者にドメイン型の構築を強制していた。また、ファクトリがDrizzle実装をハードコードしておりテスタビリティに欠けていた。
## What
- `createMemberService(deps?)` / `createEventService(deps?)` ファサードを新設
- 消費者はプリミティブ値(string, number, Date)だけで操作可能に
- リポジトリをオプショナル引数で注入可能(DI対応)
- 旧API (`createMemberUseCases` / `createEventUseCases`) は `@deprecated`
### Before
```ts
const useCases = createMemberUseCases();
await useCases.registerMember.execute({
name: "太郎",
studentId: StudentId.fromString("725A1061"),
email: new UniversityEmail("taro@shizuoka.ac.jp"),
personalEmail: notRecorded(),
affiliation: { type: "undergraduate", value: { ... } },
});
```
### After
```ts
const members = createMemberService();
await members.register({
name: "太郎",
studentId: "725A1061",
email: "taro@shizuoka.ac.jp",
affiliation: { type: "undergraduate", value: { ... } },
});
```
## Test plan
- [x] 既存テスト全64件パス
- [x] 型チェック通過(新ファサードにエラーなし)
- [ ] CIが通ること
Closes #97, Closes #89
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- devin-review-badge-begin -->
---
<a href="https://app.devin.ai/review/su-its/core/pull/109"
target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
</picture>
</a>
<!-- devin-review-badge-end -->
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR prepares the @shizuoka-its/core package for the v3.0.0 release candidate by updating the project version to 3.0.0-rc.0.
Changes:
- Bump
package.jsonversion from2.1.2to3.0.0-rc.0 - Update
package-lock.jsonroot package version entries to3.0.0-rc.0
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| package.json | Updates the published package version to 3.0.0-rc.0. |
| package-lock.json | Keeps lockfile root package version in sync with package.json. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
9f3758e to
ea5df90
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
メジャーバージョン v3.0.0 のリリース候補。
What
🤖 Generated with Claude Code