APM and plugins
What APM is
Section titled “What APM is”APM is the open source Agent Package Manager at github.com/microsoft/apm. It installs agent assets such as skills from Git repositories into Copilot-compatible locations and records an apm.lock.yaml lockfile.
This repo uses APM for one thing: pinning the third-party Skills for Fabric semantic model authoring skill.
# APM (Agent Package Manager) manifest for the Contoso Pharmacy lab.## Consume: installs the third-party Skills for Fabric skill this lab uses, pinned to a release.# apm install --only apm --target copilot# --only apm skips the MCP servers that Skills for Fabric declares; this repo configures its own# in .vscode/mcp.json. See Lab 06.## Publish: this lab's skills live in .github/skills (the folder the lab teaches), which APM treats# as build output, so this manifest does not export them as a package. Other repos install one# skill at a time by subdirectory instead, for example:# apm install sabajamalian/fabric-powerbi-ai-devops-demo/.github/skills/pharmacy-model-conventions# See Lab 14.name: fabric-powerbi-ai-devops-demoversion: 1.0.0description: Copilot skills, agents, and prompts for making a Power BI semantic model AI-ready, from the Contoso Pharmacy lab. Synthetic data only.license: MITrepository: https://github.com/sabajamalian/fabric-powerbi-ai-devops-demokeywords: [power-bi, tmdl, semantic-model, copilot, skills]
targets: - copilot
dependencies: apm: - git: https://github.com/microsoft/skills-for-fabric.git ref: v0.3.17 skills: - semantic-model-authoringlockfile_version: '1'apm_version: 0.31.0dependencies:- repo_url: microsoft/skills-for-fabric name: skills-for-fabric host: github.com resolved_commit: 65bfb5eb2c488cd03183df88f76ac3de65dcb910 resolved_ref: v0.3.17 version: 0.3.17 package_type: skill_bundle deployed_files: - .agents/skills/semantic-model-authoring - .agents/skills/semantic-model-authoring/SKILL.md - .agents/skills/semantic-model-authoring/apm.yml - .agents/skills/semantic-model-authoring/references/connection-binding.md - .agents/skills/semantic-model-authoring/references/dax-guidelines.md - .agents/skills/semantic-model-authoring/references/dax-perf-decision-guide.md - .agents/skills/semantic-model-authoring/references/dax-perf-patterns.md - .agents/skills/semantic-model-authoring/references/direct-lake-guidelines.md - .agents/skills/semantic-model-authoring/references/field-parameters.md - .agents/skills/semantic-model-authoring/references/metadata-discovery.md - .agents/skills/semantic-model-authoring/references/modeling-guidelines.md - .agents/skills/semantic-model-authoring/references/naming-conventions.md - .agents/skills/semantic-model-authoring/references/pbip.md - .agents/skills/semantic-model-authoring/references/semantic-model-ai-readiness.md - .agents/skills/semantic-model-authoring/references/semantic-model-rest-api.md - .agents/skills/semantic-model-authoring/references/tmdl-guidelines.md deployed_file_hashes: .agents/skills/semantic-model-authoring/SKILL.md: sha256:14e38125862a5892634250b9c2619303811415acb27a0348c2a563ba8b804c80 .agents/skills/semantic-model-authoring/apm.yml: sha256:5869fbcf9cc0ceb68b73c2f726c823614ede0513efafcd9b43ddf157b3816f34 .agents/skills/semantic-model-authoring/references/connection-binding.md: sha256:f46fdda2ff62da2efe2835a840474328c2a3a107d50db1d58fa966c628cde1b7 .agents/skills/semantic-model-authoring/references/dax-guidelines.md: sha256:9c1645f1b2aaf6088b239c5015ca2b6c5133d01914035dbe83fcf784012dd5de .agents/skills/semantic-model-authoring/references/dax-perf-decision-guide.md: sha256:13a23d4cf4b3083b80502e15f6a8b589dddcdc30d8ca05a6d23421d7c1af4042 .agents/skills/semantic-model-authoring/references/dax-perf-patterns.md: sha256:270d87a24e375d117679c32535a05e75ea887f1f15377648b816659909503451 .agents/skills/semantic-model-authoring/references/direct-lake-guidelines.md: sha256:022d51a2dac429e50e6359ca6ab73b625c0bf1fae0b34c4d92cd2a7c75568885 .agents/skills/semantic-model-authoring/references/field-parameters.md: sha256:2977410b5a9ee6176c96d2ba3237ba07ffdac93d2c7503833ea1cfeefdee730d .agents/skills/semantic-model-authoring/references/metadata-discovery.md: sha256:cf57d3073f6624c5f18342cac44a61ee65be473b3e3f38a46db4bf6aed894f87 .agents/skills/semantic-model-authoring/references/modeling-guidelines.md: sha256:798aadc21662fde470713019868e345b39f838b4cf8f9ba5ada854e228b2a45c .agents/skills/semantic-model-authoring/references/naming-conventions.md: sha256:b64c4e5abf90e03257926c8350952e9fda36a854ff13903e70ebf397dcebe019 .agents/skills/semantic-model-authoring/references/pbip.md: sha256:005d5feab1864ac4fed3f2a92c2fbf5f45f7549d612b0793d8ec90be9df1c740 .agents/skills/semantic-model-authoring/references/semantic-model-ai-readiness.md: sha256:f1d654f29e305f8db8384a322cc868d772145e184b8a41dc99ee8288f7f98cb5 .agents/skills/semantic-model-authoring/references/semantic-model-rest-api.md: sha256:2f78bbff73424de24cfa269137858013d2fab022eb4c2544811e7edbb2e99993 .agents/skills/semantic-model-authoring/references/tmdl-guidelines.md: sha256:d2d07210308b1b22b24c797f3cc63d576dacd282b346d116eef8423c65ccc1b5 content_hash: sha256:9b12222210646e499657147243c8313e610968dfeaefc04f54589aaab74afc38 skill_subset: - semantic-model-authoring declared_license: MITdeployments:- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: null- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/SKILL.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:14e38125862a5892634250b9c2619303811415acb27a0348c2a563ba8b804c80- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/apm.yml runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:5869fbcf9cc0ceb68b73c2f726c823614ede0513efafcd9b43ddf157b3816f34- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/connection-binding.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:f46fdda2ff62da2efe2835a840474328c2a3a107d50db1d58fa966c628cde1b7- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/dax-guidelines.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:9c1645f1b2aaf6088b239c5015ca2b6c5133d01914035dbe83fcf784012dd5de- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/dax-perf-decision-guide.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:13a23d4cf4b3083b80502e15f6a8b589dddcdc30d8ca05a6d23421d7c1af4042- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/dax-perf-patterns.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:270d87a24e375d117679c32535a05e75ea887f1f15377648b816659909503451- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/direct-lake-guidelines.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:022d51a2dac429e50e6359ca6ab73b625c0bf1fae0b34c4d92cd2a7c75568885- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/field-parameters.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:2977410b5a9ee6176c96d2ba3237ba07ffdac93d2c7503833ea1cfeefdee730d- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/metadata-discovery.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:cf57d3073f6624c5f18342cac44a61ee65be473b3e3f38a46db4bf6aed894f87- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/modeling-guidelines.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:798aadc21662fde470713019868e345b39f838b4cf8f9ba5ada854e228b2a45c- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/naming-conventions.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:b64c4e5abf90e03257926c8350952e9fda36a854ff13903e70ebf397dcebe019- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/pbip.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:005d5feab1864ac4fed3f2a92c2fbf5f45f7549d612b0793d8ec90be9df1c740- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/semantic-model-ai-readiness.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:f1d654f29e305f8db8384a322cc868d772145e184b8a41dc99ee8288f7f98cb5- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/semantic-model-rest-api.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:2f78bbff73424de24cfa269137858013d2fab022eb4c2544811e7edbb2e99993- kind: project-relative target: copilot value: .agents/skills/semantic-model-authoring/references/tmdl-guidelines.md runtime: null scope: project owners: - microsoft/skills-for-fabric active_owner: microsoft/skills-for-fabric content_hash: sha256:d2d07210308b1b22b24c797f3cc63d576dacd282b346d116eef8423c65ccc1b5What gets installed
Section titled “What gets installed”The package entry installs semantic-model-authoring from microsoft/skills-for-fabric v0.3.17. The lockfile records the resolved commit and tested APM version 0.31.0.
The command used by automation is:
apm install --only apm --target copilotIn this repo, that installs the external skill under .agents/skills, which is gitignored. The repo still keeps its own lab skills under .github/skills because those are the files learners edit and review.
# Prepares the Copilot cloud agent's environment before it starts work on an assigned issue (Lab 13).# The job name must be copilot-setup-steps. See# https://docs.github.com/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environmentname: Copilot setup steps
on: workflow_dispatch: push: paths: [".github/workflows/copilot-setup-steps.yml"] pull_request: paths: [".github/workflows/copilot-setup-steps.yml"]
permissions: contents: read
jobs: copilot-setup-steps: runs-on: ubuntu-latest timeout-minutes: 20 permissions: contents: read steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.12"
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: "22"
- name: Python tools and validation shell: pwsh run: ./scripts/Initialize-DevEnvironment.ps1
# Installs the pinned Skills for Fabric skill from apm.yml into .agents/skills, where the # cloud agent discovers project skills. --only apm skips the MCP servers that package declares. - name: Skills for Fabric (APM) run: | python -m venv "$RUNNER_TEMP/apm" "$RUNNER_TEMP/apm/bin/pip" install --disable-pip-version-check --quiet apm-cli==0.31.0 "$RUNNER_TEMP/apm/bin/apm" install --only apm --target copilotWhy this repo does not export its own skills through APM
Section titled “Why this repo does not export its own skills through APM”APM treats .github as build output for Copilot assets. That is useful for packaged dependencies. It is not useful for the lab’s teaching files, where the point is to see and edit .github/skills, .github/agents, .github/prompts, and .github/instructions directly.
Recommendation: keep team-owned skills in .github/skills until you need to share them across many repositories. Use APM to pin third-party skills and shared skill packages.
Installing one skill from another repo
Section titled “Installing one skill from another repo”If another repo publishes skills by subdirectory, install only the needed package or path rather than copying the whole repository. Pin a tag or commit. Review the generated .github output before you accept it.
A team pattern looks like this:
version: 1packages: - name: semantic-model-authoring source: github:microsoft/skills-for-fabric version: v0.3.17Copilot CLI plugin alternative
Section titled “Copilot CLI plugin alternative”Skills for Fabric also supports a Copilot CLI plugin flow. That path can be useful for individual command-line workflows. For this lab, APM is better because the install is reproducible in the cloud setup workflow and the lockfile records the exact source.
Evaluation for a team
Section titled “Evaluation for a team”| Factor | APM helps when | APM adds cost when |
|---|---|---|
| Reuse | Many repos need the same external skill. | One repo owns the skill and changes it often. |
| Pinning | You need exact tags or commits. | You are prototyping and want simple file edits. |
| Review | You want dependency diffs and lockfile updates. | Reviewers do not know the generated output. |
| Maturity | You can tolerate 0.x package-manager behavior. | You need long-term stable interfaces now. |
| Onboarding | Cloud agents need the same third-party assets. | Developers never use cloud agents. |