All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Propagate headers and environment variables through OpenCode MCP adapter with defensive copies to prevent mutation (#622)
apm marketplace browse/search/add/updatenow route through the registry proxy whenPROXY_REGISTRY_URLis set;PROXY_REGISTRY_ONLY=1blocks direct GitHub API calls (#506)
- Artifactory archive entry download for virtual file packages (#525)
apm view <package> [field]command for viewing package metadata and remote refs (#613)apm view <package> versionsfield selector lists remote tags and branches viagit ls-remote(#613)apm outdatedcommand compares locked dependencies against remote refs (#613)--parallel-checks(-j) option onapm outdatedfor concurrent remote checks (default: 4) (#613)- Rich progress feedback during
apm outdateddependency checking (#613) --globalflag onapm viewfor inspecting user-scope packages (#613)
- Rename
apm infotoapm viewfor npm convention alignment;apm infokept as hidden alias (#613) - Scope resolution now happens once via
TargetProfile.for_scope()andresolve_targets()-- integrators no longer need scope-aware parameters (#562) - Unified integration dispatch table in
dispatch.py-- both install and uninstall import from one source of truth (#562) - Hook merge logic deduplicated: three copy-pasted JSON-merge methods replaced with
_integrate_merged_hooks()+ config dict (#562) apm outdateduses SHA comparison for branch-pinned deps instead of reporting them asunknown(#613)
- Reject symlinked primitive files in all discovery and resolution paths to prevent symlink-based traversal attacks (#596)
apm install -gnow deploys hooks to the scope-resolved target directory instead of hardcoding.github/hooks/(#565, #566)- Hook sync/cleanup derives prefixes dynamically from
KNOWN_TARGETSinstead of hardcoded paths (#565) auto_create=Falsetargets no longer get directories unconditionally created during install (#576)apm deps update -gnow correctly passes scope, preventing user-scope updates from silently using project-scope paths (#562)- Subprocess encoding failures on Windows non-UTF-8 consoles (CP950/CP936) -- all subprocess calls now use explicit UTF-8 encoding (#591)
- PowerShell 5.1 compatibility: replace multi-argument
Join-Pathcalls with nested two-argument calls (#593) apm marketplace addnow respectsGITHUB_HOSTenvironment variable for GitHub Enterprise users (#589)compilation.excludepatterns now filter primitive discovery, preventing excluded files from leaking into compiled output (#477)- Runtime detection in script runner now uses anchored patterns to prevent false positives when runtime keywords appear in flag values (#563)
apm compilenow warns when instructions are missingapplyToacross all compilation modes (#449)- Detect remote default branch instead of hardcoding
main(#574) - Warn when two packages deploy a native skill with the same name (#545)
- Hook integrator now processes the
windowsproperty in hook JSON files, copying referenced scripts and rewriting paths during install/compile (#311) - Standardized
--targetchoices, replaced Unicode with ASCII for cp1252 compatibility, and documented missing CLI flags (#519) apm install -gnow correctly deploys to user-scope directories, skips unsupported primitives, and cleans up on uninstall -- including multi-level paths like~/.config/opencode/(#542)apm deps updatenow correctly re-resolves transitive dependencies instead of reusing stale locked SHAs (#548)
apm installnow deploys.instructions.mdfiles to.claude/rules/*.mdfor Claude Code, convertingapplyTo:frontmatter to Claude'spaths:format (#516)
- Artifactory virtual file downloads now use the Archive Entry Download API to fetch individual files without downloading the full archive; falls back to full-archive extraction when the entry API is unavailable (#525)
apm install NAME@MARKETPLACEnow respectsmetadata.pluginRootfrom marketplace manifests, fixing resolution of bare-name plugins in marketplaces likeawesome-copilot(#512)- Windows unit test assertion tolerates Rich console line-wrapping on long temp paths (#510)
- Release validation scripts match updated
apm deps listscope output (#510)
apm install -g/--globalfor user-scope package installation with per-target support matrix andapm uninstall -glifecycle (#452)- Marketplace integration:
apm install NAME@MARKETPLACEsyntax,apm marketplace add/list/browse/update/remove,apm searchacross registered marketplaces (#503) - Codex as integration target: skills to
.agents/skills/, agents to.codex/agents/*.toml, hooks to.codex/hooks.json,--target codexon install/compile/pack (#504) - Lockfile-driven reproducible installs for registry proxies with
content_hashverification andRegistryConfig-- by @chkp-roniz (#401)
apm deps updateskips download when resolved SHA matches lockfile SHA, making the common "nothing changed" case near-instant (#500)
apm install -g ./local-pkgrejects local path dependencies at user scope with a clear error (#452)- Orphan documentation pages (
ci-policy-setup,policy-reference) added to sidebar navigation; stale GitHub Rulesets content updated (#505, #507)
--target opencodeno longer writes prompts/agents to.github/; dispatch loop now only fires primitives declared by the selected target (#488, #494)--target cursornow correctly deploys skills to.cursor/skills/instead of.github/skills/--SkillIntegratorrespects the explicit target list end-to-end (#482, #494)- Misleading "transitive dep" error message for direct dependency download failures (#478)
- Sparse checkout using global token instead of per-org token from
GITHUB_APM_PAT_<ORG>(#478) - Duplicate error count when a dependency fails during both resolution and install phases (#478)
- Windows Defender false-positive (
Trojan:Win32/Bearfoos.B!ml) mitigation: embed PE version info in Windows binary and disable UPX compression on Windows builds -- by @sergio-sisternes-epam (#490) apm deps updatewas a no-op -- rewrote to delegate to the install engine so lockfile, deployed files, and integration state are all refreshed correctly -- by @webmaxru (#493)
- Integration dispatch is now data-driven:
KNOWN_TARGETSdefines each target's primitives and directory layout; adding a target requires zero code changes (#494) partition_managed_files()uses O(1) component-based path routing instead of linear prefix scan (#494)- Uninstall sync uses pre-partitioned buckets via
partition_bucket_key()instead of re-scanning the full managed-files set (#494)
- Bump
pygmentsfrom 2.19.2 to 2.20.0 (#495)
apm install --targetflag to force deployment to a specific target (copilot, claude, cursor, opencode, all) (#456)- Global
apm install --global/-gandapm uninstall --globalflags for user-scope package installation, backed byInstallScope-based scope resolution incore/scope.py; deploys primitives to~/.copilot/,~/.claude/,~/.cursor/,~/.config/opencode/and tracks metadata under~/.apm/(#452)
- Windows antivirus file-lock errors (
WinError 32) duringapm installwithfile_opsretry utility (#440) - Installer fallback to pip in devcontainers, target registry, and lockfile idempotency fixes (#456)
- Reject path traversal sequences in SSH-style Git URLs — by @thakoreh (#458)
- Exclude bundled OpenSSL libs from Linux binary to prevent ABI conflicts (#466)
- Allow spaces in ADO repository names when parsing URLs (#437)
- Gate
.claude/commands/deployment behindintegrate_claudeflag (#443) - Sort instruction discovery order for deterministic Build IDs across platforms (#468)
- Share
AuthResolveracross install to prevent duplicate auth popups (#424)
- Consolidated path-segment traversal checks into
validate_path_segments()inpath_security.py(#458)
apm audit --ciorg-level policy engine -- experimental Phase 1 for enterprise governance over agents in the SDLC; GitHub / GitHub Enterprise only (#365)-vshorthand for--verbose,show_defaulton boolean options,deps clean --dry-run/--yesflags (#303)--verboseonapm installnow shows auth source diagnostics for virtual package validation failures (#414)- Nightly runtime inference tests decoupled from release pipeline via
ci-runtime.yml(#407)
- CI pipeline optimization: merged test+build jobs, macOS as root nodes, native
setup-uvcaching, removed unnecessarysetup-nodesteps (#407) - Encoding instructions enforce ASCII-only source and CLI output with bracket status symbols (#282)
- Windows path hardening:
portable_relpath()utility, ~23relative_to()call-site migrations, CI lint guard (#411, #422) - Centralized YAML I/O with UTF-8 encoding via
yaml_iohelpers, preventing Windows cp1252 mojibake, based on prior work by @alopezsanchez (#433, #388) - SSL certificate verification in PyInstaller binary via
certifiruntime hook (#429) apm pack --target claudecross-target path mapping for skills/agents installed under.github/(#426)ARTIFACTORY_ONLYenforcement for virtual package types (files, collections, subdirectories) (#418)- Local path install: descriptive failure messages and Windows drive-letter path recognition (#431, #435)
- Windows test fixes in config command and agents compiler (#410)
- Removed stale WIP folder from tracking, strengthened
.gitignore(#420)
- Centralized
AuthResolverwith per-(host, org) token resolution, cached and thread-safe — replaces 4 scattered auth implementations (#394) CommandLoggerandInstallLoggerbase classes for structured CLI output with validation, resolution, and download phases (#394)--verboseflag onuninstall,pack, andunpackcommands (#394)- Verbose output: dependency tree resolution, auth source/type per download, lockfile SHA, package type, inline per-package diagnostics (#394)
- Parent chain breadcrumb in transitive dependency error messages — "root-pkg > mid-pkg > failing-dep" (#394)
DiagnosticCollector.count_for_package()for inline per-package verbose hints (#394)- Auth flow diagram and package source behavior matrix in authentication docs (#394)
- Documented
${input:...}variable support inheadersandenvMCP server fields (#349)
- All CLI output now uses ASCII symbols (
[+],[x],[!]) instead of Unicode characters (#394) - Migrated
_rich_*calls toCommandLoggeracross install, compile, uninstall, audit, pack, and bundle modules (#394) - Verbose ref display uses clean
#tag @shaformat instead of nested parentheses (#394) - Integration tree lines (
└─) no longer have[i]prefix — clean visual hierarchy (#394) - Global env vars (
GITHUB_APM_PAT,GITHUB_TOKEN,GH_TOKEN) apply to all hosts — HTTPS is the security boundary, not host-gating (#394) - Credential-fill timeout increased from 5s to 60s (configurable via
APM_GIT_CREDENTIAL_TIMEOUT, max 180s) — fixes Windows credential picker timeouts (#394)
- Bundle lockfile includes non-target
deployed_filescausingapm unpackverification failure when packing with--target(#394) - Verbose lockfile iteration crashed with
'str' object has no attribute 'resolved_commit'(#394) - CodeQL incomplete URL substring sanitization in test assertions (#394)
- Bumped
h3from 1.15.6 to 1.15.9 in docs (#400)
- Unused image files:
copilot-banner.png,copilot-cli-screenshot.png(#391)
- Plugin authoring —
apm pack --format pluginexports APM packages as standalone plugin directories (plugin.json, agents, skills, commands) consumable by Copilot CLI, Claude Code, and Cursor without APM installed (#379) apm init --pluginscaffolds a hybrid project with bothapm.ymlandplugin.json, including adevDependenciessection (#379)devDependenciesinapm.yml— dev deps install normally but are excluded fromapm packoutput;apm install --devwrites to the dev section (#379)- VS Code runtime detection now falls back to
.vscode/directory presence when thecodebinary is not on PATH — by @sergio-sisternes-epam (#359)
- Content integrity hashing — SHA-256
content_hashper dependency inapm.lock.yaml, verified on subsequent installs to detect tampering or force-pushed commits (#315, #379) apm audit --stripnow preserves a leading BOM while stripping suspicious mid-file BOMs, preventing false negatives — by @dadavidtseng (#372)
- Install URLs now use short
aka.ms/apm-unixandaka.ms/apm-windowsredirects across README, docs, and CLI output (#384) - README highlights link to relevant docs pages; plugin authoring featured as a key value proposition (#385)
DependencyReferencepreserved through the download pipeline so lockfile records the original ref, not an empty object — by @sergio-sisternes-epam (#383)- Refactor command and model modules for readability and maintainability — by @sergio-sisternes-epam (#232)
- CLI docs align
compile --target opencode,audit --dry-run, and plannedaudit --driftwith current behavior (#373)
- JFrog Artifactory VCS repository support — explicit FQDN, transparent proxy via
ARTIFACTORY_BASE_URL, and air-gappedARTIFACTORY_ONLYmode (#354) - GH-AW compatibility gate in release pipeline —
gh-aw-compatjob tests tokenless install + pack before publishing (#356) - Release validation now includes
test_ghaw_compatscenario (#356)
- Credential fill returning garbage token in tokenless CI environments — broke
apm installfor public repos in GitHub Actions (#356)
- Harden dependency path validation — reject invalid path segments at parse time, enforce install-path containment, safe deletion wrappers across
uninstall,prune, andinstall(#364)
- Audit hardening —
apm unpackcontent scanning, SARIF/JSON/Markdown--format/--outputfor CI capture,SecurityGatepolicy engine, non-zero exits on critical findings (#330) - Install output now shows resolved git ref alongside package name (e.g.
✓ owner/repo#main (a1b2c3d4)) (#340) ${input:...}variable resolution for self-defined MCP server headers and env values — by @sergio-sisternes-epam (#344)
- Pinning hint moved from inline tip to
── Diagnostics ──section with aggregated count (#347) - Install ref display uses
#separator instead of@for consistency with dependency syntax (#340) - Shorthand
@aliassyntax removed from dependency strings — use the dict formatalias:field instead (#340)
- File-level downloads from private repos now use OS credential helpers (macOS Keychain,
gh auth login, Windows Credential Manager) (#332) - Lockfile now preserves the host for GitHub Enterprise custom domains so subsequent
apm installclones from the correct server (#338) - MCP registry validation no longer fails on transient network errors (#337)
- Native Cursor IDE integration —
apm installdeploys instructions→rules (.mdc), agents, skills, hooks (hooks.json), and MCP (mcp.json) to.cursor/(#301) - Native OpenCode integration —
apm installdeploys agents, commands, skills, and MCP (opencode.json) to.opencode/— inspired by @timvw (#306) - Content security scanning with
apm auditcommand —--file,--strip,--dry-run; install-time pre-deployment gate blocks critical hidden Unicode characters (#313) - Detect variation selectors (Glassworm attack vector), invisible math operators, bidi marks, annotation markers, and deprecated formatting in content scanning — by @raye-deng (#321, #320)
- Context-aware ZWJ detection — emoji joiners preserved by
--strip;--strip --dry-runpreview mode (#321) TargetProfiledata layer for scalable multi-target architecture (#301)CursorClientAdapterfor MCP server management in.cursor/mcp.json(#301)OpenCodeClientAdapterfor MCP server management inopencode.json(#306)- Private packages guide and enhanced authentication documentation (#314)
- Updated docs landing page to include Cursor and OpenCode (#310)
- Updated all doc pages to reflect full Cursor native support (#304)
- Added OpenCode to README headline and compile description (#308)
- GitHub API rate-limit 403 responses no longer misdiagnosed as authentication failures — unauthenticated users now see actionable "rate limit exceeded" guidance instead of misleading "private repository" errors
- Local filesystem path dependencies — install packages from relative/absolute paths with
apm install ./my-package(#270) - Windows native support (Phase 1 & 2) — cross-platform runtime management, PowerShell helpers, and CI parity — by @sergio-sisternes-epam (#227)
- CLI logging UX agent skill for consistent CLI output conventions (#289)
- Resolve
UnboundLocalErrorinapm prunecrashing all prune operations (#283) - Restore CWD before
TemporaryDirectorycleanup on Windows — by @sergio-sisternes-epam (#281) - Fix Codex runtime download 404 on Windows — asset naming uses
.exe.tar.gz— by @sergio-sisternes-epam (#287) - Fix
UnicodeEncodeErroron Windows cp1252 consoles via UTF-8 codepage configuration — by @sergio-sisternes-epam (#287) - Fix
WinError 2when resolving.cmd/.ps1shell wrappers viashutil.which()— by @sergio-sisternes-epam (#287) - Fix
GIT_CONFIG_GLOBAL=NULfailure on some Windows git versions — by @sergio-sisternes-epam (#287) - Improve sub-skill overwrite UX with content skip and collision protection (#289)
- Lockfile renamed from
apm.locktoapm.lock.yamlfor IDE syntax highlighting; existingapm.lockfiles are automatically migrated on the nextapm install(#280) - Add Windows as first-class install option across documentation site (#278)
- Clarify that
.github/deployed files should be committed (#290)
- Diff-aware
apm install— manifest as source of truth: removed packages, ref/version changes, and MCP config drift inapm.ymlall self-correct on the nextapm installwithout--updateor--force; introducesdrift.pywith pure helper functions (#260) DiagnosticCollectorfor structured install diagnostics (#267)- Detailed file-level logging to
apm unpackcommand (#252) - Astro Starlight documentation site with narrative redesign (#243)
- Resolve WinError 32 during sparse-checkout fallback on Windows — by @JanDeDobbeleer (#235)
- CLI consistency: docs alignment, emoji removal,
show_defaultflags (#266)
- Minimum Python version bumped to 3.10; Black upgraded to 26.3.1 (#269)
- Refactor
cli.pyandapm_package.pyinto focused modules — by @sergio-sisternes-epam (#224) - Revamp README as storefront for documentation site (#251, #256, #258)
- Remove duplicated content from CLI reference page (#261)
- Bump devalue 5.6.3 → 5.6.4 in docs (#263)
- Primitives models coverage 78% → 100%; add discovery and parser coverage tests (#240, #254)
copilotas the primary user-facing target name for GitHub Copilot / Cursor / Codex / Gemini output format;vscodeandagentsremain as aliases (#228)
- Consolidate pack/unpack documentation into cli-reference, rename Key Commands section
apm packandapm unpackcommands for portable bundle creation and extraction with target filtering, archive support, and verification (#218)- Plugin MCP Server installation — extract, convert, and deploy MCP servers defined in plugin packages (#217)
- Plugin agents not deployed due to directory nesting in custom agent paths (#214)
- Skip already-configured self-defined MCP servers on re-install (#191)
- CLI consistency: remove emojis from help strings, fix
apm configbare invocation, update descriptions (#212)
- Extract
MCPIntegratorfromcli.py— move MCP lifecycle orchestration (~760 lines) into standalone module with hardened error handling (#215)
- Plugin management system with CLI commands for installing and managing plugins from marketplaces (#83)
- Generic git URL support for GitLab, Bitbucket, and any self-hosted git provider (#150)
- InstructionIntegrator for
apm install— deploy.instructions.mdfiles alongside existing integrators (#162) - Transitive MCP dependency propagation (#123)
- MCP dependency config overlays, transitive trust flag, and related bug fixes (#166)
- Display build commit SHA in CLI version output (#176)
- Documentation: apm.yml manifest schema reference for integrators (#186)
- Handle multiple brace groups in
applyToglob patterns (#155) - Replace substring matching with path-component matching in directory exclusions (#159)
- Handle commit SHA refs in subdirectory package clones (#178)
- Infer
registry_namewhen MCP registry API returns empty values (#181) - Resolve
set()shadowing and sparse checkout ref issues (#184) - CLI consistency — align help text with docs (#188)
--updateflag now bypasses lockfile SHA to fetch latest content (#192)- Clean stale MCP servers on install/update/uninstall and prevent
.claudefolder creation (#201) - Harden plugin security, validation, tests, and docs (#208)
- Use
CREATE_PR_PATfor agentic workflows in Microsoft org (#144)
- Unified
deployed_filesmanifest for safe integration lifecycle (#163) - Exclude
apm_modulesfrom compilation scanning and cacheSet[Path]for performance (#157) - Performance optimization for deep dependency trees (#173)
- Upgrade GitHub Agentic Workflows to v0.52.1 (#141)
- Fix CLI reference drift from consistency reports (#160, #161)
- Replace CHANGELOG link with roadmap discussion in docs index (#196)
- Update documentation for features from 2026-03-07 (#195)
- Support hooks as an agent primitive with install-time integration and dependency display (hooks execute at agent runtime, not during
apm install) (#97) - Deploy agents to
.claude/agents/duringapm install(#95) - Promote sub-skills inside packages to top-level
.github/skills/entries (#102)
- Fix skill integration bugs, transitive dep cleanup, and simplification (#107)
- Fix transitive dependency handling in compile and orphan detection (#111)
- Fix virtual subdirectory deps marked as orphaned, skipping instruction processing (#100)
- Improve multi-host error guidance when
GITHUB_HOSTis set (#113, #130) - Support spaces in Azure DevOps project names (#92)
- Fix GitHub Actions workflow permissions, integration test skip-propagation, and test corrections (#87, #106, #109)
- Migrated to Microsoft OSS organization (#85, #105)
- Added CODEOWNERS, simplified PR/issue templates, triage labels, and updated CONTRIBUTING.md (#115, #118)
- Added missing
versionfield in the apm.yml README example (#108) - Slim PR pipelines to Linux-only, auto-approve integration tests, added agentic workflows for maintenance (#98, #103, #104, #119)
- SUPPORT.md: Added Microsoft repo-template support file directing users to GitHub Issues and Discussions for community support
- README Rewording: Clarified APM as "an open-source, community-driven dependency manager" to set correct expectations under Microsoft GitHub org
- Microsoft Open Source Compliance: Updated LICENSE, SECURITY.md, CODE_OF_CONDUCT.md, CONTRIBUTING.md, and added Trademark Notice to README
- Source Integrity: Fixed source integrity for all integrators and restructured README
- Install Script: Use
grep -ofor single-line JSON extraction in install.sh - CI: Fixed integration test script to handle existing venv from CI workflow
- Bumped
azure-core1.35.1 → 1.38.0,aiohttp3.12.15 → 3.13.3,pip25.2 → 26.0,urllib32.5.0 → 2.6.3
- Transitive Dependencies: Full dependency resolution with
apm.locklockfile generation
- Install Script and
apm update: Repaired corrupted header in install.sh. Use awk instead of sed for shell subprocess compatibility. Directed shell output to terminal for password input during update process.
- Collection Extension Handling: Prevent double
.collection.ymlextension when user specifies full path - SKILL.md Parsing: Parse SKILL.md directly without requiring apm.yml generation
- Git Host Errors: Actionable error messages for unsupported Git hosts
- Native Skills Support: Skills now install to
.github/skills/as the primary target (per agentskills.io standard) - Skills ≠ Agents: Removed skill → agent transformation; skills and agents are now separate primitives
- Explicit Package Types: Added
typefield to apm.yml (instructions,skill,hybrid,prompts) for routing control - Skill Name Validation: Validates and normalizes skill names per agentskills.io spec (lowercase, hyphens, 1-64 chars)
- Claude Compatibility: Skills also copy to
.claude/skills/when.claude/folder exists
- Auto-creates
.github/directory on install if neither.github/nor.claude/exists
- Selective Package Install:
apm install <package>now only installs the specified package instead of all packages from apm.yml. Previously, installing a single package would also install unrelated packages.apm install(no args) continues to install all packages from the manifest.
- Claude Skills Integration: Virtual subdirectory packages (like
ComposioHQ/awesome-claude-skills/mcp-builder) now correctly trigger skill generation. Previously all virtual packages were skipped, but only virtual files and collections should be skipped—subdirectory packages are complete skill packages.
- SKILL.md as first-class primitive: meta-description of what an APM Package does for agents to read
- Claude Skills Installation: Install Claude Skills directly as APM Packages
- Bidirectional Format Support:
- APM packages → SKILL.md (for Claude target)
- Claude Skills → .agent.md (for VSCode target)
- Skills Documentation: New
docs/skills.mdguide
-
Claude Integration: First-class support for Claude Code and Claude Desktop
CLAUDE.mdgeneration alongsideAGENTS.md.claude/commands/auto-integration from installed packagesSKILL.mdgeneration for Claude Skills format- Commands get
-apmsuffix (same pattern as VSCode prompts)
-
Target Auto-Detection: Smart compilation based on project structure
.github/only → generatesAGENTS.md+ VSCode integration.claude/only → generatesCLAUDE.md+ Claude integration- Both folders → generates all formats
- Neither folder → generates
AGENTS.mdonly (universal format)
-
targetfield in apm.yml: Persistent target configurationtarget: vscode # or claude, or all
Applies to both
apm compileandapm install -
--targetflag: Override auto-detectionapm compile --target claude apm compile --target vscode apm compile --target all
- Virtual package uninstall sync:
apm uninstallnow correctly removes only the specific virtual package's integrated files (usesget_unique_key()for proper path matching)
apm compiledefault: Changed from--target allto auto-detect- README refactored with npm-style zero-friction onboarding
- Documentation reorganized with Claude integration guide
- ADO Package Commands:
compile,prune, anddeps listnow work correctly with Azure DevOps packages
- ADO Path Structure: Azure DevOps packages now use correct 3-level paths (
org/project/repo) throughout install, discovery, update, prune, and uninstall commands - Virtual Packages: ADO collections and individual files install to correct 3-level paths
- Prune Command: Fixed undefined variable bug in directory cleanup
- Azure DevOps Support: Install packages from Azure DevOps Services and Server
- New
ADO_APM_PATenvironment variable for ADO authentication (separate from GitHub tokens) - Supports
dev.azure.com/org/project/_git/repoURL format - Works alongside GitHub and GitHub Enterprise in mixed-source projects
- New
- Debug Mode: Set
APM_DEBUG=1to see detailed authentication and URL resolution output
- GitHub Enterprise Private Repos: Fixed authentication for
git ls-remotevalidation on non-github.com hosts - Token Selection: Correct token now used per-platform (GitHub vs ADO) in mixed-source installations
- Enterprise GitHub host support: fallback clone now respects
GITHUB_HOSTenv var instead of hardcoding github.com - Version validation crash when YAML parses version as numeric type (e.g.,
1.0vs"1.0")
- CI/CD: Updated runner from macos-13 and macos-14 to macos-15 for both x86_64 and ARM64 builds
- Context Link Resolution: Automatic markdown link resolution for
.context.mdfiles across installation and compilation- Links in prompts/agents automatically resolve to actual source locations (
apm_modules/or.apm/context/) - Works everywhere: IDE, GitHub, all coding agents supporting AGENTS.md
- No file copying needed—links point directly to source files
- Links in prompts/agents automatically resolve to actual source locations (
- Agent Integration: Automatic sync of
.agent.mdfiles to.github/agents/with-apmsuffix (same pattern as prompt integration)
sync_integrationURL normalization bug that caused ALL integrated files to be removed during uninstall instead of only the uninstalled package's files- Root cause: Metadata stored full URLs (
https://github.com/owner/repo) while dependency list used short form (owner/repo) - Impact: Uninstalling one package would incorrectly remove prompts/agents from ALL other packages
- Fix: Normalize both URL formats to
owner/repobefore comparison - Added comprehensive test coverage for multi-package scenarios
- Root cause: Metadata stored full URLs (
- Uninstall command now correctly removes only
apm_modules/owner/repo/directory (notapm_modules/owner/)
- Prompt Naming Pattern: Migrated from
@prefix to-apmsuffix for integrated prompts - GitIgnore Pattern: Updated from
.github/prompts/@*.prompt.mdto.github/prompts/*-apm.prompt.md
- Existing Users: Old
@-prefixed files will not be automatically removed - Action Required: Manually delete old
@*.prompt.mdfiles from.github/prompts/after upgrading
- Prompt Integration with GitHub - Automatically sync downloaded prompts to
.github/prompts/for GitHub Copilot
- Improved installer UX and console output
- Package FQDN support - install from any Git host using fully qualified domain names (thanks @richgo for PR #25)
- Security: CWE-20 URL validation vulnerability - proper hostname validation using
urllib.parseprevents malicious URL bypass attacks - Package validation HTTPS URL construction for git ls-remote checks
- Virtual package orphan detection in
apm deps listcommand
- GitHub Enterprise support via
GITHUB_HOSTenvironment variable (thanks @richgo for PR #25) - Build pipeline updates for macOS compatibility
- Virtual Package Support: Install individual files directly from any repository without requiring full APM package structure
- Individual file packages:
apm install owner/repo/path/to/file.prompt.md
- Individual file packages:
- Collection Support: Install curated collections of primitives from Awesome Copilot:
apm install github/awesome-copilot/collections/collection-name- Collection manifest parser for
.collection.ymlformat - Batch download of collection items into organized
.apm/structure - Integration with github/awesome-copilot collections
- Collection manifest parser for
- Auto-Discovery of Prompts: Run installed prompts without manual script configuration
apm run <prompt-name>automatically discovers and executes prompts without having to wire a script inapm.yml- Search priority: local root → .apm/prompts → .github/prompts → dependencies
- Qualified path support:
apm run owner/repo/prompt-namefor disambiguation - Collision detection with helpful error messages when multiple prompts found
- Explicit scripts in apm.yml always take precedence over auto-discovery
- Automatic Runtime Detection: Detects installed runtime (copilot > codex) and generates proper commands
- Zero-Configuration Execution: Install and run prompts immediately without apm.yml scripts section
- Enhanced dependency resolution to support virtual package unique keys
- Improved GitHub downloader with virtual file and collection package support
- Extended
DependencyReference.parse()to detect and validate virtual packages (3+ path segments) - Script runner now falls back to prompt discovery when script not found in apm.yml
- Streamlined workflow:
apm install <file>→apm run <name>works immediately - No manual script configuration needed for simple use cases
- Power users retain full control via explicit scripts in apm.yml
- Better error messages for ambiguous prompt names with disambiguation guidance
- Auto-bootstrap
apm.ymlwhen runningapm install <package>without existing config - GitHub Enterprise Server and Data Residency Cloud support via
GITHUB_HOSTenvironment variable - ARM64 Linux support
- Refactored
apm initto initialize projects minimally without templated prompts and instructions - Improved next steps formatting in project initialization output
- GitHub token fallback handling for Codex runtime setup
- Environment variable passing to subprocess in smoke tests and runtime setup
- Copilot CLI Support
- Fix prompt file resolution for dependencies in org/repo directory structure
- APM dependency prompt files now correctly resolve from
apm_modules/org/repo/paths apm runcommands can now find and execute prompt files from installed dependencies- Updated unit tests to match org/repo directory structure for dependency resolution
- Context Packaging
- Context Dependencies
- Context Compilation
- GitHub MCP Registry integration
- Codex CLI Support