Skip to content

Commit 9acd8c4

Browse files
chore: release v0.27.0
Bump pyproject.toml and uv.lock to 0.27.0, move the user-facing changes since v0.26.0 into a dated changelog section, and confirm the lint mirror is green. Post-merge: tag v0.27.0 to trigger the release workflow. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f1d182b1-b222-463e-8beb-e3f1334c61e1
1 parent 6459be7 commit 9acd8c4

3 files changed

Lines changed: 82 additions & 129 deletions

File tree

CHANGELOG.md

Lines changed: 79 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -7,140 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
### Fixed
10+
## [0.27.0] - 2026-07-31
1111

12-
- On-prem Azure DevOps Server hosts configured with `ADO_HOST` or
13-
`APM_ADO_HOSTS` are no longer misclassified as GitHub Enterprise Server when
14-
`GITHUB_HOST` overlaps, keeping ADO credentials isolated end to end.
15-
The contract is pinned by `req-sc-013` in
16-
`docs/src/content/docs/specs/openapm-v0.1.md`.
17-
(by @sergio-sisternes-epam, #2365)
18-
- Package-declared targets now restrict dependency primitive deployment without expanding project or consumer authorization, preventing Claude-only hooks from leaking into Cursor and repairing stale owned entries on update; the contract is cited in `docs/src/content/docs/specs/openapm-v0.1.md`. By @sergio-sisternes-epam (#2362)
19-
- Saved targets from `apm config set target` now drive package, MCP, and LSP
20-
phases in `apm install` and `apm update`; unresolved or failed required
21-
service writes exit non-zero with a next step instead of silently succeeding.
22-
(reported by @ryodocx, #2414, closes #2345)
12+
### Added
2313

24-
- Copilot hook packages with JavaScript scripts no longer fail with "hooks: hooks must be an object"; APM keeps generated `package.json` and nested JSON bundle assets out of project `.github/hooks/scripts/` and user `~/.copilot/hooks/scripts/`, where Copilot's recursive hook-loader scan would reject them as descriptors; use `.mjs` for ES module scripts targeting Copilot or VS Code. (#2322)
14+
- `apm.lock.yaml` can now record `materialization_repo_url` separately from
15+
canonical dependency identity, preserving source casing in `apm_modules/` and
16+
generated links while safely migrating stale case-only paths. Reported by
17+
@rcollette. (#2409)
18+
19+
### Fixed
20+
21+
- `apm self-update` now downloads GitHub and GHES installers from the selected
22+
release tag and passes that same normalized version to the installer.
23+
Configured installer mirrors remain authoritative. (by @fallintoplace, #2026)
24+
- `apm install --dry-run` no longer lists self-managed `includes: auto` files
25+
as removals, matching the real install behavior. (by @mia106dev, #2069)
26+
- Repeated `apm install` runs now preserve unchanged MCP target mappings,
27+
deployment ownership, and lockfile timestamps instead of rewriting
28+
`apm.lock.yaml`. (#2306)
29+
- Declared `apm.yml` targets now determine MCP lockfile ownership before local
30+
harness detection, so teammates no longer rewrite each other's target state.
31+
Reported by @rrazvd. (#2307)
32+
- `apm lock` now defers disk deletion for dropped dependencies, preserving
33+
deployed files until normal install reconciliation can remove them safely.
34+
(by @atulya-singh, #2312)
35+
- `apm audit --ci` can now hydrate a cold cache from trusted lockfile pins
36+
without mutating project state, closing false failures and false-green audit
37+
results. (by @hugoguitton-lucca, #2329)
38+
- Consuming projects no longer inherit a dependency author's
39+
`devDependencies.mcp`; direct and transitive runtime MCP dependencies still
40+
propagate normally. (by @sergio-sisternes-epam, #2361)
41+
- Package-declared targets now restrict primitive deployment without expanding
42+
project authorization, preventing target-specific hooks from leaking into
43+
sibling harnesses and cleaning stale owned entries on update.
44+
(by @sergio-sisternes-epam, #2362)
45+
- Copilot and VS Code hook deployment now excludes generated `package.json` and
46+
nested JSON sidecars that recursive hook loaders could mistake for
47+
descriptors. (by @sergio-sisternes-epam, #2363)
48+
- `apm update` and `apm update --force` now resolve mutable Git refs from the
49+
authenticated remote even when the local bare-repository cache is stale;
50+
normal installs retain cache reuse. (by @sergio-sisternes-epam, #2364)
51+
- Marketplace semver resolution now honors the producer's `tagPattern` instead
52+
of assuming `{name}--v{version}`, while manifests without a pattern retain
53+
the legacy convention. (by @sergio-sisternes-epam, #2366)
54+
- `apm audit` now reports deployed files that no lockfile entry claims as
55+
`unrecorded` drift; shared hook merge targets remain exempt.
56+
(by @salpers, #2380)
57+
- MCP Registry v0.1 `oci` packages now render Docker launchers and follow the
58+
documented adapter package-selection order instead of falling through to
59+
npm or PyPI launchers. (by @edenfunf, #2385)
60+
- VS Code container launchers now preserve MCP Registry v0.1 runtime arguments,
61+
including collected bind mounts, instead of falling back to a bare Docker
62+
command. (by @edenfunf, #2387)
63+
- MCP-only projects now create `apm.lock.yaml` during normal install and audit
64+
cleanly on the first run; frozen install still fails without writing when
65+
state is missing or stale. (by @edenfunf, #2390)
66+
- Copilot hooks now normalize lifecycle aliases to the documented
67+
`sessionStart` and `agentStop` keys while preserving Claude's native event
68+
names. Reported by @SaulMoro. (#2405)
69+
- Public `github.com` dependencies now try anonymous HTTPS before credential
70+
resolution, avoiding repeated credential prompts while retaining private
71+
repository fallback. Reported by @RuiRomano. (#2406)
72+
- Non-container npm, PyPI, and generic MCP launchers now preserve typed Registry
73+
v0.1 arguments while retaining legacy `value_hint` compatibility. (#2407)
74+
- `apm install --target intellij` now writes MCP servers to the JetBrains
75+
Copilot plugin-read path, migrating only APM-owned entries and preserving user
76+
configuration. Reported by @xalvarez. (#2410)
2577
- `apm uninstall` now accepts the portable `_local/<name>` key printed by
26-
`apm deps list` and rejects missing or ambiguous batches with a nonzero status
27-
before APM writes. Reported by @sproott. (#2412, closes #2351)
28-
- Public `github.com` dependencies now try anonymous HTTPS before resolving
29-
credentials, so all-public installs no longer open repeated credential or
30-
Git Credential Manager prompts. Reported by @RuiRomano. (#2406, closes #2400)
31-
- `apm update` and `apm update --force` now resolve mutable Git refs from
32-
the authenticated remote even when the local cache is stale; normal installs
33-
retain lockfile and cache reuse. (by @sergio-sisternes-epam, closes #2342,
34-
#2364)
35-
- `apm self-update` now downloads GitHub and GHES installer scripts from the
36-
exact selected release tag and passes that same normalized version to the
37-
installer, while configured installer mirrors remain authoritative. (by
38-
@fallintoplace, #2026)
39-
- `apm audit` now reports a deployed file that no `apm.lock.yaml` entry claims
40-
as `unrecorded` drift. Run `apm install` and commit the regenerated lockfile
41-
to resolve new failures that `apm audit --ci` may surface on upgrade; shared
42-
hook merge targets remain exempt. (by @salpers, #2380)
43-
- Run `apm install` and commit the regenerated lockfile to resolve new
44-
`unrecorded` failures that `apm audit --ci` may surface on upgrade when
45-
deployed files were committed without an `apm.lock.yaml` claim. This closes
46-
a gap where `content-integrity` silently skipped such files; shared hook
47-
merge targets remain exempt. (by @salpers, #2380)
48-
- A project whose `apm.yml` declares only `dependencies.mcp` now gets an
49-
`apm.lock.yaml`. Such a project never entered the install pipeline that
50-
writes one, so `apm audit` failed with "Lockfile missing -- run 'apm
51-
install'" immediately after a successful install, and the resolved MCP
52-
servers went unpinned. (by @edenfunf, #2373)
53-
- Projects that declare only MCP servers now install and audit cleanly on the
54-
first try. Normal install creates `apm.lock.yaml` with the resolved MCP
55-
state; frozen install fails without writing when that state is missing or
56-
stale. The matching `openapm-v0.1.md` frozen-install requirement now covers
57-
MCP state and all durable writes. (by @edenfunf, #2390; fixes #2373)
58-
- Package-declared targets now restrict dependency primitive deployment without expanding project or consumer authorization, preventing Claude-only hooks from leaking into Cursor and repairing stale owned entries on update; the contract is cited in `docs/src/content/docs/specs/openapm-v0.1.md`. By @sergio-sisternes-epam (#2362)
59-
- `apm install --target vscode` now preserves typed MCP Registry v0.1
60-
arguments for non-container npm, PyPI, and generic launchers while keeping
61-
one semantic package identity and legacy `value_hint` compatibility.
62-
(by @edenfunf, closes #2388, #2407)
63-
64-
- `apm install --target vscode` now launches container servers with their full
65-
registry-supplied run options, including bind mounts whose values APM just
66-
collected. VS Code previously read only the legacy `value_hint` spelling, so
67-
MCP Registry v0.1 arguments were skipped and the launcher fell back to a bare
68-
`run -i --rm <image>`. (by @edenfunf, #2377)
69-
70-
71-
- MCP servers whose registry entry uses the MCP Registry v0.1 container type
72-
`oci` now render a `docker` launcher. They previously matched no launcher
73-
branch and fell through to the generic `npx` default, which handed the
74-
container image reference to npm as a package name. (by @edenfunf, #2376)
75-
76-
### Changed
77-
78-
- A server publishing both a container and a pypi package now resolves to the
79-
container on Copilot, Codex, Gemini and the adapters inheriting them,
80-
following the documented `npm, docker, pypi` selection order. Such a server
81-
previously fell through to `uvx` and now requires a Docker daemon. VS Code
82-
keeps its own `npm, pypi, docker` order. (by @edenfunf, #2376)
83-
- Consuming projects no longer inherit a dependency author's development-only
84-
MCP servers. Only `dependencies.mcp` from direct and transitive packages
85-
propagates; the root project's `dependencies.mcp` and `devDependencies.mcp`
86-
remain active for its authoring environment.
87-
(by @sergio-sisternes-epam, #2340)
88-
- `apm audit` now scans for hidden Unicode across every file under the deploy
89-
trees the project's targets govern, instead of only the files
90-
`apm.lock.yaml` records. Hash verification needs a recorded baseline and
91-
stays lockfile-scoped, but a bidi override needs none -- so a deployed file
92-
the lockfile omits (for example a target committed without the regenerated
93-
lockfile) was exempt from scanning for as long as it stayed unrecorded, in
94-
`--ci` and `--no-drift` runs alike. `apm audit --strip` cleans those files
95-
too; `--package <name>` stays lockfile-scoped. (by @salpers, #2379)
96-
- Repeated `apm install` runs with unchanged self-defined MCP dependencies and
97-
explicit target mappings now preserve `generated_at`, deployment ownership,
98-
and `mcp_target_servers`, leaving `apm.lock.yaml` byte-identical instead of
99-
rewriting it. (#2306)
100-
- Marketplace semver range resolution now honours the `tagPattern` declared by the producer; `version: "~2.1.0"` entries no longer silently fall back to the hardcoded `{name}--v{version}` tag pattern. Existing marketplace files without `tag_pattern` keep the legacy convention. Bare versions also fail closed when no tag matches; use an explicit tag ref instead. (#2366)
101-
- On-prem Azure DevOps Server hosts configured with `ADO_HOST` or
102-
`APM_ADO_HOSTS` are no longer misclassified as GitHub Enterprise Server when
103-
`GITHUB_HOST` overlaps, keeping ADO credentials isolated end to end.
104-
The contract is pinned by `req-sc-013` in
105-
`docs/src/content/docs/specs/openapm-v0.1.md`.
106-
(by @sergio-sisternes-epam, #2365)
107-
- Package-declared targets now restrict dependency primitive deployment without expanding project or consumer authorization, preventing Claude-only hooks from leaking into Cursor and repairing stale owned entries on update; the contract is cited in `docs/src/content/docs/specs/openapm-v0.1.md`. By @sergio-sisternes-epam (#2362)
108-
- Copilot hooks now normalize session lifecycle aliases to documented `sessionStart` and `agentStop` keys while preserving Claude's `SessionStart` and `Stop` output (reported by @SaulMoro, closes #2337, #2405)
109-
- `apm install --target intellij` now writes JetBrains Copilot MCP servers to
110-
the plugin-read config location, migrates only APM-owned entries from the
111-
obsolete data path, and preserves user-authored entries in both files.
112-
Reported by @xalvarez. (#2410, closes #2344)
113-
- JetBrains Copilot on Linux and macOS now sees MCP servers installed by
114-
`apm install --target intellij`: APM writes the plugin-read config path,
115-
migrates only APM-owned entries from the obsolete data path, and preserves
116-
user-authored entries in both files. (closes #2344) (by @xalvarez, #2410)
78+
`apm deps list` and rejects missing or ambiguous batches before writing.
79+
Reported by @sproott. (#2412)
11780
- Saved targets from `apm config set target` now drive package, MCP, and LSP
118-
phases in `apm install` and `apm update`; unresolved or failed required
119-
service writes exit non-zero instead of skipping with success.
120-
(by @ryodocx, closes #2345)
121-
122-
- Mixed-case GitHub dependency paths now retain source casing in
123-
`apm_modules/` and generated links while lockfile and deduplication identity
124-
stays canonical; reinstall migrates stale case-only paths safely.
125-
`docs/src/content/docs/specs/openapm-v0.1.md` now defines this split in
126-
`req-lk-022`. Reported by @rcollette. (closes #2347, #2409)
127-
- `apm install --dry-run` no longer lists the project's own `includes: auto`
128-
self-managed files under "Files that would be removed"; the orphan preview
129-
now excludes the synthesized lockfile self-entry, matching the real install
130-
which never removes them. (by @mia106dev, #2069)
131-
- Teammates with different harnesses installed no longer rewrite each other's
132-
`mcp_target_servers`; lockfile ownership now follows declared `apm.yml`
133-
`targets:` before local runtime detection. (by @rrazvd, closes #2298, #2307)
81+
phases in `apm install` and `apm update`; failed required service writes exit
82+
nonzero with a next step instead of silently succeeding. Reported by
83+
@ryodocx. (#2414)
13484

13585
### Security
13686

87+
- On-prem Azure DevOps Server hosts are no longer misclassified as GitHub
88+
Enterprise Server when host settings overlap, keeping ADO credentials isolated
89+
end to end. (by @sergio-sisternes-epam, #2365)
90+
- `apm audit` now scans every governed deploy-tree file for hidden Unicode,
91+
including files omitted from `apm.lock.yaml`; `--package` remains
92+
lockfile-scoped. (by @salpers, #2381)
13793
- Corporate git security settings -- SSL CA pins (`http.sslCAInfo`), bare-repo
138-
protection (`safe.bareRepository=explicit`), and other inherited `GIT_CONFIG_*`
139-
hardening -- are no longer silently dropped when apm injects an
140-
`Authorization` header for a clone, download, or marketplace `ls-remote`.
141-
The header overlay previously hardcoded `GIT_CONFIG_COUNT=1`, so merging it
142-
onto an already-configured environment reset the count and clobbered index
143-
0. (by @edenfunf, #2368)
94+
protection, and inherited `GIT_CONFIG_*` hardening -- are now preserved when
95+
APM injects authorization headers for Git operations.
96+
(by @edenfunf, #2382)
14497

14598
## [0.26.0] - 2026-07-18
14699

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "apm-cli"
7-
version = "0.26.0"
7+
version = "0.27.0"
88
description = "MCP configuration tool"
99
readme = "README.md"
1010
requires-python = ">=3.10"

uv.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)