geekfujiwara/codeappsdevelopmentstandard/dataverse
Claude Code and agent skill by geekfujiwara/codeappsdevelopmentstandard
- community
Checking that the SKILL.md file is still in the repository.
Dataverse テーブル設計・構築・デモデータ投入・セキュリティロール作成。ソリューション作成からテーブル・リレーション・ローカライズ・権限設定まで Python スクリプトで一括構築する。
Install
npx vskill@latest install geekfujiwara/codeappsdevelopmentstandard/dataverseSKILL.md
Dataverse テーブル設計・構築・セキュリティロールスキル
Dataverse のソリューション・テーブル・リレーション・ローカライズ・デモデータ・セキュリティロールを Python スクリプト で一括構築する。
Code Apps 向けに SharePoint URL を渡された場合も、直接接続・継続利用の明示がなければ Dataverse への移行を既定とする。URL は仕様・移行元の参照情報として扱う。 スキーマ・業務キー・Lookup を設計し、既存データは data-migration で承認付き投入・照合する。 通常開発では admin の網羅チェックを挟まず、既存テーブルの重複確認など本スキルの安全な構築手順を進める。 Code Apps の scaffold・初回 push は全テーブル構築・移行・ローカライズの完了を待たせない。
サブリファレンス(必要に応じて参照)
| リファレンス | 内容 | |
|---|---|---|
| Dataverse 統合ガイド | CRUD・Lookup・Choice・システム列・標準テーブル再利用ガイド・トラブルシューティング | |
| セキュリティロール | カスタムセキュリティロールの作成・権限設定パターン | |
| セキュリティロールデプロイリファレンス | セキュリティロールのデプロイ手順詳細 | |
| セキュリティロールトラブルシューティング | セキュリティロール関連のトラブルシューティング |
このスキルの位置づけ: アーキテクチャ設計(architecture)で Dataverse 利用が確定した後、テーブル設計→構築を担当する。Code Apps / Generative Pages / Power Automate / Copilot Studio のいずれを使う場合でも、データ層はこのスキルで構築する。
前提
事前確認(会話の最初に 1 回だけ)
本スキルの利用が確定したら、standard の共通契約に加え、 1 回の AskUserQuestion で次をまとめて確認する。
| # | 質問 | 合格条件 | |
|---|---|---|---|
| 1 | 対象 environment、solution、publisher はどれか | URL、環境種別、solution unique name、既存 publisher の再利用方針が確定している | |
| 2 | schema を変更できる担当者は誰か | テーブル、列、relationship、choice を作成・更新できる System Customizer 相当の権限がある | |
| 3 | security role を変更する担当者は誰か | role / privilege の作成・割り当て権限を持つ担当者を別に記録している | |
| 4 | データ ownership と access depth は何か | User / Team / Organization ownership、Business Unit、行共有、監査を設計済みである | |
| 5 | デモデータや既存データを変更してよいか | 対象件数、個人情報、削除 / rollback、バックアップ方針を承認済みである |
System Administrator を既定にせず、schema 変更は System Customizer または必要 privilege の カスタムロールを優先する。security role の変更・割り当ては、その工程の担当者を分離する。 実装先または publisher が未確定なら Step 0 へ進まない。
共通認証: auth_helper.py
認証ヘルパーは standard スキルに同梱(.github/skills/standard/scripts/auth_helper.py)。 各スキルの Python スクリプトは sys.path に ../../standard/scripts を追加して import するため、コピー不要。 2 層キャッシュ(AuthenticationRecord + MSAL OS 資格情報ストア)によりデバイスコード認証は初回のみ。
コピー元: .github/skills/standard/scripts/auth_helper.py
auth_helper.py 公開 API
| 関数 | 戻り値 | 説明 | ||
|---|---|---|---|---|
api_get(path) | dict | GET。パス文字列のみ(api_get("url", {"$filter": ...}) は 不可。クエリパラメータは URL に直接埋め込む) | ||
api_post(path, body, solution=) | `str \ | None` | POST。作成レコードの ID を返す。solution=SOLUTION_NAME でソリューションヘッダー付与 | |
api_patch(path, body) | None | PATCH | ||
api_delete(path) | None | DELETE | ||
api_request(path, body, method="PUT") | None | PUT + MSCRM.MergeLabels: true ヘッダー自動付与。ローカライズ用 | ||
retry_metadata(fn, desc, max=5) | `any \ | None` | メタデータロック(0x80040237)・重複(already exists)検出リトライ。既存スキップ対応 | |
get_token(scope=) | str | アクセストークン。省略時は {DATAVERSE_URL}/.default | ||
flow_api_call(method, path, body) | dict | Flow Management API 用。自動的に service.flow.microsoft.com スコープで認証 |
重要:api_get()はdictを直接返す。.json()を呼ぶとエラー。
.env 共通パラメータ
依存パッケージ
作業フロー(必ずこの順序で進める)
Step 0: パブリッシャー・プレフィックス確認(ユーザー承認必須)
テーブル設計に入る前に、必ず既存パブリッシャーを環境から確認する。
ユーザーに提示する内容:
- 既存パブリッシャー一覧(プレフィックス・名前)
- 推奨: 既存パブリッシャーを再利用するか、新規作成するか
- 新規の場合: プレフィックス命名案(2〜5文字の英小文字)
ユーザーの承認を得てから `.env` の `PUBLISHER_PREFIX` を確定し、環境スキャンに進む。
Step 1: 環境スキャン(既存資産の棚卸し — 設計前に必須)
新規テーブルを設計する前に、必ず既存環境を API でスキャンし、再利用できる資産を棚卸しする。 いきなり新規テーブルを作らず、標準テーブル・他ソリューションのカスタムテーブルを最大限再利用する。
レポートをもとにユーザーに提示し、再利用 vs 新規を合意する:
- ユーザー: カスタムユーザーテーブルを作らない。
systemuserLookup +ownerid/createdby/modifiedbyシステム列を使う。 - 顧客: 標準
account(企業)/contact(個人)を再利用。顧客参照は customer 型 Lookup(account/contact ポリモーフィック)。 - 製品: 標準
product/pricelevel/uomを再利用。製品マスタを新規作成しない。 - 既存カスタムテーブル: Field Service 等が作成済みのテーブルは再利用候補として検討。
- 新規作成: 既存に存在しない「要件固有の概念」だけに絞る。
詳細な再利用判断は Dataverse 統合ガイド — 標準テーブル再利用ガイド を参照。
Step 2: 名前衝突チェック(設計確定前に必ず実施)
衝突がある場合はユーザーに報告し、名前を変更してから設計を確定する。
プレフィックスを既存プロジェクトと共用する環境では{prefix}_projectのような一般名が高確率で衝突する。専用の名前空間(例:{prefix}_kbproject)を採用して回避する。なおsetup_dataverse.pyは Step 1 の前にvalidate_no_foreign_tables()で対象ソリューション外の既存テーブルとの衝突を必ず再検証し、検出したら API 呼び出し前に中断する。
Step 3: テーブル設計(ユーザー承認必須)
設計書を作成してユーザーに提示する。以下をすべて含める:
| 項目 | 内容 | |
|---|---|---|
| 再利用テーブル一覧 | Step 1 スキャン結果から、再利用する標準/既存テーブルを明記 | |
| テーブル一覧 | 新規のみ。マスタ → 主 → 従属の順に記載 | |
| 列定義 | 英語スキーマ名、型、必須、Choice 値(100000000 始まり) | |
| 全 Lookup リレーション | 漏れなく明記(既存テーブルへの Lookup・customer 型を含む) | |
| ローカライズ計画 | テーブル名・列名・Choice オプションの日本語名 | |
| デモデータ計画 | 全テーブルに対して(従属テーブル含む) |
Code Apps 案件: スキーマ承認後すぐに Code Apps サブエージェントを起動する(並行実行)architectureスキルで Code Apps が確定している場合、ユーザーがスキーマを承認したタイミングで`code-apps` スキルをサブエージェントとして起動し、Dataverse 構築(Step 4)と並行してCode Apps 開発(scaffold → deploy → add-data-source)を進める。- このエージェント(dataverse): Step 4 を--skip-localizeで実行(テーブル構築のみ)- サブエージェント(code-apps): scaffold →pac code init→npm run deploy→pac code add-data-source(全テーブル)- このエージェント(dataverse): Code Apps 側のadd-data-source完了を待たずに--localize-onlyを実行して完了Dataverse 構築が先に終わっても Code Apps サブエージェントは独立して継続する。
Step 4: 構築スクリプト実行
同梱の setup_dataverse.py をプロジェクト用にカスタマイズして実行する。
必ず `python -u`(unbuffered)で実行する: テーブル作成・Lookup 作成・ローカライズは数分〜十数分かかるため、標準の出力バッファリング下では「止まって見える」ことがある。-uを付けて Step ごとの進捗(=== Step 2: テーブル作成 ===など)を確実にリアルタイム表示させる。スクリプト側でもsys.stdout.reconfigure(line_buffering=True)を有効化済み。
**Windows PowerShell でログをファイルにリダイレクト/Tee-Objectする場合は、chcp 65001に加えて[Console]::OutputEncodingも明示的に UTF-8 へ設定する**:chcp 65001は Windows のコンソールコードページを切り替えるだけで、PowerShell(pwsh 7.x を含む)が子プロセスの出力を解釈する[Console]::OutputEncoding(.NET プロパティ)には自動反映されないことがある。chcpだけだと[Console]::OutputEncodingが cp932 のまま残り、スクリプト側が UTF-8 で出力していても日本語部分が文字化けする(-Encoding UTF8を付けて読み直しても直らない、リダイレクト時点で既に破損しているため)。両方を実行前に設定することで確実に防げる。```powershell[Console]::OutputEncoding = [System.Text.Encoding]::UTF8chcp 65001python -u setup_dataverse.py 2>&1 | Tee-Object -FilePath setup_dataverse.log```
`TABLES` 定義は API 呼び出し前に自動で事前検証される(validate_tables(), Step 0):Decimal/Integer の値域や String/Memo のmaxLengthが Dataverse の上限を超えていないかをローカルで静的チェックし、超過があれば構築を開始する前に分かりやすいエラーで停止する(並行構築の途中で 400 エラーになり一部だけ作成された状態で止まる事故を防ぐ)。
テーブルが複数ある場合は並行作成(環境の混雑度に応じて並行数を調整):setup_dataverse.pyのStep 2 では、TABLESに 2 つ以上のテーブルが定義されている場合、ThreadPoolExecutor(デフォルト最大 3 並行)で全テーブルを並行作成する。⚠️ Dataverse のメタデータロックはテナント全体で共有されるため、既存カスタムテーブルが大量にある(100 件超)環境や、同一環境で他セッションが並行してメタデータ操作をしている環境では並行数が高いほど競合が増える。実測では 10 テーブルを 5 並行で作成したところ 7 テーブルがmax retries (5) exceededで失敗し、並行数を 2 に落として再実行したところ全て成功した。失敗が多発する場合はcreate_tables()のThreadPoolExecutor(max_workers=...)を 2 まで下げて再実行する。スクリプトはべき等(成功済みテーブル・列はalready exists, skippingで自動スキップ)なので、同じコマンドを再実行するだけで失敗分だけがリトライされ、安全に復旧する。Lookup(Step 3)は全テーブルと列が揃ってから作成するので、このスクリプトでの呼び出し順は変わらない(create_tables()が全スレッドの完了を待ってから return する)。
Code Apps を使う場合はローカライズを2段階に分ける:pac code add-data-sourceは日本語DisplayName だとFailed to sanitize stringで失敗することがある。ローカライズ→英語に一時戻す→再ローカライズという無駄な往復を避けるため、**構築時点ではローカライズせず英語のままadd-data-sourceを先に済ませ、その後にローカライズする**。```powershellpython -u setup_dataverse.py --skip-localize # テーブル構築のみ(英語のまま)# ここで code-apps サブエージェント側の add-data-source を全テーブルに実行(build-reference.md Step 4)python -u setup_dataverse.py --localize-only # ローカライズ・デモデータ投入```Code Apps を使わない(Generative Page / モデル駆動型アプリのみ等)場合は、従来どおりフラグなしで一括実行して問題ない(python -uは常に付ける)。
必須要件
スキーマ設計
| ルール | 理由 | |
|---|---|---|
| 設計前に環境スキャン(Step 1)を必ず実行 | 既存テーブルと重複作成して二重管理になる事故を防ぐ。scan_environment.py で棚卸し | |
| ユーザー参照は systemuser + システム列 | カスタムユーザーテーブルを作らない。ownerid/createdby/modifiedby を活用 | |
| 顧客は account/contact を再利用 | 標準テーブルを使う。顧客 Lookup は customer 型(account/contact ポリモーフィック) | |
| 製品は product/pricelevel/uom を再利用 | 製品マスタを新規作成しない | |
| スキーマ名は英語のみ | 日本語スキーマ名は npx pa app add data-source で失敗する | |
| ユーザー参照は SystemUser テーブル | カスタムユーザーテーブルを作らない | |
| 作成者・報告者は `createdby` システム列を利用 | カスタム ReportedBy Lookup は不要 |
⚠️ Power Pages 例外: Power Pages では Web API 経由のレコード作成時にcreatedbyがアプリケーションユーザー(サービスアカウント)になるため、createdbyで報告者を追跡できない。Power Pages 向けテーブルでは Contact テーブルへの Lookup 列で報告者を追跡する設計が必須。詳細は power-pages スキルの教訓 19 を参照。
| Choice 値は `100000000` 始まり | 0, 1, 2... はカスタム Choice では使用不可 | |
|---|---|---|
| マスタテーブルは要件から網羅的に洗い出す | カテゴリ・場所・設備等、ユーザーが言及した分類はすべてマスタ化 | |
| 全 Lookup リレーションシップを設計書に明記 | 漏れると Lookup が機能しない | |
| デモデータは全テーブル(従属テーブル含む)に計画 | コメント等の従属テーブルにもデモデータを用意 | |
| KPI・日数計算の起点になる日時は業務日時列として明示的に持つ | createdon はレコードを Dataverse に書いた日時であり業務上の発生日時ではない。デモデータ投入や環境移行で全レコードが同日に寄り、終了日時より後ろになって日数差が負になる。詳細は references/troubleshooting.md の教訓を参照 | |
| Instructions のテーブル名は単数形の論理名 | Power Apps MCP / Dataverse MCP は LogicalName でアクセス。複数形(EntitySetName)や表示名は不可 |
構築スクリプト
| ルール | 理由 | |
|---|---|---|
| `retry_metadata()` を使う | auth_helper.py 組み込みのリトライ。メタデータロック(0x80040237)・重複(already exists)を自動ハンドリング | |
| テーブル作成間に `time.sleep(10)`、列追加間に `time.sleep(5)` | メタデータロックの 予防策。retry_metadata はリアクティブ(発生後リトライ)だが、プロアクティブに待機する方が結果的に速い(リトライ回数が減る) | |
| リレーション作成順: マスタ → 主 → 従属 → Lookup | 依存テーブルが存在しないとリレーション作成失敗 | |
| 既存テーブルでもカラム欠落を補完 | テーブルは既存でも、前回失敗したカラムが欠けている場合がある。個別にカラム存在チェックして不足分を追加 | |
| `api_post()` に `solution=SOLUTION_NAME` を渡す | ソリューションヘッダー付与。テーブル・列・Lookup すべてに | |
| テーブル作成後に `PublishAllXml` | テーブルのメタデータを公開しないとローカライズが失敗する場合がある | |
| `PublishAllXml` は 429 レート制限に備える | 大量メタデータ操作後に 429 が頻発。時間を置いてスクリプト再実行で回復。べき等設計必須 | |
| ローカライズは `api_request()` で PUT | MSCRM.MergeLabels: true ヘッダーが自動付与される | |
| ローカライズ後に再度 `PublishAllXml` | ローカライズの反映に公開が必要 | |
| ソリューション含有は `AddSolutionComponent` で検証 | MSCRM.SolutionName ヘッダーだけに依存しない | |
| EntitySetName は API で取得 | 複数形の推測は誤る場合がある(例: equipmentcategorys vs em_equipmentcategories) | |
| ソリューション表示名を `.env` に自動保存 | _save_env_value("SOLUTION_DISPLAY_NAME", name) で永続化。他スクリプトから参照可能 | |
| メタデータロックで最大リトライ超過時は再実行 | retry_metadata() の max retries (5) を超えた列は、スクリプト再実行時に「既存。スキップ」で回復 | |
| 失敗が多発する環境では並行数を下げる | 既存カスタムテーブルが多い環境では max_workers を 5→2〜3 に下げると失敗率が大幅に下がる(実測) | |
| 429 レート制限は時間を置いて再実行 | PublishAllXml・EntityDefinitions PUT で 429 が頻発。べき等設計でスクリプト再実行で回復 |
Lookup と NavProp
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.github/skills/dataverse/SKILL.md
Popularity
- Repository stars
- 57
- Repository forks
- 20
- 7-day trend score
- 20
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/geekfujiwara/codeappsdevelopmentstandard/dataverse)