# org-master-sync LINEWORKS・プリザンター・Keycloak横断の組織・社員管理データベース構築プロジェクト。 設計: [docs/superpowers/specs/2026-08-07-org-master-sync-design.md](../../docs/superpowers/specs/2026-08-07-org-master-sync-design.md) ## 現状ステータス Phase 1完了: LINEWORKS取得(①fetch-lineworks)→ プリザンターマスタテーブル反映(②merge-master)が動作。 Phase 2完了: マスタ→Keycloak完全同期(④sync-keycloak)が動作。マスタの全項目(プリザンターの SiteSettings.Columnsから動的取得)をKeycloakのカスタム属性として同期し、項目の追加・削除の 両方に自動追従する。新規作成はClassZ=有のみ、既存ユーザーはCheck062に応じて無効化のみ (削除はしない)、マスタからレコード自体が消えた場合のみKeycloakユーザーを完全削除する。 前回同期状態は`configs/keycloak-sync/`で管理。 マスタテーブルはプリザンターSiteId=1(`.env`の`PLEASANTER_MASTER_SITE_ID`)。 ③sync-pleasanterは本番移行後に着手(別プランで対応)。 ## セットアップ ```bash cd apps/org-master-sync npm test # ユニットテスト実行(node --test) ``` `.env`は3システム分の認証情報を含む(gitignore対象、既に設定済み)。 Keycloak側は`org-master-sync`クライアントのサービスアカウントに`realm-management`の`realm-admin`ロールが 付与済み(User Profile属性定義の動的追加・削除に必要。Keycloak管理コンソールで1回のみ設定済み)。 ## コマンド ```bash node src/commands/fetch-lineworks.js # ① LINEWORKSから全件取得 → data/master-source/lineworks-snapshot.json node src/commands/merge-master.js # ② マスタテーブル(SiteId=1)へ突合・反映 node src/commands/sync-keycloak.js [--execute] # ④ マスタをKeycloak(nexthdレルム)へ完全同期 ``` **運用上の注意**: - ④実行前には必ず①②を先に実行すること。LINEWORKS退職者検知(②)は都度の実行に依存するため、①②を経ずに④だけを実行すると在籍状態が古いままKeycloakへ反映される - ④はプリザンター側でカラムが削除されると対応するKeycloak属性も削除し、マスタレコード自体が削除されると対応するKeycloakユーザーも完全削除する(完全同期)。ドライランで「属性削除予定」「delete予定」件数を必ず確認してから`--execute`すること Claude Skill経由でも起動可能(`.claude/skills/org-fetch-lineworks/` / `org-merge-master/` / `org-sync-keycloak/`)。 ## ディレクトリ構成 ``` org-master-sync/ .env 認証情報(git管理対象外) keys/ LINEWORKS秘密鍵(git管理対象外) src/ lib/ lineworksAuth.js / lineworksClient.js / pleasanterClient.js / keycloakClient.js / keycloakColumnSync.js config/ masterFields.js(マスタ項目→プリザンターフィールドの割当定義) commands/ fetch-lineworks.js / merge-master.js / sync-keycloak.js scripts/ 一回限りの移行・保守スクリプト(本番→テスト環境インポート等) test/ node --testによるユニットテスト data/ 取得データ・スナップショット(git管理対象外) pleasanter-saml/ SAML SSO設定一式 ``` 他システムから独立したフォルダとして構成。単体で別リポジトリへ切り出す場合もこのフォルダごと移動すればよい。