geekfujiwara/codeappsdevelopmentstandard/dataverse

Claude Code and agent skill by geekfujiwara/codeappsdevelopmentstandard

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Dataverse テーブル設計・構築・デモデータ投入・セキュリティロール作成。ソリューション作成からテーブル・リレーション・ローカライズ・権限設定まで Python スクリプトで一括構築する。

Install

npx vskill@latest install geekfujiwara/codeappsdevelopmentstandard/dataverse

SKILL.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 の再利用方針が確定している
2schema を変更できる担当者は誰かテーブル、列、relationship、choice を作成・更新できる System Customizer 相当の権限がある
3security 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)dictGET。パス文字列のみ(api_get("url", {"$filter": ...}) は 不可。クエリパラメータは URL に直接埋め込む)
api_post(path, body, solution=)`str \None`POST。作成レコードの ID を返す。solution=SOLUTION_NAME でソリューションヘッダー付与
api_patch(path, body)NonePATCH
api_delete(path)NoneDELETE
api_request(path, body, method="PUT")NonePUT + 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)dictFlow Management API 用。自動的に service.flow.microsoft.com スコープで認証
重要: api_get() は dict を直接返す。.json() を呼ぶとエラー。
.env 共通パラメータ
env
DATAVERSE_URL=https://{org}.crm7.dynamics.com/
TENANT_ID={your-tenant-id}
SOLUTION_NAME={YourSolutionName}
PUBLISHER_PREFIX={prefix}
SOLUTION_DISPLAY_NAME={日本語表示名} # ソリューション作成後に自動保存される
依存パッケージ
pip install azure-identity requests python-dotenv

作業フロー(必ずこの順序で進める)

Step 0: パブリッシャー・プレフィックス確認(ユーザー承認必須)

テーブル設計に入る前に、必ず既存パブリッシャーを環境から確認する。

python
from auth_helper import api_get
# 既存パブリッシャー一覧を取得
pubs = api_get("publishers?$filter=customizationprefix ne 'none'&$select=friendlyname,uniquename,customizationprefix&$orderby=friendlyname")
for p in pubs.get("value", []):
print(f" {p['customizationprefix']} — {p['friendlyname']} ({p['uniquename']})")

ユーザーに提示する内容:

  • 既存パブリッシャー一覧(プレフィックス・名前)
  • 推奨: 既存パブリッシャーを再利用するか、新規作成するか
  • 新規の場合: プレフィックス命名案(2〜5文字の英小文字)

ユーザーの承認を得てから `.env` の `PUBLISHER_PREFIX` を確定し、環境スキャンに進む。

Step 1: 環境スキャン(既存資産の棚卸し — 設計前に必須)

新規テーブルを設計する前に、必ず既存環境を API でスキャンし、再利用できる資産を棚卸しする。 いきなり新規テーブルを作らず、標準テーブル・他ソリューションのカスタムテーブルを最大限再利用する。

powershell
# 標準テーブル(account/contact/product/systemuser 等)+全カスタムテーブルを走査し、再利用レポートを出力
python -u .github/skills/dataverse/scripts/scan_environment.py --out spec/dataverse-scan.md
# 特定テーブルの列詳細も見たいとき
python -u .github/skills/dataverse/scripts/scan_environment.py --tables account,contact,product

レポートをもとにユーザーに提示し、再利用 vs 新規を合意する:

  • ユーザー: カスタムユーザーテーブルを作らない。systemuser Lookup + ownerid/createdby/modifiedby システム列を使う。
  • 顧客: 標準 account(企業)/ contact(個人)を再利用。顧客参照は customer 型 Lookup(account/contact ポリモーフィック)。
  • 製品: 標準 product / pricelevel / uom を再利用。製品マスタを新規作成しない。
  • 既存カスタムテーブル: Field Service 等が作成済みのテーブルは再利用候補として検討。
  • 新規作成: 既存に存在しない「要件固有の概念」だけに絞る。
Step 2: 名前衝突チェック(設計確定前に必ず実施)
python
# ソリューション名の重複チェック
existing_sol = api_get(f"solutions?$filter=uniquename eq '{SOLUTION_NAME}'&$select=solutionid,friendlyname")
# テーブルスキーマ名の重複チェック
# ⚠️ 環境によっては EntityDefinitions への $filter=startswith(...) が 501 Not Implemented になる。
# $select のみで全件取得し、プレフィックス一致は Python 側でフィルタする(詳細は Dataverse 統合ガイド参照)。
all_tables = api_get("EntityDefinitions?$select=LogicalName,SchemaName,DisplayName")
existing_tables = [t for t in all_tables["value"] if t["LogicalName"].startswith(f"{PREFIX}_")]

衝突がある場合はユーザーに報告し、名前を変更してから設計を確定する。

プレフィックスを既存プロジェクトと共用する環境では {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]::UTF8
chcp 65001
python -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 を先に済ませ、その後にローカライズする**。
```powershell
python -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()` で PUTMSCRM.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

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
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/geekfujiwara/codeappsdevelopmentstandard/dataverse/badge)](https://verified-skill.com/skills/geekfujiwara/codeappsdevelopmentstandard/dataverse)

Something wrong with this skill or its page? Tell us.