Summary
Microsoft 365 Copilot Cowork (Frontier preview) discovers custom skills from <OneDrive>/Documents/Cowork/skills/<name>/SKILL.md. The format is identical to APM's existing agentskills.io SKILL.md spec, so APM users on Frontier could one-shot-deploy their APM skills to Cowork — today they copy files by hand.
This issue tracks adding a first-class, experimentally-gated cowork target so apm install --target cowork --global writes skills straight into the OneDrive-synced folder.
Upstream reference: https://learn.microsoft.com/en-us/microsoft-365/copilot/cowork/use-cowork#create-custom-skills
Design decisions (agreed)
| Decision |
Choice |
| Experimental flag |
cowork in core/experimental.py::FLAGS (off by default) |
| Gating style |
Visible-but-disabled — target profile always in KNOWN_TARGETS, infra fields always present but inert; user-observable behaviour strictly flag-gated |
| OneDrive resolution |
Auto-detect macOS (~/Library/CloudStorage/OneDrive-*) and Windows (ONEDRIVE env); Linux env-var-only; APM_COWORK_SKILLS_DIR override |
| Scope |
User-scope only (--global); project-scope errors cleanly |
| Target model |
First-class cowork target, never auto-detected, opt-in only |
| Primitives |
Skills only; agents/instructions/hooks/prompts skipped with a single summary [!] warning |
| Limits |
Warn-only when > 50 skills or any SKILL.md > 1 MB; install proceeds |
| Frontier messaging |
Silent — docs only |
Architectural changes (high level)
- New experimental flag
cowork in src/apm_cli/core/experimental.py.
- New
src/apm_cli/integration/cowork_paths.py — pure-function OneDrive resolver with validate_path_segments + ensure_path_within guards.
- Optional
user_root_resolver: Callable[[], Path | None] field on TargetProfile; only set by the cowork profile.
- Carve-out in
BaseIntegrator.validate_deploy_path / get_integration_prefixes for dynamic-root profiles.
cowork entry in KNOWN_TARGETS (skills-only primitive allow-list).
- Gating in
active_targets*: requires flag on, requires user scope, requires resolver to return a path; never auto-detected.
- Cowork-only warn branch in
SkillIntegrator for 50-skill and 1-MB caps.
- New docs page
docs/src/content/docs/integrations/cowork.md.
Non-goals
- Publishing skills to M365 tenants via any API (Cowork has no public upload API).
- Discovering or consuming existing Cowork skills as APM dependencies.
- Cowork runtime features (schedules, approvals, side-panel metadata).
- Linux auto-detection of OneDrive.
- Skill-name-collision detection against Cowork's OOTB skills.
Acceptance
apm experimental enable cowork registers the flag.
- With flag off,
apm install --target cowork prints a targeted enable hint and is a no-op.
- With flag on,
apm install --target cowork --global deploys SKILL.md to the resolved OneDrive directory; non-skill primitives are skipped with one summary warning.
- Without
--global, project-scope is cleanly rejected.
APM_COWORK_SKILLS_DIR override is path-safety validated.
- Full unit suite green; docs build green; APM Expert Review Panel pass.
Plan
Plan exists in session workspace and is being executed in worktree feat/cowork-skills off upstream/main. PR will be opened as draft against upstream/main once implementation, tests, and docs are complete and the review panel has signed off.
Summary
Microsoft 365 Copilot Cowork (Frontier preview) discovers custom skills from
<OneDrive>/Documents/Cowork/skills/<name>/SKILL.md. The format is identical to APM's existing agentskills.ioSKILL.mdspec, so APM users on Frontier could one-shot-deploy their APM skills to Cowork — today they copy files by hand.This issue tracks adding a first-class, experimentally-gated
coworktarget soapm install --target cowork --globalwrites skills straight into the OneDrive-synced folder.Upstream reference: https://learn.microsoft.com/en-us/microsoft-365/copilot/cowork/use-cowork#create-custom-skills
Design decisions (agreed)
coworkincore/experimental.py::FLAGS(off by default)KNOWN_TARGETS, infra fields always present but inert; user-observable behaviour strictly flag-gated~/Library/CloudStorage/OneDrive-*) and Windows (ONEDRIVEenv); Linux env-var-only;APM_COWORK_SKILLS_DIRoverride--global); project-scope errors cleanlycoworktarget, never auto-detected, opt-in only[!]warningSKILL.md> 1 MB; install proceedsArchitectural changes (high level)
coworkinsrc/apm_cli/core/experimental.py.src/apm_cli/integration/cowork_paths.py— pure-function OneDrive resolver withvalidate_path_segments+ensure_path_withinguards.user_root_resolver: Callable[[], Path | None]field onTargetProfile; only set by thecoworkprofile.BaseIntegrator.validate_deploy_path/get_integration_prefixesfor dynamic-root profiles.coworkentry inKNOWN_TARGETS(skills-only primitive allow-list).active_targets*: requires flag on, requires user scope, requires resolver to return a path; never auto-detected.SkillIntegratorfor 50-skill and 1-MB caps.docs/src/content/docs/integrations/cowork.md.Non-goals
Acceptance
apm experimental enable coworkregisters the flag.apm install --target coworkprints a targeted enable hint and is a no-op.apm install --target cowork --globaldeploysSKILL.mdto the resolved OneDrive directory; non-skill primitives are skipped with one summary warning.--global, project-scope is cleanly rejected.APM_COWORK_SKILLS_DIRoverride is path-safety validated.Plan
Plan exists in session workspace and is being executed in worktree
feat/cowork-skillsoffupstream/main. PR will be opened as draft againstupstream/mainonce implementation, tests, and docs are complete and the review panel has signed off.