# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.31.0] - 2026-09-15 ### Added - `apm init --discover` previews existing agent content; consented `--apply` declares supported local packages without changing source files, ready for a separate `apm install`. Builds on discovery work by @chkp-roniz. (#2937) - Windows installation guidance now includes `winget install --id Microsoft.APM --exact --source winget` and updates through `winget upgrade` instead of `apm self-update`. (by @Gijsreyn, #2520) ### Changed - **BREAKING:** Non-dry-run `apm install` now exits `1` when Agent Plugins v1 target exclusion leaves no package deployed; mixed installs that deploy another package still succeed. Install a direct skill subpath for the desired target or select `--target copilot` for native registration. (#2806) - **BREAKING:** Re-vendored shared gh-aw APM imports require a concrete `target`; set the engine's target and recompile, with optional read-only `token-source: github-token` for same-repository private packages (`cascade` and APM 0.28.0 remain defaults). Dependency-policy matching now follows canonical repository casing, closing mixed-case deny bypasses; keep lowercase workarounds until all runners use APM 0.31.0 or later. (#2706) ### Fixed - Git-subpath cache checkouts now preserve committed LF content regardless of host `core.autocrlf` settings; older unpinned cache shards rematerialize on the next install. (by @sergio-sisternes-epam, #2982) - `apm uninstall` now preserves unmanaged Claude and Kiro skills when removing an MCP-only package whose lockfile has no deployed files. (by @mfroembgen, #2947) - Private Git dependencies rewritten from HTTPS to SSH no longer fail the HTTP-header safety probe; that probe now runs only for HTTP(S) effective URLs. (by @arnaudoisel, #2906) - GitLab `path:` dependencies now preserve the selected SSH transport, username, and port instead of silently using HTTPS; REST fallback requires an executed same-origin HTTPS attempt admitted by the transport policy. (#2939) - Exact registry version selectors now prefer the matching published build, preventing selection of a different build with the same semantic version but different build metadata. (by @nadav-y, #2894) - `apm install` again accepts `skills:` subsets from Git collections with nested `skills//SKILL.md` files but no root manifest or skill, without a `path:` workaround. (#2891) - Registry `apm outdated` now separates installed `Current`, constraint-bound `Wanted`, and published `Latest`, so exact pins no longer hide newer releases. It leaves legacy lockfiles unchanged, while `apm update` continues respecting manifest constraints. (#2874) ### Security - File-lock retry diagnostics no longer include paths or exception text that may contain secrets, while retaining retry counts and delays. (#2742) ## [0.30.0] - 2026-09-07 ### Security - **BREAKING:** Unix binary installs now require matching original publisher SHA-256 sidecars before extraction or execution, with no pip fallback after integrity failures. For historical releases or mirrors, select a release with sidecars or update the mirrored installer and publish the original publisher sidecars alongside its archives. (#2842) ### Changed - **BREAKING:** Fresh Unix native installs default to `~/.local`, add `install.sh --prefix PATH`, and configure eligible bash/zsh/fish profiles without implicit `sudo`; set `APM_NO_MODIFY_PATH=1` to opt out of shell setup. Existing destinations are preserved, and root-owned or package-managed installs require their original administrator or package manager to update or uninstall before [migration](https://microsoft.github.io/apm/getting-started/installation/#unix-install-ownership-and-migration). (#2844) - macOS onboarding now recommends Homebrew core (`brew install apm`, no tap) for existing Homebrew users, with `brew upgrade apm` for updates and visible standalone alternatives. (#2846) ### Fixed - Public CLI release discovery can recover from a rejected environment token: one anonymous retry after a selected token's 401/non-rate-limit 403 only for canonical public APM metadata; metadata redirects require `APM_RELEASE_METADATA_URL` at the final JSON endpoint or a `VERSION` pin. (#2843) - `apm cache prune` now counts only successfully deleted SHA groups, continues after removal errors, and exits `1` with failed paths and causes when pruning is incomplete. Fix permissions or release file locks, then rerun the command. (#2865) - `apm prune` now exits `1` when orphan deletion fails, continues processing remaining packages, and retains failed packages' lockfile entries. Resolve the reported deletion errors and rerun `apm prune`. (#2863) - `apm cache prune --days` now rejects negative ages before touching the cache, preventing accidental eviction from invalid input. (#2862) - `apm cache prune` now retains recently reused Git checkouts by refreshing shared SHA-group recency when either a full or sparse variant is reused. (#2861) - `apm uninstall` now preserves declarations and deployed ownership after package deletion failures, keeping retry and reinstall recovery available after partial removal. (#2860) - Successful HTTP cache hits now refresh LRU recency without extending response freshness, retaining frequently used MCP registry responses. (#2859) - `apm cache clean` now continues removing other entries after deletion errors, reports affected paths, and exits non-zero instead of claiming complete cleanup. Resolve permissions or file locks and retry; `--force` only skips confirmation. (#2864) ### Performance - Dependency policy checks now reuse canonical dependency names across required-package and executable checks, avoiding repeated name computation without changing policy results. (by @aryansk, #2588) - `apm compile` now reuses the resolved project base path during instruction matching and placement, avoiding repeated filesystem path resolution. (by @aryansk, #2587) ## [0.29.1] - 2026-09-06 ### Security - `apm install` and registry access now bind credentials to user-configured HTTPS destinations and reject redirects, insecure credential transport, and lockfile-altered endpoints. Inherited policy restrictions are preserved, executable approvals bind to canonical dependency identities, symlinked project deployment roots are rejected, and `git`/`gh` resolve outside the project tree. (#2810) ### Changed - Hermes is now a stable explicit-only target, and state-mutating APM commands share one per-user cross-process lock to prevent concurrent updates from losing state. Global audit and cleanup now preserve same-named user configuration outside recorded runtime ownership. (by @lkshrk, #2655) - Plain `apm install` now uses the repository-pinned `copilot` target for deterministic contributor installs. (by @tillig, #2771) ### Fixed - `apm install` now keeps transitive plugin MCP launchers usable after publication and cached replay by resolving plugin-root placeholders from the published package directory. Lockfiles and MCP configurations reject remaining resolution-staging paths without echoing configuration values. (by @lkshrk, #2827) - Git dependency downloads retry one narrowly classified HTTPS connection failure without changing credentials or transport. (#2839) - `apm install` now preserves SSH transport for semver discovery, keeps inactive hooks when targets are not declared in the manifest, and honors explicitly configured HTTP registries during MCP integration. (#2814) - Abandoned install transactions now release their state-update lock without releasing locks still owned by other operations. (#2817) - `apm install` now fails before state writes when a host-qualified package path uses an unknown platform host, and routes all host/reference coordinate parsing through one canonical parser. (#2800) - Release-blocking regressions in global compile, root context protection, lockfile unions, hooks, and deployed-file manifests are fixed. (#2804) - `apm install` now performs a hash-verified cached APM 0.28 marketplace-plugin upgrade before stale cleanup, preserving prior Claude and Codex deployments instead of deleting them. (#2787) - `apm install` launched from Git hooks now isolates dependency Git operations from the invoking repository, preventing installs from detaching or mutating the caller's branch. Credential-bearing, insecure, and cross-host network rewrites now fail before network use. (#2759) - Install, lock, and update commands now report authoritative outcomes instead of returning success after skipped or failed deployment work. (#2799) - Primitive classification now consistently honors declaration-first package semantics across local bundles, plugins, and integrations. (#2797) - Inactive experimental targets no longer influence manifest reconciliation or lockfile target unions. (#2791) - `apm compile` now protects every target catalog's hand-authored root context file, including `GEMINI.md`, from replacement. (#2790) - Windows users no longer get repeated line-ending churn when APM rewrites `apm.yml`; rewrites now produce deterministic LF output. (by @McNultyyy, #2675) - `apm compile` now preserves hand-authored root context files, including `--root` destinations, instead of replacing them. (#2779) - `apm uninstall` now removes MCP servers only from recorded owning runtimes, accepts JetBrains Copilot JSONC, and reports target cleanup failures after attempting every owner. (by @aryansk, #2591) - `apm uninstall --global` now removes managed Copilot hook files from `~/.copilot/hooks/` while preserving user-authored hooks. (by @aryansk, #2559) - `apm install --dry-run -g` no longer creates `~/.apm` when the user manifest is absent; preview state now stays temporary. (by @aryansk, #2592) - Install dry runs now include LSP dependencies in their deployment previews. (by @aryansk, #2580) - Install dry runs now include positional packages in their deployment previews. (#2664) - `apm install` now preserves previously deployed skills when package integration is skipped instead of treating them as stale cleanup candidates. (#2758) - `apm compile -g` now honors `target:` and `targets:` in `~/.apm/apm.yml`, limiting output to declared harnesses and avoiding stray `$HOME` directories when targets are configured. (by @tillig, #2772) - Distributed `apm compile` now reconciles existing managed-section `AGENTS.md` files without overwriting hand-authored content, generates new placements safely, and never discovers, writes, or cleans content across nested Git repository or linked-worktree boundaries. (by @aryansk, #2578) - Claude project LSP servers now load from a discoverable APM-managed plugin manifest instead of a path Claude Code ignored. Upgrade users can rerun `apm install --target claude`. (#2733) - Repositories that publish plugin metadata alongside an eligible root `apm.yml` now install as APM packages; metadata-only manifests continue to select the plugin layout. (#2776) - Legacy lockfile synthesis now leaves shared `.agents/` deployment paths unattributed instead of assigning them to Copilot's `.github/` target. (#2774) - Packed Claude plugin commands now install as native Copilot `.github/prompts/*.prompt.md` files instead of `.github/commands/*.md`. (#2778) - `apm install` no longer silently drops instruction Markdown whose unfenced bodies contain `---` horizontal rules. It now stops the whole package before deploying any primitive when instruction frontmatter is invalid YAML or decodes critical hidden characters. (by @manideep-malyala, #2666) - OpenCode MCP generation now preserves safe passthrough fields while preventing custom fields from injecting the modeled `environment` alias. (by @aryansk, #2593) - Generic marketplace Git now prevents platform tokens from reaching native credential-helper subprocesses while preserving HTTPS helper access. HTTP and HTTPS-to-HTTP rewrites suppress credentials. (by @aryansk, #2594) - `apm install` now resolves `dependencies.mcp` entries against the registry selected by the shared registry precedence chain. (by @edenfunf, #2745) - `apm pack --check-clean` is now read-only and detects marketplace drift without overwriting artifacts. Release pipelines that produce artifacts must run `apm pack` separately. (#2730) - `apm update` now retains full-SHA pins without an eligible stable annotated semver tag while continuing unrelated updates. (#2667) - `apm install --frozen` no longer reports repo-root Claude skills as lockfile drift in projects that also carry MCP state. (by @cffnpwr, #2446) - `apm pack` now reports unavailable remote package metadata, exposes certifiability in JSON, prevents `--check-clean` from certifying degraded regeneration, and lets `--strict-metadata` fail before writes. (#2693) - `apm install -g --mcp NAME` now creates or updates the user manifest and deploys only to global-capable runtimes instead of rejecting `--global`. Registry identities are validated before user-state writes. (#2734) - Windows admin lifecycle policies now resolve from `%ProgramData%` instead of assuming `C:\ProgramData`, while retaining the historical fallback. (by @lukiod, #2686) - Marketplace installs now materialize catalog-only LSP and MCP metadata without requiring a package manifest in the downloaded source. (by @lkshrk, #2709) - Private `github.com` packages now populate the persistent Git cache through repository-scoped credential fallback without storing credentials in cache keys or remote URLs. (#2722) - Plugin refreshes now keep the existing package and its registered hooks live while replacement content downloads and validates. Failed refreshes retain the prior package instead of accepting stale content. (#2723) - Successful installs now safely clean up temporary backups left by interrupted lock-aware runs and inactive resolution staging directories. (#2720) - `apm doctor` now reports malformed project executable-trust configuration under either `executables` or the deprecated `allowExecutables` key as an actionable informational warning instead of omitting the check. (#2719) - Newly generated `apm.lock.yaml` files no longer include volatile `generated_at` metadata, preventing timestamp-only merge conflicts. (by @lachieh, #2616) - Fully qualified `ssh://` marketplace URLs now retain their SSH username, host, and custom port through registration and Git fetching. (#2760) - Explicit GitLab URLs now accept deep repository namespaces whose names match APM primitive directories, while an unambiguous `.git` repository boundary followed by a primitive path still fails before writes. (by @aryansk, #2581) - Frozen Artifactory installs now fall back to commit archives when the primary archive endpoint is unavailable. (by @aryansk, #2582) - Dot-prefixed marketplace paths are now classified as local sources instead of remote package coordinates. (by @mikemikimike, #2766) - Plugin `.lsp.json` intake now accepts Copilot-dialect `fileExtensions` and `warmupTimeoutMs` aliases, preserving C# LSP setup from dotnet/skills. (by @normandev92, #2513) - Git subdirectory dependencies with symlinks to files elsewhere in the same repository now install successfully where Git materializes symlinks; APM widens the checkout only when needed. (by @MohammedAlkindi, #2710) - Manifestless hook packages now participate in audit MCP configuration views. (#2732) - Generated managed-section footers now describe only content that APM actually owns. (#2731) - UTF-8 BOMs no longer hide Markdown frontmatter fences during package parsing. (by @lukiod, #2685) ## [0.29.0] - 2026-08-30 ### Added - `apm install --target copilot` now registers portable Agent Plugins 1.0 packages natively while keeping each plugin intact under `apm_modules/`. Copilot CLI `1.0.81` or newer can load the installed plugin without copies or `--plugin-dir`. (closes #2703, #2705) - `apm install` now accepts `--trust-bin` and `--no-trust-bin` for per-invocation consent over marketplace-plugin executables. Non-interactive installs default to no deployment unless consent or policy permits it. (closes #1620, #2508) - `apm pack --format agent-plugin` and `apm plugin init --format agent-plugin` now emit strict, portable Agent Plugins 1.0 bundles while preserving the existing Claude-compatible default. (closes #2522, #2654) - The lifecycle scripts guide now documents the Windows admin-tier policy path alongside the Linux and macOS path. (by @WilliamK112, closes #2621, #2640) ### Changed - **BREAKING:** A plugin `skills` declaration now exclusively controls which skills deploy. Declare every intended skill or remove the key to retain conventional `skills/` discovery; conventional containers deploy at the expected depth, while `"skills": []` deploys no skills. (by @edenfunf, closes #2530, #2537, #2540) ### Fixed - Agent Plugin inventory on Windows now compares physical file bytes without CRLF translation, preventing valid assets from being rejected as changed during inventory. (#2694) - GitLab organization-policy discovery now uses the valid `apm-policy` project convention and treats a missing policy project as no policy. (#2662) - `apm audit` now compares only APM-owned entries in shared native hook configs, preserving user-authored hooks while still detecting altered APM hooks. (closes #2641, #2682) - `apm install` and surviving-package reintegration now scan only deployable package content, preventing false-positive security blocks from source-only files. (by @aryansk, #2598) - Root-declared plugin components no longer copy a plugin into its own staging tree, preventing recursive writes during `apm install`. (by @YoraiLevi, closes #2556, #2557) - OpenCode global installs now deploy user-scope skills to its native config root, and `apm compile -g` retains scoped package instructions in the user `AGENTS.md`. (by @aryansk, #2596) - Marketplace `sourceBase` and full HTTPS repository paths now preserve safe percent-encoded segments, enabling Azure DevOps project names such as `My%20Projects`. (by @aryansk, fixes #2554, #2584) - `apm install --frozen` now hydrates git-sourced `apm_package` dependencies that declare MCP servers on a cold cache. (by @sergio-sisternes-epam, closes #2456, #2502) - `apm install` now resolves virtual-subdirectory git semver ranges before literal-ref preflight while preserving registry version validation. (by @aryansk, closes #2514, #2590) - `apm lock export --timestamp` now rejects malformed or timezone-naive values before they enter CycloneDX or SPDX metadata. (by @manideep-malyala, fixes #2659, #2660) - Generated bundle and plugin metadata now uses deterministic LF line endings, keeping generated metadata byte-stable across operating systems. (by @WilliamK112, #2638) - Lockfiles generated on Windows for marketplace-plugin / skill-subset git dependencies now pass `apm install --frozen` on Linux, and vice versa, by hashing synthetic manifests with deterministic LF line endings. (by @McNultyyy, closes #2619, #2620) - Codex MCP configuration now accepts plain HTTP for loopback endpoints while retaining HTTPS for every non-loopback host. (by @normandev92, #2468) - Azure DevOps organization-policy discovery now reads repository `_apm` from project `apm`, keeping direct and inherited policy coordinates consistent. (closes #2429, #2450) - Hook commands such as `"${CLAUDE_PLUGIN_ROOT}"/hooks/probe.py` now rewrite to `"${CLAUDE_PLUGIN_ROOT}/hooks/probe.py"` and warn when a supported plugin-root placeholder remains unresolved instead of silently deploying a dead hook. (by @MohammedAlkindi, closes #2639, #2645) - `apm audit --ci` now accepts valid local Claude-skill dependencies without an `apm.yml` while retaining strict package-shape validation. (by @lukiod, closes #2611, #2643) - Copilot CLI and VS Code MCP configurations now route through separate adapter paths, preventing one target's configuration from being written for the other. (#2669) - Private-repository installs no longer skip credential retry when Git emits localized diagnostics. (by @Naofel-eal, closes #2533, #2534) - `compilation.source_attribution: false` now suppresses cosmetic annotations on distributed `AGENTS.md` targets as it already did for `CLAUDE.md`. (by @MohammedAlkindi, closes #2634, #2646) - `apm uninstall --global` now cleans removed-only target files before deleting their ownership state while preserving files owned by surviving packages. (#2658) - `apm pack --dry-run` now honors the same existing `plugin.json` overwrite policy as a real non-force pack, avoiding misleading write previews. (by @aryansk, #2583) - `apm marketplace validate` now reports malformed plugin structure by JSON path and exits 1 instead of emitting misleading success output. (#2474) - CLI help for compile, dependency updates, and MCP install now follows the target catalog and exposes the forwarded target and trust options. (by @sergio-sisternes-epam, #2499) - `deployed-files-present` no longer false-positives on gitignored deploy paths (e.g. `.agents/`), enabling `apm audit --ci` to pass on a fresh checkout when deployed outputs are intentionally not committed. (by @sergio-sisternes-epam, closes #2452, #2496) - YAML expansion guard no longer rejects large anchor-free lockfiles (150K+ entries) with a false-positive "billion-laughs" error. (#2518) - SSH-based installs now fail promptly with a useful error when a key needs an unavailable passphrase instead of hanging until timeout. (by @sergio-sisternes-epam, fixes #1976, #2360) ### Performance - The contributor dashboard now refreshes GitHub every 15 minutes by default, backs off for at least one hour after rate limits, and caches unchanged PR enrichment, reducing scheduled GraphQL list traffic from 240 to 8 queries per hour. (by @sergio-sisternes-epam, #2679) - `apm compile` now scopes literal `applyTo` walks to their roots, reducing matching work in large repositories without changing placement. (by @aryansk, #2595) - Multi-target `apm compile` now reuses project placement analysis across targets, scaling like a single-target run without changing generated output. (closes #2482, #2486) ### Security - Windows release binaries are now Authenticode-signed, preventing the Windows Defender false positive caused by unsigned PyInstaller bundles. (by @sergio-sisternes-epam, closes #2435, #2497) ### Removed - Retired the credential-dependent roadmap project sync. Release commitments now live solely in the active milestone. (#2672) ## [0.28.0] - 2026-08-04 ### Added - New xAI Grok targets: `grok-build` deploys native `.grok/` rules, agents, commands, and skills alongside compiled `AGENTS.md` context, and the explicit-only experimental `grok-cloud` target deploys skills to project or user `.grok/skills/`. (closes #2419, #2420) - Kiro IDE/CLI v3 now receives agents from `.apm/agents/` as Markdown files under `.kiro/agents/.md`, forwarding only `description`, `model`, and `tools` frontmatter. Tools are permission-bearing, so APM fails closed with no partial write when a tool value falls outside Kiro's approved capability set. (closes #2089, #2440) - Registry object-form dependencies (`- id: owner/repo`) now support `skills:` and `targets:` subset installs, matching git-longhand parity -- no need to switch to verbose git-longhand form just to narrow what gets deployed. Registry deps also serialize back to `apm.yml` as object-form entries instead of collapsing to a plain git string. (by @nadav-y, #2166) - `apm pack --check-versions` now reads `plugin.json` for local Plugin collections without `apm.yml`; when present, `apm.yml` remains authoritative. (#2454) ### Fixed - `apm install` now re-downloads an aliased dependency after its `ref:` changes in `apm.yml`. Previously the pinned-ref and already-resolved cache-reuse shortcuts skipped the fetch, so `apm_modules//` and every primitive deployed from it stayed on the old revision. (#2484) - `apm install --target all` no longer aborts on targets that have no MCP client, such as `grok-build`. Non-MCP targets are skipped with a note instead of raising `Unsupported client type`. (#2484) - `apm outdated` no longer exits 1 when the Rich progress renderer fails. The command now owns its own `Console` instead of borrowing Rich's process-global singleton, and falls back to plain-text progress if rendering still raises. (#2507) - `apm init` and install-time auto-bootstrap now reject empty or whitespace-only project names, falling back to `my-project` at a filesystem root. APM no longer writes an `apm.yml` that every later install, lock, or compile command rejects. (by @nadav-y, #2200) - `apm pack` now treats `dependencies: {}` as a declared mapping and emits the local bundle; omitted or null `dependencies:` still produce no bundle. (closes #2431, #2458) - `apm compile --clean` preserves APM-generated `AGENTS.md` files tracked by nested Git worktrees. (#2473) - Required MCP runtime defaults are now overrideable prompts, while secret defaults remain hidden and VS Code OCI launchers resolve every runtime placeholder without writing secret values to `mcp.json`. (#2455) - `apm marketplace audit --strict` now fails when a local marketplace source is skipped, so CI cannot report success after an incomplete local audit. (#2460) - Claude project hooks now run reliably when Claude launches them outside the repository while keeping generated settings portable across clones. (closes #2408, #2442) - Marketplace package sources now accept full HTTPS repository URLs with nested paths while retaining strict shorthand validation. (#2439) - YAML-list `applyTo` entries now preserve every pattern during compilation and target-native instruction conversion, including explicitly targeted supported hidden tool roots. (#2441) - `apm pack --check-clean` now honors `--marketplace-path` overrides. (closes #2427, #2461) - `apm marketplace validate` now reports malformed plugin structures without rewriting the registered marketplace or its source manifest. (#2445) - Azure DevOps policy discovery now uses the valid `apm` project and `apm-policy` repository for organization policy files, with a 404-only compatibility fallback for legacy `_apm/_apm` locations. (#2450) - Release publication now excludes opt-in live ADO PAT tests and credentials; those tests fail closed in the Auth Acceptance workflow instead. (#2426) - Release promotions now run marker-bounded lifecycle integration on macOS Intel while retaining the full corpus on macOS ARM and Linux, preventing Intel runner capacity timeouts. (#2423) - Public `github.com` dependency installs now preserve caller-owned Git URL rewrites and transport policy across anonymous and authenticated retries; policy cache metadata and diagnostics also omit credentials embedded in direct policy URLs. (#2422) ### Performance - Policy discovery now performs one remote lookup per discovery, compilation uses one project traversal plus in-memory directory indexes, and uninstall pre-indexes lockfile entries for marketplace lookup. (#2472) ## [0.27.0] - 2026-07-31 ### Added - `apm.lock.yaml` can now record `materialization_repo_url` separately from canonical dependency identity, preserving source casing in `apm_modules/` and generated links while safely migrating stale case-only paths. Reported by @rcollette. (#2409) ### Fixed - `apm self-update` now downloads GitHub and GHES installers from the selected release tag and passes that same normalized version to the installer. Configured installer mirrors remain authoritative. (by @fallintoplace, #2026) - `apm install --dry-run` no longer lists self-managed `includes: auto` files as removals, matching the real install behavior. (by @mia106dev, #2069) - Repeated `apm install` runs now preserve unchanged MCP target mappings, deployment ownership, and lockfile timestamps instead of rewriting `apm.lock.yaml`. (#2306) - Declared `apm.yml` targets now determine MCP lockfile ownership before local harness detection, so teammates no longer rewrite each other's target state. Reported by @rrazvd. (#2307) - `apm lock` now defers disk deletion for dropped dependencies, preserving deployed files until normal install reconciliation can remove them safely. (by @atulya-singh, #2312) - `apm audit --ci` can now hydrate a cold cache from trusted lockfile pins without mutating project state, closing false failures and false-green audit results. (by @hugoguitton-lucca, #2329) - Consuming projects no longer inherit a dependency author's `devDependencies.mcp`; direct and transitive runtime MCP dependencies still propagate normally. (by @sergio-sisternes-epam, #2361) - Package-declared targets now restrict primitive deployment without expanding project authorization, preventing target-specific hooks from leaking into sibling harnesses and cleaning stale owned entries on update. (by @sergio-sisternes-epam, #2362) - Copilot and VS Code hook deployment now excludes generated `package.json` and nested JSON sidecars that recursive hook loaders could mistake for descriptors. (by @sergio-sisternes-epam, #2363) - `apm update` and `apm update --force` now resolve mutable Git refs from the authenticated remote even when the local bare-repository cache is stale; normal installs retain cache reuse. (by @sergio-sisternes-epam, #2364) - Marketplace semver resolution now honors the producer's `tagPattern` instead of assuming `{name}--v{version}`, while manifests without a pattern retain the legacy convention. (by @sergio-sisternes-epam, #2366) - `apm audit` now reports deployed files that no lockfile entry claims as `unrecorded` drift; shared hook merge targets remain exempt. (by @salpers, #2380) - MCP Registry v0.1 `oci` packages now render Docker launchers and follow the documented adapter package-selection order instead of falling through to npm or PyPI launchers. (by @edenfunf, #2385) - VS Code container launchers now preserve MCP Registry v0.1 runtime arguments, including collected bind mounts, instead of falling back to a bare Docker command. (by @edenfunf, #2387) - MCP-only projects now create `apm.lock.yaml` during normal install and audit cleanly on the first run; frozen install still fails without writing when state is missing or stale. (by @edenfunf, #2390) - Copilot hooks now normalize lifecycle aliases to the documented `sessionStart` and `agentStop` keys while preserving Claude's native event names. Reported by @SaulMoro. (#2405) - Public `github.com` dependencies now try anonymous HTTPS before credential resolution, avoiding repeated credential prompts while retaining private repository fallback. Reported by @RuiRomano. (#2406) - Non-container npm, PyPI, and generic MCP launchers now preserve typed Registry v0.1 arguments while retaining legacy `value_hint` compatibility. (#2407) - `apm install --target intellij` now writes MCP servers to the JetBrains Copilot plugin-read path, migrating only APM-owned entries and preserving user configuration. Reported by @xalvarez. (#2410) - `apm uninstall` now accepts the portable `_local/` key printed by `apm deps list` and rejects missing or ambiguous batches before writing. Reported by @sproott. (#2412) - Saved targets from `apm config set target` now drive package, MCP, and LSP phases in `apm install` and `apm update`; failed required service writes exit nonzero with a next step instead of silently succeeding. Reported by @ryodocx. (#2414) ### Security - On-prem Azure DevOps Server hosts are no longer misclassified as GitHub Enterprise Server when host settings overlap, keeping ADO credentials isolated end to end. (by @sergio-sisternes-epam, #2365) - `apm audit` now scans every governed deploy-tree file for hidden Unicode, including files omitted from `apm.lock.yaml`; `--package` remains lockfile-scoped. (by @salpers, #2381) - Corporate git security settings -- SSL CA pins (`http.sslCAInfo`), bare-repo protection, and inherited `GIT_CONFIG_*` hardening -- are now preserved when APM injects authorization headers for Git operations. (by @edenfunf, #2382) ## [0.26.0] - 2026-07-18 ### Added - APM now verifies Python HTTPS traffic against the operating-system trust store by default, with `APM_DISABLE_TRUSTSTORE=1` available for certifi-only behavior. Explicit `REQUESTS_CA_BUNDLE` and `CURL_CA_BUNDLE` settings still take precedence. (by @fangkangmi, closes #2004, #2005) ### Changed - **BREAKING:** Object-form Git dependencies now reject unsupported keys instead of silently ignoring them. Migration: rename `version` to `ref` and remove inert `name` fields under `git:`; `apm audit --ci` also rejects altered full-SHA `resolved_commit` values. (#2209) ### Fixed - Transient GitHub preflight failures no longer reject packages that the authoritative download can still retrieve; authentication, permission, TLS, and not-found failures remain closed. (#2313) - `apm install` target contraction no longer reintroduces an inactive target's removed deployment path, so a fresh checkout converges to an audit-clean lockfile in one run. (#2310) - Selective `apm update ` plans no longer report unselected direct or transitive dependencies as removed; true removals from the complete post-update graph remain visible. Reported by @IldarMinaev. (closes #2291, #2305) - `apm audit --ci` now reports trusted manifest-driven `ref-consistency` remediation before deployment-ledger repair when source identity is tampered, avoiding guidance that could entrench the altered lockfile. (#2300) - Project-scope Gemini, Codex, OpenCode, and experimental Hermes installs now prompt for `apm compile` when dependency instructions require root-context compilation. Contributed by @sergio-sisternes-epam. (closes #2057, #2293) - Narrowing project targets now removes unchanged, APM-owned instruction files for dropped targets while preserving active-target and user-edited files. (#2295) - `apm prune` now removes departed deployment ownership while preserving shared deployments, surviving owners, user-edited files, and failed-cleanup state; `apm audit` flags owners absent from the lockfile. (#2292) - Bare `apm install` now reports a stale persisted `skills:` subset that matches no available skill, naming the package plus requested and available names while retaining successful install status. Contributed by @sergio-sisternes-epam. (#2294) - Narrowing active targets now removes shared-root skill copies owned only by a dropped target while preserving user edits and surviving ownership. (#2299) - `apm install ` now works at a filesystem root (e.g. Docker containers with `WORKDIR /`) by falling back to `my-project` as the manifest name; explicit empty or whitespace-only names are rejected early with a clear error -- by @nadav-y (#2200). - Installing packages that share `.agents/skills` no longer leaves duplicate lockfile state or drops prior integrity information when APM must keep a file for a later retry. (#2283) - Virtual-file installs now recover from confirmed GitHub throttling with one credential-safe sparse Git attempt while keeping authentication, permission, and missing-content failures closed. (#2284) - Copilot hooks installed with `apm install -g` now resolve from any working directory by writing absolute user-scope script commands, while project-scope hooks remain repo-relative for portability. Reported by @sproott. (closes #2232, #2236) - `apm uninstall` no longer deletes a shared transitive dependency that a surviving direct dependency still needs; uncertain reachability now preserves the package until its true last parent is removed. (#2269) - Release binaries no longer crash with missing Rich Unicode modules when `apm deps list` renders non-ASCII package names, and repeated `apm runtime setup llm` no longer recurses through TLS setup. (#2264) - SSH clone failures caused by passphrase prompts or public-key denial now include key, deploy-key, and token-backed HTTPS guidance without echoing captured SSH output. (#2244) - Legacy manifests that declared `targets: [all]` are no longer hard-rejected; APM treats the field as omitted with a deprecation warning, restoring installability for older packages. (by @kotalab, closes #2271, #2272) - `apm uninstall` and `apm prune` no longer wipe still-installed dependencies' merged hooks from harnesses dropped from the project's target list. The wipe now matches the target set rebuilt afterward. (closes #2250, #2252) - `apm prune` and `apm uninstall` now rebuild merged hooks from every surviving lockfile package, including transitive dependencies. (by @Shaurya2k06, closes #2254, #2256) - Packages with per-target hook files (for example separate Claude and Codex hooks) no longer cross-contaminate sibling tool configs when a dependency `targets:` list is set. (by @srobroek, closes #2258, #2259) - `apm prune` no longer leaves stale, executable hook entries behind for a removed package; sibling and manually authored entries remain intact. (closes #2245, #2249) - Narrowing project `targets:` now removes the dropped target's merged hooks and ownership sidecar during `apm install`, `apm compile`, or `apm update` while preserving hand-authored and still-declared entries. (closes #2253, #2275) - Windows JSON reports, path diagnostics, Git subprocess resolution, and WebSocket shutdown no longer fail on platform-specific path, newline, or thread behavior. (closes #2233, #2237) - `apm update` now automatically repairs a locked dependency whose materialized `apm_modules` cache is wholly absent -- including local filesystem dependencies -- without prompting for ref-change consent or changing any resolved refs. (#2240) - Azure DevOps dependencies now report real latest versions in `apm outdated` and resolve correctly during bounded `apm update`. (closes #2197, #2226) - Govern policy cache freshness now honors the effective policy's `cache.ttl`; malformed refreshes retain the last good policy bytes. (#2235) - Git-source semver ranges now honor explicit SSH and `prefer-ssh` during tag enumeration instead of invoking HTTPS. (closes #2184, #2229) - HTTPS Git dependency shorthand with custom ports now reparses after APM writes it to `apm.yml`. (by @atulya-singh, closes #2203, #2211) - Codex agent generation now warns when `.agent.md` `tools` restrictions cannot be preserved instead of silently widening effective MCP access. (by @jstar0, #2186) - `apm audit --ci` now accepts valid manifestless virtual Claude skills while continuing to reject malformed package shapes and real MCP drift. (by @hugoguitton-lucca, closes #2207, #2213, #2214) - Marketplace packages emitted as remote URL or subdirectory sources now preserve the package host, path, and ref through `apm install`, fixing cross-host enterprise validation and self-hosted GitLab monorepo installs. (closes #2190, #2216, #2228) - HTTP git dependency URLs now preserve custom ports when persisted to `apm.yml`, so later commands reconnect to the exact endpoint the user specified. (by @atulya-singh, closes #2202, #2210) - Virtual Claude Skill subpath dependencies now keep `SKILL.md`-derived names and unversioned metadata stable across install, frozen cache replay, and update, avoiding spurious lockfile rewrites. (#2217) - Synthetic virtual-package manifests now use canonical LF bytes before hashing, so equivalent Windows and Unix installs converge on one lock hash. (#2223) - Changing a literal Git ref in `apm.yml` no longer silently keeps old bytes; `apm install` re-resolves the new ref and preserves the last good deployment when the new ref is invalid. (#2219) - `apm pack` and local-bundle install now have a real binary parity contract, and `apm audit --ci` no longer reports clean bundle deployments as orphaned. (#2215) - Warm policy-cache reads now preserve every enforceable field and strict denial; inherited stale policies no longer appear fresh or bypass status and executable-approval checks. (#2193) - `apm install` now keeps complete nested GitLab project paths in its shared and persistent clone-cache identities, preventing sibling projects under a common group prefix from reusing the wrong repository. (by @lidorcg, closes #2191, #2192) - `apm pack` now emits the `category` field in the Claude marketplace output when a package sets it, matching the existing Codex output. (by @mbeacom, closes #2188, #2189) - `apm pack` now matches source-relative skill selectors such as `productivity/grill-me` against flattened deployed skill names. (closes #2171, #2176) - `apm update` no longer reports or reinstalls semver dependencies already at their locked tag. (by @srobroek, #2165) - `apm update` no longer produces a plan for branch dependencies already at the locked tip, while real tip advances remain visible. (#2212) - `apm audit` no longer reports drift for skills intentionally excluded by a dependency's `skills:` subset filter. (#2177) - `apm audit --ci` no longer reports false drift for package-relative links in nested local dependency skills. (closes #2154, #2179) - The Windows installer now exposes a version-stable `apm.exe` path for Git Bash and direct process launch while preserving the `apm.cmd` shell launcher. (closes #2076, #2094) - `apm update` now re-checks transitive dependencies' own semver ranges at any depth, so newly published matching versions are no longer ignored. (by @nadav-y, #2053) ### Performance - Best-effort commits API lookups now fall through promptly to Git when rate-limited, avoiding multi-minute dependency-resolution stalls. (#2238) ## [0.25.0] - 2026-07-12 ### Added - The Contributor Dashboard now includes triaged-issue views, inline comments, bulk pull-request actions, and direct navigation to active Copilot sessions. (by @sergio-sisternes-epam, #2043) - GitHub policy discovery now checks `.github-private` before `.github`, so organizations can keep `apm-policy.yml` private without changing existing fallbacks. (by @sergio-sisternes-epam, #2058) ### Changed - `apm compile --target`, compile help and errors, and `apm init --target` now use one canonical target catalog, so every advertised target is accepted consistently. (closes #2138, #2147; #2155) - Generated hooks now use canonical upstream contracts: Claude matcher/hooks nesting, Kiro v1 schema, Copilot's required top-level version, and provenance outside vendor payloads. (closes #2062, #2071, #2128, #2157; #2155) - Homebrew formula updates now use the tap's daily poller instead of an obsolete PAT-backed dispatch, restoring release propagation without cross-repository credentials. (#2088) ### Fixed - `apm install` now fails before commit when declared plugin components or a requested `--skill` are missing, and total positional-URL failure exits `1`. (closes #2103, #2116, #2126; #2155) - Failed global Claude installs now clean up bootstrap state, corrected cyclic dependency graphs resume without deleting `apm_modules`, and exception output routes through the command logger. (closes #2129, #2140, #2161; #2155) - `apm audit --ci` now detects both changed and removed MCP declarations from local-path sub-packages. (closes #2127, #2136; #2155) - Contracting the target set now reconciles `deployed_files`, removes APM-managed MCP servers from dropped targets, and safely adopts exact matches from legacy lockfiles. (closes #2139, #2149, #2158; #2155) - Manifest and policy parsers now reject invalid identity values and unknown policy keys. Migration: quote numeric manifest versions and use the declared mapping/list types for policy blocks. (closes #2137; #2155) - `apm compile --clean` now removes the stale context artifact when the final primitive is removed. (closes #2130; #2155) - `apm uninstall` now transfers shared deployed-file ownership to a surviving package and persists deployment state atomically. (closes #2148, #2160; #2155) - Semver install and update now preserve Azure DevOps bearer authentication and retry a stale PAT `401` with the Azure CLI bearer. (closes #2150, #2156; #2155) - `apm prune` and `apm deps list` now treat nested `apm.yml` files as part of their installed parent package instead of exposing or deleting them as top-level orphans. (#2092) - `apm pack` now selects `.apm/` as the authoritative source only when it exists, preserves root plugin directories after `apm init`, and fails closed on invalid explicit `includes:` paths. (#2122) - Azure DevOps marketplace checks now preserve suffix-free `/_git/` URLs and pass Azure CLI bearer authentication through to `git ls-remote`. (closes #2119, #2121) - `apm install` now removes stale deployment records for inactive targets, so fresh checkouts can return `apm audit --ci` to green. (by @edenfunf, closes #2059, #2114) - `apm install --target intellij` now configures JetBrains Copilot MCP support while routing package file primitives through the Copilot profile. (by @sergio-sisternes-epam; closes #1957) (#2041) - The Windows installer now exposes a version-stable `current\apm.exe` on `PATH` (via a junction to the active release bundle) alongside the existing `bin\apm.cmd` shim, so Git Bash and Python `subprocess.run(["apm", ...])` resolve `apm` without `cmd.exe` PATHEXT expansion. (closes #2076) (#2094) ### Performance - Deployment-ledger reconciliation now uses indexed mutation paths, avoiding quadratic scans as deployment history grows. (closes #2159; #2155) - Dependency lookup, HTTP cache enforcement, marketplace ref selection, and host classification now use indexed or cached paths, avoiding repeated linear scans at scale. (by @sergio-sisternes-epam, #2124) ## [0.24.1] - 2026-07-10 ### Fixed - Skill ownership tracking now keys on the full `owner/repo` identity, so packages with the same leaf name no longer suppress collision warnings or claim the same deployed files. (by @nadav-y, #2052) - Repeated `apm install` runs now preserve existing LSP server and config state before lockfile comparison, avoiding no-op rewrites caused only by `generated_at`. (by @paul-ww, closes #2078, #2079) - OpenAPM v0.1 now defines deterministic Antigravity glob frontmatter and limits `AGENTS.md` deduplication to resolved instruction files, preventing unrelated rule files from suppressing instructions. (#2087) - Codex MCP installs and stale-server cleanup now preserve literal Windows path keys in `config.toml` instead of rejecting or corrupting per-project preferences. (closes #2075, #2100) - `apm audit --ci` no longer reports transitive MCP servers from local-path sub-packages as orphaned configs. (by @edenfunf, closes #2081, #2084) - In-repository plugins from SSH-registered GitLab and generic git marketplaces now preserve SSH transport in generated `git:` and `path:` dependencies. (#2091) - GitHub and package-registry dependency identities are now case-insensitive, preventing duplicate lock, cache, and install paths while preserving case-sensitive paths for unknown git hosts. (closes #2073, #2098) - `apm deps tree` no longer repeats same-repository virtual packages, keeping large monorepo dependency trees accurate and scannable. (#2093) - Claude user-scope MCP installs now honor `CLAUDE_CONFIG_DIR`, with `~/.claude.json` retained as the fallback. (closes #2060, #2096) - Dev dependencies now survive `apm prune`, pass `apm audit --ci`, and remain represented in lockfile and MCP config checks. (by @sergio-sisternes-epam, closes #2033, #2102; supersedes #2042) - `apm deps list` now matches local transitive dependencies by their canonical install path instead of incorrectly reporting valid packages as orphaned. (closes #2068, #2099) - Failed installs from unrecognized self-hosted GitLab hosts now suggest `GITLAB_HOST`, `APM_GITLAB_HOSTS`, or an explicit `git:` plus `path:` entry. (by @rrazvd, closes #2066, #2074) - `apm update` now reconciles MCP and LSP servers after an accepted plan, removing stale runtime config and recording newly declared servers. (by @cffnpwr, closes #2077, #2085) ## [0.24.0] - 2026-07-05 ### Added - `apm install` and `apm compile` now emit Antigravity-native `trigger: glob` and `globs` frontmatter in `.agents/rules/*.md`, and `apm compile` omits instructions from `AGENTS.md` when they already exist in `.agents/rules/` (compile-time dedup). (by @okamiconcept, #1984) - `apm config list` is now available as a discoverable alias for `apm config get` with no key, listing all resolved configuration values. (by @WilliamK112, #1991) ### Security - Artifactory registry-proxy ZIP installs now use the shared safe-extraction path with traversal, symlink, and zip-bomb guards instead of direct ZIP extraction. (by @fallintoplace, #1948) - `apm runtime setup codex` now verifies GitHub Releases SHA-256 asset digests before extracting downloaded archives. (by @fallintoplace, #1949) - Marketplace plugin `bin/` executables now deploy with user-only `0o700` permissions (group/other bits cleared) and legacy `bin_deploy.deny` GitHub forms are normalized before matching. (by @WilliamK112, #1971, #2024) ### Performance - `apm install` with a committed lockfile no longer re-resolves branch-pinned and tagless locked dependencies over the network -- the tiered ref resolver's L0 cache is seeded from the lockfile before resolution runs (2 commits-API calls -> 0 on a 1-direct + 1-transitive branch-pinned install), skipped under `--update`/`--refresh`. (by @srobroek, #1973) - `apm install` and `apm outdated` now issue a single `git ls-remote` per repository when resolving multiple semver git dependencies that share one upstream, cutting network round-trips for monorepos with many shared-origin deps. (by @srobroek, #1975) - Repeated `git config` subprocess calls during cache operations were collapsed from 3 to 1 per repository, and promisor config is now applied on the clone, cutting process-spawn overhead on `apm install` and `apm update`. (by @srobroek, #1974) - `apm compile` fast-paths universal (`**`) `applyTo` matching by reusing the built directory-analysis cache, speeding up compilation for repos with many universal instructions. (by @WilliamK112, #1993) ### Fixed - `apm install` no longer aborts with a false "package not accessible" error when GitHub's API rate limit (primary 60/hr or secondary concurrency) throttles the pre-flight probe; a throttled response is now treated as indeterminate and the download step confirms the package. Genuine 404s and permission 403s still fail closed. (#2032) - Generated `CLAUDE.md` now uses a single H1 title with nested H2/H3 sections, fixing duplicate top-level headings in Claude Code. (by @WilliamK112, #2016) - `apm install` now deploys hook script directories as self-contained bundles for Claude-family targets, Copilot, and Kiro so sibling helper modules resolve at runtime, and JS/TS hook bundles get a minimal module-type `package.json` sidecar so a consumer repo's `type: module` no longer breaks CommonJS hooks. (closes #2023, #2025) - Combined hook manifests such as `claude-codex-hooks.json` now deploy to every named target instead of only the last suffix target, so one deprecated filename-routed manifest still reaches both Claude Code and Codex. (by @garyj, closes #2020, #2021) - Copilot hooks declared with Claude-shape event names (`PreToolUse`, `PostToolUse`) are now renamed to Copilot's camelCase during merge, fixing a casing mismatch that left the hooks inert. (closes #1977, #1979) - `apm audit --help` now describes the command's full scope -- hidden-Unicode scanning, drift detection, and lockfile/policy checks -- instead of naming only Unicode scanning. (by @WilliamK112, #2017) - `apm mcp install --help` now surfaces the forwarded `apm install` options inside the command description under a clearer "Forwarded install options" heading. (by @WilliamK112, #2018) - `apm pack` now packs dependency content exclusively from lockfile-attested `deployed_files`, verifying each against its recorded SHA-256 before bundling, so tampered or unattested content fails the pack instead of shipping silently. This closes a supply-chain provenance hole in both `--format apm` and `--format plugin`; unattested dependency hooks/MCP config is no longer packed and directory entries are walked with per-child symlink containment. (closes #1999, #2013) - `apm install --frozen` no longer spuriously rejects private Git dependencies on non-default hosts (Bitbucket Server, GitLab, GitHub Enterprise); lockfile matching now uses the same host-qualified identity as `apm install`. (closes #1996, #2011) - Self-hosted Git hosts such as GitBucket that serve smart-HTTP only at the `.git` path now install over anonymous HTTPS -- `apm install` no longer drops the `.git` suffix. (by @mia106dev, closes #1995, #1997) - `apm install` and `apm uninstall` no longer strip comments from `apm.yml` when updating dependency entries, so inline annotations and section notes survive. (closes #2000, #2012) - `apm pack` now emits a `marketplace.json` the Copilot App accepts when the manifest `name` contains dots or underscores: the `name` is normalized to kebab-case with a warning naming the original and emitted values, while internal resolution keeps the original name. (by @sergio-sisternes-epam, #2008) - `targets:`, `skills:`, and `alias:` on a `path:` dependency entry are no longer silently ignored during `apm install`, and now round-trip on serialization. (by @sergio-sisternes-epam, closes #1982, #1987) - Self-defined stdio MCP env `${VAR}` placeholders now resolve from the install-process environment for Claude Code and Codex instead of being written verbatim. (closes #1963, #1966) - `apm audit --ci` no longer reports phantom drift for root-local hook files when audit replay writes into a scratch project root. (closes #1978, #1980) ## [0.23.1] - 2026-06-29 ### Fixed - `apm audit --ci` no longer reports a false `content-integrity` hash-drift failure when a deployed text file is checked out with Windows (`\r\n`) line endings on one platform and POSIX (`\n`) line endings on another. Per- deployed-file hashes are now computed over canonical content (UTF-8 text normalized `\r\n` -> `\n` with a lone `\r` preserved so the carriage-return smuggling vector is still caught, binary hashed raw), so they match across platforms; lockfiles recorded on Windows before this fix re-record once on the next `apm install`. (#1952, #1959) - `apm install --skill X` is now properly additive: a later `apm install --skill Y` adds `Y` on top of the existing pin instead of silently removing the previously deployed `X` from disk. Reset the pin to the full bundle with `--skill '*'`, or drop a single skill by editing the `skills:` list in `apm.yml` and re-running `apm install`. (#1955) ## [0.23.0] - 2026-06-28 ### Added - Added a general-purpose lifecycle hooks framework: embed shell-command or HTTPS-webhook scripts in `apm.yml` under a `lifecycle:` key that fire at `pre`/`post` install/update/uninstall events, gated behind `apm lifecycle trust` so nothing runs without explicit consent. The new `apm lifecycle` command (`init`/`validate`/`test`/`trust`/`untrust`) manages and dry-runs them, with cross-platform Windows support. (by @sergio-sisternes-epam) (#1798, #1947) - `apm view versions` now routes plain shorthands (e.g. `acme/web-skills`) to the configured default registry, matching `apm install` routing. Added `--registry [NAME]` for explicit control: bare `--registry` uses the lockfile entry or configured default, `--registry NAME` forces a named registry, and a full git URL forces the git path. (by @nadav-y) (#1938) ### Removed - **BREAKING:** Removed the legacy `.chatmode.md` primitive format and `chatmodes/` directory support across discovery, integration, the watcher, and extension maps. Use `.agent.md` files in `.apm/agents/` instead. (closes #840) (#1931) ### Fixed - Fixed startup version-check hint to reference `apm self-update` instead of the deprecated `apm update` command. (by @syf2211; closes #1939) (#1943) - Fixed GFM table rendering in the documentation site by enabling `markdown.gfm` in the Astro config, restoring pipe tables, strikethrough, and task-list support for all `.mdx` content. (by @syf2211; closes #1940) (#1944) - `apm outdated` tag-pattern matching for monorepo virtual subdirectory dependencies now derives the `{name}` segment from the `virtual_path` basename (e.g., `packages/my-pkg` -> `my-pkg`), aligning with `apm update` behavior. (by @kevinbeier-enbw; closes #1893) (#1893) - Skipped startup update checks for unknown `apm` commands and bare help invocations so invalid CLI input fails without update-check latency. (by @maro114510) (#1541) - Fixed `apm install` lockfile pruning when all `apm.yml` dependencies are removed, so stale `apm.lock.yaml` entries no longer survive. (by @nadav-y) (#1926) - Fixed `apm update` final summary counts so unchanged re-materialized dependencies are not reported as updated. (by @nadav-y) (#1927) - Fixed spurious version-range diffs for cached transitive registry dependencies during `apm update`. (by @nadav-y) (#1921) - Fixed `apm install -g --mcp NAME` ignoring the package `targets:` field and `--target` flag at user scope; previously user-scope MCP install wrote to all detected runtimes unconditionally, creating unintended folders (e.g. `~/.kiro/`) when a package targets only a subset. (by @sergio-sisternes-epam) (#1941) - Applied six `--help` and flag-naming consistency fixes from the CLI Consistency Report: surfaced the `apm deps update` deprecation and `apm install --runtime` legacy-alias status in help text, dropped the misleading `vscode` runtime value, and promoted `apm compile --force-instructions` as the primary flag (`--no-dedup` kept as a hidden alias). (by @sergio-sisternes-epam; closes #1928) (#1929) - Fixed `apm preview