Skip to content

APM and plugins

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.yml
# 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-demo
version: 1.0.0
description: Copilot skills, agents, and prompts for making a Power BI semantic model AI-ready, from the Contoso Pharmacy lab. Synthetic data only.
license: MIT
repository: https://github.com/sabajamalian/fabric-powerbi-ai-devops-demo
keywords: [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-authoring
apm.lock.yaml
lockfile_version: '1'
apm_version: 0.31.0
dependencies:
- 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: MIT
deployments:
- 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:d2d07210308b1b22b24c797f3cc63d576dacd282b346d116eef8423c65ccc1b5

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:

Terminal window
apm install --only apm --target copilot

In 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.

.github/workflows/copilot-setup-steps.yml
# 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-environment
name: 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 copilot

Why 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.

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: 1
packages:
- name: semantic-model-authoring
source: github:microsoft/skills-for-fabric
version: v0.3.17

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.

FactorAPM helps whenAPM adds cost when
ReuseMany repos need the same external skill.One repo owns the skill and changes it often.
PinningYou need exact tags or commits.You are prototyping and want simple file edits.
ReviewYou want dependency diffs and lockfile updates.Reviewers do not know the generated output.
MaturityYou can tolerate 0.x package-manager behavior.You need long-term stable interfaces now.
OnboardingCloud agents need the same third-party assets.Developers never use cloud agents.