Power Platform のテナント / 環境ガバナンスを確認・設定する管理スキル。開発着手前の環境チェック(既定環境ではないか・マネージド環境・Dataverse / Code Apps / MCP の有効化・セキュリティ ロール・管理 API アクセス)と DLP 事前チェックを非対話スクリプトで実行し、必要ならマネージド環境設定・カスタムコネクタの DLP 分類・ACP(Advanced connector policies)の許可コネクタを dry-run 付きで変更する。Microsoft 第一者サービスだけを許可する ACP 推奨プロファイルの適用と、クラシック DLP から ACP への移行も支援する。クラシック DLP と ACP は既定の混成モードで併用され、より制限の厳しい方が適用されるため両方を確認する。オプションとして、既定環境 / 個人開発者環境 / 市民開発者環境 / AI CoE セントラル / AI CoE 内製開発の 5 グループからなるテナント全体の環境戦略を、読み取り専用スキャン → 移行プラン(admin-migration-plan.md)→ レビュー → 適用の順で策定・実行する。設定は環境グループのルールで行うのを原則とし、グループ ルールに無い項目(既定環境ルーティング・Dataverse for Teams 禁止・Dataverse 検索・グループへの割り当て・Copilot クレジット配分)だけをテナント設定・環境個別設定・Dataverse の組織設定で補う。IP 制限・テナント分離・監査ログ・ライセンス配分などの管理設定は references にまとめる。
alm
コードファースト資産(エージェント定義・Code Apps の構成・IaC など)を秘匿化・汎用化したテンプレートとして Git 管理し、pre-commit ゲート → 自律レビューゲート → 承認・デプロイ → リリース記録までを CI/CD で回すための共通基盤。GitHub Actions / Azure Pipelines / その他 Git ホスティングと、GitHub Secrets / Azure DevOps 変数グループ / Azure Key Vault の各シークレットストアに対応し、プロダクト固有のデプロイ手順は各スキルへ委譲する。
インストール方法を見る含まれるファイル(14)
- SKILL.md14.2 KB
- alm.config.example.json756 B
- references/.env.example1.7 KB
- references/ci-providers.md9.6 KB
- references/repo-scaffold.md5.1 KB
- references/review-gates.md15.9 KB
- references/troubleshooting.md4.2 KB
- scripts/alm_config.py4.2 KB
- scripts/check_secrets.py3.2 KB
- scripts/gate_rules.py16.8 KB
- scripts/render.py3.1 KB
- scripts/review_report.py3.9 KB
- scripts/review_sanitization.py4.0 KB
- scripts/sanitize.py9.9 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
ALM(秘匿化・汎用化・CI/CD)共通スキル
コードファースト資産を安全に Git へ載せ、機械判定だけでデプロイまで到達させるための共通基盤。
プロダクト非依存であり、foundry-autopilot(Foundry エージェント)、code-apps(Code Apps)など
どのスキルからも同じ仕組みで利用できる。デプロイの実処理だけを各プロダクトスキルへ委譲する。
| 原則 | 内容 |
|---|---|
| テンプレートのみコミット | 追跡するのは ${VAR} 入りテンプレートだけ。実値は .env とシークレットストアにのみ存在する |
| 二重の防御 | ローカルは pre-commit(sanitize.py → check_secrets.py)、CI は決定論ゲート(review_sanitization.py) |
| 機械判定 | レビューはルールベース。人手の承認(HITL)を前提にせず、判定を再現可能にする |
| ホスティング非依存 | Git ホスティングとシークレットストアは GIT_PROVIDER / SECRET_BACKEND で差し替える |
| 最小権限 | ワークフローは permissions: を明示。contents: write はリリースジョブだけに許可する |
| 記録はリリースに残す | デプロイ結果とレビュー結果は GitHub Releases(バージョンごと)に残す。Issue には残さない |
| 設定の外出し | パス・許可リスト等は alm.config.json。スクリプト本体はどのリポジトリでも無改変で使う |
前提ツール: Python 3.10+、Git、Azure CLI(
az)。 シークレットストアに応じて GitHub CLI(gh)またはaz extension add --name azure-devopsを追加する。
事前確認(会話の最初に 1 回だけ)
本スキルの利用が確定したら、standard の共通契約に加え、 1 回の AskUserQuestion で次をまとめて確認する。
| # | 質問 | 合格条件 |
|---|---|---|
| 1 | Git provider、repository、visibility、既定 branch は何か | GitHub / Azure DevOps / その他と private / public を確定している |
| 2 | branch protection と environment approval を変更できる担当者は誰か | repository / project の管理担当者と承認者を記録している |
| 3 | secret backend と CI identity は何か | GitHub Secrets / variable group / Key Vault、OIDC / workload identity、rotation owner を確定している |
| 4 | CI が各デプロイ先へ持つ最小権限は何か | 対象環境ごとの scope、期限、role assignment 担当者を記録している |
| 5 | release、rollback、監査ログの運用は何か | version 規則、成果物保持、失敗時の戻し方、通知先を承認済みである |
personal access token や長期 client secret を既定にせず、OIDC / workload identity を優先する。 repository 管理権限、secret backend、CI identity のいずれかが未確定ならパイプラインを有効化しない。
各プロダクトスキルとの責務分担
| 担当 | 内容 | 参照先 |
|---|---|---|
alm(本スキル) | 秘匿化・汎用化・pre-commit・レビューゲート・承認・リリース記録 | 本ファイル |
foundry-autopilot | Foundry エージェント定義、ブループリント、Teams パッケージ、公開 | foundry-autopilot |
code-apps | Code Apps の実装、npm run deploy などのデプロイ手順 | code-apps |
standard | ソリューション運用・環境戦略などの上位ルール | standard |
プロダクトスキル側は「何をデプロイするか」だけを定義し、 「どう秘匿化し、どう検証し、どう承認して記録するか」は本スキルに従う。
スキル同梱スクリプト
テーマリポジトリの scripts/ へそのままコピーして使う(alm_config.py を必ず一緒に置く)。
| スクリプト | 用途 | 実行場所 |
|---|---|---|
| scripts/alm_config.py | alm.config.json の読み込み(他スクリプトが import) | - |
| scripts/sanitize.py | 実値入りファイルを ${VAR} 化し、シークレットストアへ同期 | pre-commit |
| scripts/check_secrets.py | ステージ済み差分への実値混入を検査 | pre-commit |
| scripts/render.py | テンプレートの ${VAR} を環境変数で解決 | ローカル / CI |
| scripts/review_sanitization.py | 秘匿化・汎用化の決定論レビューゲート | CI(必須チェック) |
| scripts/gate_rules.py | 品質 / 汎用性 / セキュリティ / 可読性 / リリース判定のルールエンジン | CI(各ゲート) |
| scripts/review_report.py | 各ゲートの判定を 1 枚のレビュー結果表に統合 | CI(レポート) |
Step 1: レイアウトを alm.config.json で宣言する
スクリプトは無改変で使い、リポジトリごとの差分は設定ファイルだけにする。
未作成なら既定値(**/*.template.* をテンプレート、.env を追跡禁止)で動く。
Copy-Item .github/skills/alm/scripts/*.py scripts/
Copy-Item .github/skills/alm/alm.config.example.json alm.config.json
| キー | 意味 | 例(foundry-autopilot) | 例(code-apps) |
|---|---|---|---|
forbidden_tracked | 追跡してはいけないファイル | .env, a365.generated.config.json | .env, .power/ の生成物 |
templates | ${VAR} 入りテンプレート(コミット対象) | agents/**/*.template.yaml | power.config.template.json |
rendered | レンダリング結果(追跡禁止) | agents/**/agent.yaml | power.config.json |
artifacts | ビルド生成物(追跡禁止) | teams/*.zip | dist/** |
non_secret_vars | 公開識別子(${VAR} 化しない) | AGENT_NAME, BLUEPRINT_ID | APP_NAME |
contents_write_jobs | contents: write を許可するジョブ | release | release |
Step 2: 秘匿値を .env に隔離する
.env(実値・.gitignore)と.env.example(プレースホルダーのみ・コミット対象)を作る。 雛形は references/.env.example。- テンプレートには実値を一切書かない。環境依存値はすべて
${VAR}にする。 - 公開識別子(アプリ名・エージェント名など)は
non_secret_varsに入れる。 これを入れないと、文章中の名称まで${VAR}に置換されてテンプレートが壊れる。
python scripts/render.py --template agents/<name>/agent.template.yaml --output agents/<name>/agent.yaml
Step 3: pre-commit ゲートを有効化する
git config core.hooksPath .githooks
#!/bin/sh
set -e
# 1. 実値入りファイルを汎用化し、シークレットストアへ同期してテンプレートをステージ
python scripts/sanitize.py --env .env --set-secrets --stage
# 2. ステージ済み差分に実値が残っていないか検査(残っていればコミット中止)
python scripts/check_secrets.py --env .env
.gitignore を含む雛形一式は references/repo-scaffold.md。
Step 4: シークレットストアを選ぶ
SECRET_BACKEND で送信先が切り替わる。Git ホスティングとは独立に選べる。
python scripts/sanitize.py --env .env --set-secrets --secret-backend github --stage
python scripts/sanitize.py --env .env --set-secrets --secret-backend azure-devops --stage
python scripts/sanitize.py --env .env --set-secrets --secret-backend keyvault --stage
| Git ホスティング | CI 定義 | シークレット保管先 | SECRET_BACKEND |
|---|---|---|---|
| GitHub(private) | .github/workflows/ | GitHub Actions Secrets | github |
| Azure DevOps Repos(private) | .azuredevops/ | 変数グループ(Key Vault 連携可) | azure-devops |
| その他 Git | 各 CI の規約 | Azure Key Vault | keyvault |
| ローカルのみ(PoC) | なし | .env のみ | none |
Azure へのログインは必ず OIDC / ワークロード ID フェデレーションを使い、 クライアントシークレットを保管しない。設定手順は references/ci-providers.md。
Step 5: レビューゲートを CI に組み込む
5.1 最小構成(決定論ゲートのみ)
PR で review_sanitization.py を実行し、必須ステータスチェックにする。
これだけで「実値混入」「テンプレート未汎用化」はマージできなくなる。
5.2 推奨構成(自律レビューゲート連鎖)
5 体のレビューエージェントを直列に並べ、全ゲート PASS のときだけデプロイする。
各エージェントは gate_rules.py のルールを評価するだけなので、判定は決定論的で人手承認が不要。
| ゲート | エージェント | 主なルール |
|---|---|---|
| 1. 品質 | quality-inspector | YAML の妥当性、テンプレートの構文、.env.example との整合、スクリプトの構文 |
| 2. 汎用性 | generalization-auditor | 実値混入なし、${VAR} がすべてシークレット経由、ワークフローに環境固有リテラルなし |
| 3. セキュリティ | security-reviewer | 最小権限、pull_request_target 禁止、Action 許可リスト、シークレット持ち出し検出 |
| 4. 可読性 | readability-editor | ジョブ/ステップ名、ヘッダーコメント、行長、TODO 残存 |
| 5. リリース判定 | release-gatekeeper | 上流 4 ゲートがすべて PASS か(GO / NO-GO) |
python scripts/gate_rules.py --gate quality --out .gate/quality.json
python scripts/gate_rules.py --gate release --verdict-dir .gate
python scripts/review_report.py --verdict-dir .gate --out .gate/review-report.md
ワークフロー定義・ルール一覧・プロンプトの書き方は references/review-gates.md。
Step 6: デプロイを承認付きで実行する
- 既定ブランチへのマージでデプロイジョブを起動する。
- デプロイの実処理はプロダクトスキルが定義する(
foundry-autopilotならdeploy.py、code-appsならnpm run deploy)。ALM 側は認証・環境・順序だけを規定する。 - 承認の扱いは 2 択にする。両方を併用しない。
- 自律運用: ゲート連鎖を審査とみなし、Environment の必須レビュアーを外す。
- 有人運用: Environment に必須レビュアーを設定し、ゲート連鎖は補助にする。
Step 7: リリースとして記録する
デプロイ結果とレビュー結果は、バージョンごとの GitHub Release に残す。
- タグはデプロイしたバージョンに対応させる(例:
agent-v<version>)。 - 本文は
review_report.pyが生成したレビュー結果表をそのまま使う。 - 同じバージョンを再デプロイしたときは新規作成せず
gh release editで上書きする。 - Issue にメモを積む方式は採らない(Issue は課題管理のための場所であり、 デプロイ履歴を混ぜると課題一覧としての意味が失われる)。
flowchart TD
A[ローカル編集] --> B[git commit]
B -->|pre-commit| C[汎用化 + シークレット同期 + 漏洩検査]
C --> D[PR]
D --> E[決定論ゲート: review_sanitization]
E --> F[自律レビューゲート連鎖 5 体]
F -->|GO| G[既定ブランチへマージ]
G --> H[デプロイ(プロダクトスキルの手順)]
H --> I[GitHub Release にレビュー結果を記録]
検証チェックリスト
-
.envとrendered/artifactsに該当するファイルが追跡されていない - テンプレートに実 GUID・ARM パス・接続文字列・エンドポイントが無い
-
.env.exampleにすべての変数がプレースホルダー付きで存在する - 公開識別子が
non_secret_varsに登録されている -
git config core.hooksPath .githooksが有効 -
python scripts/review_sanitization.pyが Pass し、必須チェックになっている - ワークフローが
permissions:を宣言し、contents: writeがリリースジョブ限定 - 承認方式(自律 / 有人)が 1 つに決まっている
- デプロイのたびにリリースが作成/更新される
参考リンク
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ
Copilot Studio 新 UI の Agent flows / Workflows を構築・公開・検証する。Dataverse レコード作成/更新トリガーから既存の発行済み Copilot Studio v2 を Agent ノードで呼ぶ標準経路、Code Apps との非同期要求/結果連携、および手動 Start + inline Agent の API ライフサイクル検証を扱う。
株主総会の想定問答を、IR 抜粋(決算短信・説明資料・招集通知など)を根拠に下書きし、利用者の確認後に Dataverse の想定問答テーブルへ「下書き」として登録するスキル。 Use when ユーザーが「配当について想定問答を作って」「この論点の想定問答を 3 件追加して」「招集通知から想定問答を作って」「想定問答を登録して」と依頼したとき。 Dataverse MCP コネクタ(describe / read_query / search_data / create_record / update_record)を使用する。削除・テーブル変更のツールは使わない。
株主総会の想定問答を点検し、根拠の IR 抜粋に無い数値・存在しない根拠 ID・回答者や注意事項の抜け・趣旨の重複・下書きのまま残っているものを一覧にするスキル(書き込みはしない)。 Use when ユーザーが「想定問答を点検して」「根拠の無い数値が無いか確認して」「下書きの想定問答を一覧にして」と依頼したとき。 Dataverse MCP コネクタ(describe / read_query / search_data)を使用する。書き込み・削除のツールは使わない。
株主総会の質疑応答のリハーサル台本(議長・株主・回答役員の読み上げ原稿)を、承認済みの想定問答から作り、Dataverse のリハーサル台本テーブルへ登録するスキル。 Use when ユーザーが「リハーサルの台本を作って」「QA-001〜QA-010 で読み上げ原稿を作って」「番号を言わない株主も入れた台本を作って」と依頼したとき。 Dataverse MCP コネクタ(describe / read_query / search_data / create_record / update_record)を使用する。削除・テーブル変更のツールは使わない。
AI Builder の AI プロンプト(GPT Dynamic Prompt)を Dataverse API で作成し、Copilot Studio エージェントにツール(アクション)として追加する。Power Automate フローとの統合パターンも含む。