Skip to content

feat(pack): unify 'apm pack' to produce bundle and marketplace.json (closes #722)#1042

Merged
danielmeppiel merged 8 commits intomainfrom
fix/marketplace-fold-review-comments
Apr 29, 2026
Merged

feat(pack): unify 'apm pack' to produce bundle and marketplace.json (closes #722)#1042
danielmeppiel merged 8 commits intomainfrom
fix/marketplace-fold-review-comments

Conversation

@danielmeppiel
Copy link
Copy Markdown
Collaborator

@danielmeppiel danielmeppiel commented Apr 29, 2026

feat(pack): unify apm pack to produce bundle and marketplace.json

TL;DR

Two build-shaped verbs (apm pack for bundles, apm marketplace build for marketplace.json) collapse into one: apm pack reads apm.yml and produces whichever artifacts the manifest declares — bundle when dependencies: is present, .claude-plugin/marketplace.json when marketplace: is present, both when both are. The marketplace_authoring experimental flag is removed (GA), and apm marketplace init now appends to apm.yml instead of scaffolding a standalone marketplace.yml. Closes #722.

Important

Breaking: apm marketplace build is deleted (no deprecation alias). Invoking it exits 2 with a one-line migration message. Update CI scripts to call apm pack.

Problem (WHY)

Why these matter: the user-facing surface had drifted from the PROSE principle: "Favor small, chainable primitives over monolithic frameworks." Two verbs that share a manifest, a lockfile, and an output directory are not chainable primitives — they are duplication. The Agent Skills guidance applies in mirror image: "Add what the agent lacks, omit what it knows" — the second verb added nothing the first could not infer from the manifest.

Approach (WHAT)

# Change Anchor
1 Single verb apm pack reads apm.yml, runs BundleProducer and/or MarketplaceProducer based on declared blocks. Manifest is the control plane (npm/cargo precedent).
2 Delete apm marketplace build outright; install a custom error in the marketplace group that exits 2 with a migration hint. Per maintainer directive: "do not deprecate things, just remove them."
3 Remove marketplace_authoring experimental flag and all its call sites + tests. GA promotion.
4 Default marketplace output to .claude-plugin/marketplace.json (Anthropic-canonical). Override via --marketplace-output. Claude Code marketplace spec.
5 apm marketplace init appends a marketplace: block to existing apm.yml (errors if missing or already present). Authors a project; does not scaffold a parallel config file.
6 New flags scoped to marketplace producer: --offline, --include-prerelease, --marketplace-output. Silent no-op when only bundle output is detected (matches npm pack flag-scope behavior).

Implementation (HOW)

  • src/apm_cli/core/build_orchestrator.py (new, 274 lines) — Strategy pattern: BuildOrchestrator + ArtifactProducer Protocol + BundleProducer and MarketplaceProducer adapters. detect_outputs() does a raw YAML key check on apm.yml (plus a legacy marketplace.yml sibling check) to decide which producers to run. Producers are thin wrappers around the existing bundle.packer.pack_bundle and marketplace.builder.MarketplaceBuilder — no new build logic.
  • src/apm_cli/commands/pack.py — Rewires the click command to build BuildOptions and call the orchestrator. Adds --offline, --include-prerelease, --marketplace-output. Help text rewritten to document the manifest-driven mental model with three example clusters (bundle-only, marketplace-only, both).
  • src/apm_cli/commands/marketplace.py — Removes _authoring_visible() and _require_authoring_flag() and every call site. Adds MarketplaceGroup(click.Group) that catches the build subcommand name and raises UsageError with the migration message. apm marketplace init rewritten to operate on apm.yml via ruamel.yaml round-trip (preserves comments).
  • src/apm_cli/core/experimental.pymarketplace_authoring entry deleted from the FLAGS dict.
  • src/apm_cli/marketplace/init_template.py — Template now describes a marketplace: block to append, not a standalone file. All apm marketplace build references replaced with apm pack.
  • Test churn — Deleted: tests/unit/commands/test_marketplace_{build,gating}.py. Added: tests/unit/core/test_build_orchestrator.py (14 tests), tests/integration/test_pack_unified.py (9 tests), tests/integration/test_azure_skills_marketplace.py (1 byte-identical-reproduction test). Net: -82 + 24 + 1 = -57 tests, all due to gate/build subcommand removal.
  • Docsdocs/src/content/docs/guides/marketplace-authoring.md rewritten end-to-end. CLI reference, manifest schema, experimental.md, and the apm-usage skill all updated to match.

Diagrams

Legend: how apm pack routes a project's apm.yml to one or both producers; the dashed boxes mark the unified entrypoint and the new orchestrator that did not exist before this PR.

flowchart LR
    User([User runs<br/>apm pack]):::new
    Manifest[apm.yml]
    Detect{detect_outputs}:::new
    Orchestrator[BuildOrchestrator]:::new

    subgraph Producers
        Bundle[BundleProducer]
        Market[MarketplaceProducer]
    end

    Lockfile[(apm.lock.yaml)]
    BuildDir["./build/[name]/"]
    ClaudeDir[.claude-plugin/<br/>marketplace.json]

    User --> Orchestrator
    Orchestrator --> Detect
    Manifest --> Detect
    Detect -- "dependencies:" --> Bundle
    Detect -- "marketplace:" --> Market
    Detect -- "neither" --> Err[/exit 1:<br/>Nothing to pack/]:::new
    Bundle --> Lockfile
    Bundle --> BuildDir
    Market --> Manifest
    Market --> ClaudeDir

    classDef new stroke-dasharray: 5 5,stroke:#0969da,stroke-width:2px;
Loading

Legend: invocation flow when the project has both blocks — both producers run sequentially against the same manifest and lockfile, each writing to its canonical location.

sequenceDiagram
    participant U as User
    participant P as apm pack
    participant O as BuildOrchestrator
    participant B as BundleProducer
    participant M as MarketplaceProducer
    participant FS as Filesystem

    U->>P: apm pack
    P->>O: run(BuildOptions)
    O->>O: detect_outputs(apm.yml)
    Note over O: both blocks present<br/>routes to BUNDLE and MARKETPLACE
    O->>B: produce()
    B->>FS: write ./build/[name]/
    B-->>O: ProducerResult
    O->>M: produce()
    M->>FS: write .claude-plugin/marketplace.json
    M-->>O: ProducerResult
    O-->>P: BuildResult
    P-->>U: Packed 2 artifacts
Loading

Trade-offs

  • Hard delete vs deprecation alias for apm marketplace build. Chose hard delete with a one-line migration error; rejected a transitional shim. Per repo policy: "we still favor shipping fast over lengthy deprecation cycles" (CLAUDE.md). The custom click error gives users a single clear migration step; a silent alias would let drift fester.
  • No --marketplace-only / --bundle-only flags. Manifest is the control plane; users skip a producer by removing the corresponding block. Adding override flags would invite combinatorial nonsense (--bundle-only --marketplace-only = error? both?) and contradict the mental model.
  • MVP keeps standalone marketplace.yml as a read-only legacy fallback. Already-deprecated; removal is queued for v0.13. Doing both (introduce orchestrator AND remove legacy reader) in one PR would balloon scope and break users mid-migration.
  • Producers run sequentially, not in parallel. Both touch apm.yml/lockfile; parallelism risks contention for sub-second wall-clock gain. Revisit only if a third producer with isolated I/O appears.

Benefits

  1. One verb to learn. New users discover apm pack from apm --help; the marketplace path no longer requires reading a separate doc page first.
  2. Anthropic-spec output by default. Marketplace publishers can apm pack && git add .claude-plugin/marketplace.json && git commit — no manual copy step, no drift between the file Claude Code reads and the file apm writes.
  3. Zero opt-in for marketplace authoring. apm experimental enable marketplace_authoring step removed from every quickstart.
  4. Byte-identical reproduction of a real-world marketplace. tests/integration/test_azure_skills_marketplace.py clones (or replays a snapshot of) microsoft/azure-skills and asserts apm pack produces a marketplace.json with sha256 02f76bf...3b, matching the hand-authored file in that repo. This is regression coverage against future drift.
  5. Single Strategy seam for future producers. Adding a third output (e.g., npm-registry push) is one new ArtifactProducer implementation, not a new top-level command.

Validation

uv run pytest tests/unit tests/test_console.py -x:

======================= 6706 passed in 88.34s (0:01:28) =======================

uv run pytest tests/integration/test_pack_unified.py tests/integration/test_azure_skills_marketplace.py -x:

======================== 10 passed in 4.21s ========================

uv run pytest tests/unit/core/test_build_orchestrator.py -x:

======================== 14 passed in 0.19s ========================

azure-skills reproduction (excerpt from test_azure_skills_marketplace.py::test_apm_pack_reproduces_azure_skills_marketplace_json_byte_for_byte):

expected sha256: 02f76bfc0e5bbf7fdf1de1dda1f84c4da6e986913b6647973c0ffe39c1d5003b
actual   sha256: 02f76bfc0e5bbf7fdf1de1dda1f84c4da6e986913b6647973c0ffe39c1d5003b
PASS
Files changed (40)
A  src/apm_cli/core/build_orchestrator.py        (+274)
M  src/apm_cli/commands/pack.py                  (~108 lines)
M  src/apm_cli/commands/marketplace.py           (gate removal + custom group)
M  src/apm_cli/commands/marketplace_plugin.py    (gate import removed)
M  src/apm_cli/commands/init.py                  (gate removed around --marketplace)
M  src/apm_cli/core/experimental.py              (FLAGS entry removed)
M  src/apm_cli/marketplace/init_template.py      (apm.yml block instead of standalone file)
M  src/apm_cli/marketplace/migration.py
M  src/apm_cli/marketplace/yml_editor.py
A  tests/integration/test_pack_unified.py        (9 tests)
A  tests/integration/test_azure_skills_marketplace.py (1 test)
A  tests/unit/core/test_build_orchestrator.py    (14 tests)
A  tests/fixtures/azure-skills/apm.yml
A  tests/fixtures/azure-skills/.claude-plugin/marketplace.json
M  tests/unit/marketplace/conftest.py            (fixture removed)
M  tests/unit/commands/conftest.py               (fixture removed)
D  tests/unit/commands/test_marketplace_build.py
D  tests/unit/commands/test_marketplace_gating.py
M  tests/unit/commands/test_marketplace_init.py
M  tests/unit/commands/test_marketplace_publish.py
A  tests/unit/marketplace/test_review_fixes.py
M  tests/unit/marketplace/test_apm_yml_marketplace_loader.py
M  tests/unit/marketplace/test_yml_schema.py
M  CHANGELOG.md
M  docs/src/content/docs/guides/marketplace-authoring.md
M  docs/src/content/docs/guides/marketplaces.md
M  docs/src/content/docs/reference/cli-commands.md
M  docs/src/content/docs/reference/experimental.md
M  docs/src/content/docs/reference/manifest-schema.md
M  packages/apm-guide/.apm/skills/apm-usage/commands.md
M  packages/apm-guide/.apm/skills/apm-usage/package-authoring.md
M  packages/apm-guide/.apm/skills/apm-usage/authentication.md
M  .github/aw/actions-lock.json
M  .github/workflows/agentics-maintenance.yml
M  .github/workflows/cli-consistency-checker.lock.yml
M  .github/workflows/daily-doc-updater.lock.yml
M  .github/workflows/daily-test-improver.lock.yml
M  .github/workflows/pr-review-panel.lock.yml
M  .github/workflows/triage-panel.lock.yml

Net: +2121 / -1579 across 40 files.

How to test

  • git checkout fix/marketplace-fold-review-comments && uv sync --extra dev.
  • In a project with only dependencies: in apm.yml, run apm pack → expect ./build/<name>/ only.
  • In a project with only marketplace: in apm.yml, run apm pack → expect .claude-plugin/marketplace.json only.
  • Run apm marketplace build → expect exit 2 with the one-line migration message pointing at apm pack.
  • Clone https://github.com/microsoft/azure-skills, run apm pack in it, then sha256sum .claude-plugin/marketplace.json → expect 02f76bfc0e5bbf7fdf1de1dda1f84c4da6e986913b6647973c0ffe39c1d5003b.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Twelve findings from the copilot-pull-request-reviewer pass on PR #1038.

Code fixes (in src/):
- Remove unused DEPRECATION_MESSAGE import in commands/marketplace.py
- Remove unused LOCAL_SOURCE_RE import in marketplace/yml_editor.py
- _has_marketplace_block() now raises MarketplaceYmlError on YAML parse
  errors and OS read errors instead of swallowing them as 'no config'
  -- fixes a misleading message on malformed apm.yml.
- migrate_marketplace_yml() validates that apm.yml round-trips to a
  mapping; empty apm.yml now treated as an empty mapping (CommentedMap)
  so the marketplace block can still be inserted.
- _is_apm_yml_with_marketplace() now requires the marketplace value
  itself to be a mapping; previously a non-dict value would crash
  _get_marketplace_container() callers on .get() access.
- 'apm marketplace init' applies the same empty-vs-non-mapping guard
  on apm.yml round-trip; non-mapping top level is a hard error,
  empty file is treated as an empty mapping.
- 'apm init --marketplace' no longer derives marketplace owner from
  the project name (which produced misleading github.com/<project>
  URLs); the template's acme-org placeholder is used instead.
- _check_gitignore_for_marketplace_json warning text refreshed: 'Both
  apm.yml and the generated marketplace.json must be tracked'.
- Renamed test_source_dot_traversal to test_local_source_accepted
  (the behavior changed at fold time).
- init_template.py module docstring now describes both renderers.
- test_apm_yml_marketplace_loader.py docstring corrected: strict-key
  enforcement is inside the marketplace block only.

Regression tests (tests/unit/marketplace/test_review_fixes.py, +12):
- malformed apm.yml surfaces a clear MarketplaceYmlError
- migrate rejects list/scalar top level, accepts empty file
- _is_apm_yml_with_marketplace rejects non-mapping marketplace values
- 'apm marketplace init' rejects non-mapping apm.yml, accepts empty

Docs (delivered by doc-writer agent):
- Full rewrite of docs/src/content/docs/guides/marketplace-authoring.md
  around the apm.yml block; cites microsoft/azure-skills as the
  byte-for-byte build proof. Adds local-path packages section and a
  migration section.
- One-line fix in guides/marketplaces.md (marketplace.yml -> apm.yml).
- reference/cli-commands.md: rewrote init/build/outdated/check/doctor
  blurbs, added 'apm marketplace migrate' reference, added
  '--marketplace' flag to 'apm init' options/examples.
- reference/manifest-schema.md: added optional 'marketplace:' to the
  top-level shape with a pointer to the authoring guide.
- packages/apm-guide/.apm/skills/apm-usage/commands.md and
  package-authoring.md: refreshed authoring tables and shape; called
  out experimental gate and deprecation.
- CHANGELOG.md: Added/Changed/Deprecated entries under [Unreleased]
  citing #1038.

Validation:
- 6757 unit tests pass (6745 prior + 12 new regression).
- Real-world build proof: cloned microsoft/azure-skills, appended a
  marketplace: block to its apm.yml derived from the hand-authored
  marketplace.json, ran 'apm marketplace build', and diffed -- byte-
  for-byte identical (sha256 02f76bfc...).

Closes review of #1038.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings April 29, 2026 14:19
@danielmeppiel danielmeppiel added the panel-review Trigger the apm-review-panel gh-aw workflow label Apr 29, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Follow-up to the marketplace-authoring consolidation work (PR #1038), tightening edge-case handling around apm.yml parsing/migration/init flows and refreshing the public + embedded docs to reflect the single-apm.yml source-of-truth model.

Changes:

  • Harden marketplace config detection/migration/init against malformed, empty, or non-mapping apm.yml inputs (with clearer typed errors).
  • Add regression tests covering the reviewed edge cases.
  • Refresh docs/guide content + command reference + schema docs + changelog entries to reflect the apm.yml marketplace: block authoring surface.
Show a summary per file
File Description
tests/unit/marketplace/test_yml_schema.py Renames a test to match updated local-path source behavior.
tests/unit/marketplace/test_review_fixes.py Adds regression coverage for malformed/empty/non-mapping apm.yml scenarios and helper tightening.
tests/unit/marketplace/test_apm_yml_marketplace_loader.py Corrects docstring to reflect unknown-key validation scope.
src/apm_cli/marketplace/yml_editor.py Tightens _is_apm_yml_with_marketplace to require a mapping marketplace block.
src/apm_cli/marketplace/migration.py Makes _has_marketplace_block surface read/parse errors; makes migration tolerate empty apm.yml and reject non-mappings.
src/apm_cli/marketplace/init_template.py Updates module docstring to describe both template renderers.
src/apm_cli/commands/marketplace.py Drops unused import; makes marketplace init handle empty/non-mapping apm.yml; updates .gitignore warning wording.
src/apm_cli/commands/init.py Stops deriving marketplace owner from project name when --marketplace is used.
packages/apm-guide/.apm/skills/apm-usage/package-authoring.md Updates embedded authoring docs to the apm.yml marketplace: model and adds migration guidance.
packages/apm-guide/.apm/skills/apm-usage/commands.md Updates embedded command reference for marketplace authoring and apm init --marketplace.
docs/src/content/docs/reference/manifest-schema.md Documents optional top-level marketplace: in apm.yml.
docs/src/content/docs/reference/cli-commands.md Adds apm marketplace migrate reference; updates init/build/authoring docs for the apm.yml block model.
docs/src/content/docs/guides/marketplaces.md Fixes legacy marketplace.yml reference to apm.yml.
docs/src/content/docs/guides/marketplace-authoring.md Rewrites the guide around apm.yml marketplace: + .claude-plugin/marketplace.json output and migration/local-path packages.
CHANGELOG.md Adds Unreleased entries describing the marketplace authoring consolidation/migration/init changes.

Copilot's findings

  • Files reviewed: 15/15 changed files
  • Comments generated: 4

Comment thread src/apm_cli/marketplace/migration.py Outdated
Comment on lines 252 to 253
apm_data = rt.load(apm_text)

Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

migrate_marketplace_yml() validates legacy marketplace.yml up front, but apm.yml is still parsed via ruamel without catching YAML parse errors. If apm.yml is malformed, this will raise a ruamel exception (and the CLI will surface a generic "Migration failed"), rather than a consistent MarketplaceYmlError like _has_marketplace_block(). Consider catching ruamel/yaml parse errors around rt.load(apm_text) and re-raising MarketplaceYmlError with an "Invalid YAML in apm.yml" message.

Suggested change
apm_data = rt.load(apm_text)
try:
apm_data = rt.load(apm_text)
except Exception as exc:
from ruamel.yaml.error import YAMLError as RuamelYAMLError
if isinstance(exc, RuamelYAMLError):
raise MarketplaceYmlError("Invalid YAML in apm.yml.") from exc
raise

Copilot uses AI. Check for mistakes.
Comment thread src/apm_cli/commands/init.py
Comment thread CHANGELOG.md Outdated
Comment thread src/apm_cli/marketplace/yml_editor.py
Picks up the AW_APM_PACKAGES JSON-array fix from gh-aw v0.71.2
(shared/apm.md realignment in github/gh-aw#29002), which caused
the PR Review Panel run on PR #1042 to fail at the
'Validate downloaded bundles match matrix manifest' step.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danielmeppiel danielmeppiel added panel-review Trigger the apm-review-panel gh-aw workflow and removed panel-review Trigger the apm-review-panel gh-aw workflow labels Apr 29, 2026
danielmeppiel and others added 4 commits April 29, 2026 16:47
- migration.py: wrap ruamel apm.yml load; raise typed
  MarketplaceYmlError("apm.yml is malformed: ...") instead of
  leaking ruamel.yaml.YAMLError to the caller. Mirrors the existing
  legacy marketplace.yml error path.
- init.py: when 'apm init --marketplace' is invoked but the
  marketplace_authoring experimental flag is disabled, append the
  block (option b -- lower friction, harmless if unused) and emit a
  CommandLogger.warning() pointing at the flag name and enablement
  command.
- yml_editor.py: add 'data: object' type hint to
  _is_apm_yml_with_marketplace() to satisfy the project-wide type-hint
  requirement.
- CHANGELOG.md: condense Unreleased marketplace entries to one line
  per entry per Keep a Changelog convention; strip nested bullets
  and prose.

Tests:
- test_migrate_with_malformed_apm_yml_raises_typed_error
- TestInitMarketplaceFlagWarnsWhenExperimentalDisabled
  ::test_warns_with_experimental_flag_name

Full unit suite: 6759 passed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Rewrite marketplace authoring guide to use 'apm pack' and the
  apm.yml marketplace: block as the single source of truth.
- Update CLI command reference: remove 'apm marketplace build' entry,
  refresh 'apm pack' flag table, refresh 'apm marketplace init'.
- Update apm-usage skill (commands.md) to match.
- Remove all references to the marketplace_authoring experimental flag.

Closes part of #722.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reads apm.yml and detects which artifacts to produce based on the
presence of 'dependencies:' (bundle) and 'marketplace:' (marketplace.json)
blocks. A single 'apm pack' invocation now replaces the legacy
'apm marketplace build' subcommand.

Changes:
- New BuildOrchestrator (src/apm_cli/core/build_orchestrator.py) with
  pluggable ArtifactProducer protocol and BundleProducer +
  MarketplaceProducer implementations.
- pack command gains --offline, --include-prerelease, and
  --marketplace-output flags. Help text documents exit codes.
- 'apm marketplace build' is hard-removed: invoking it exits 2 with a
  one-line migration message.
- 'marketplace_authoring' experimental flag deleted (GA).
- 'apm marketplace init' and 'apm init --marketplace' next-step hints
  now point at 'apm pack'.
- 'apm marketplace publish' error wording updated.
- New tests: 14 orchestrator unit tests, 9 pack integration tests, and
  one byte-for-byte snapshot test against microsoft/azure-skills@bef1f05
  (sha256 02f76bfc0e5bbf7fdf1de1dda1f84c4da6e986913b6647973c0ffe39c1d5003b).
- Stale tests removed: test_marketplace_build.py, test_marketplace_gating.py,
  and the marketplace_authoring experimental-flag class.
- CHANGELOG updated under Added / Changed / Removed.

Validation:
- 6706 unit + console tests pass (uv run pytest tests/unit tests/test_console.py)
- 10 new integration tests pass
- azure-skills snapshot proof matches byte-for-byte

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danielmeppiel danielmeppiel changed the title fix(marketplace): address PR #1038 review comments + docs refresh feat(pack): unify 'apm pack' to produce bundle and marketplace.json (closes #722) Apr 29, 2026
Per copilot-pull-request-reviewer comment on PR #1042: Keep a Changelog
entries should be one concise line per PR. The previous entry (418 chars,
multi-clause) is condensed to 165 chars matching the convention.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danielmeppiel
Copy link
Copy Markdown
Collaborator Author

Assessed the 4 copilot-pull-request-reviewer comments from 14:28 UTC; all addressed:

# File Status Where
1 migration.py ruamel parse error ✅ wrapped in try/except yaml.YAMLError → MarketplaceYmlError a322bfd (lines 82-87)
2 init.py --marketplace should require experimental flag ✅ superseded — marketplace_authoring flag deleted entirely (GA promotion) dd5f558
3 CHANGELOG entries too long apm pack entry condensed from 418 → 165 chars 2b70e1e (this commit)
4 yml_editor.py missing type hint on data data: object annotation added a322bfd

The reviewer's snapshot was taken before the GA-promotion + cleanup commits landed, so #2 reads as a regression but is actually obsolete — see the Removed section in CHANGELOG.

@danielmeppiel danielmeppiel merged commit 9e450d3 into main Apr 29, 2026
11 checks passed
@danielmeppiel danielmeppiel deleted the fix/marketplace-fold-review-comments branch April 29, 2026 16:22
danielmeppiel pushed a commit that referenced this pull request Apr 29, 2026
Promotes [Unreleased] -> [0.11.0] - 2026-04-29 and bumps
pyproject.toml + uv.lock to 0.11.0.

Version-bump rationale: 0.11.0 (minor bump) chosen over 0.10.1 because
this release ships one BREAKING removal (`apm marketplace build` -> exits 2,
use `apm pack`) plus several net-new features (Dev Container Feature,
Codex project-scoped MCP, `marketplace:` block in apm.yml, `apm pack`
unification, multi-org `apps[]`). Strict semver in 0.x: minor for
features-with-break, patch only for bugfixes.

Milestone admin (done out-of-band):
- Renamed milestone #8 `0.10.1` -> `0.11.0`
- Created milestone #9 `0.12.0` as next-up bucket
- Moved 43 open items (42 issues + 1 open PR #999) from `0.11.0` -> `0.12.0`
- 6 closed items stay in `0.11.0`

PRs shipping in 0.11.0 (22 commits since v0.10.0):

User-facing features:
- #1042/#722 `apm pack` unifies bundle + marketplace.json
                   (BREAKING: `apm marketplace build` removed)
- #1038       `marketplace:` block in apm.yml + `apm marketplace migrate`
- #803  /#502 Codex project-scoped MCP (`.codex/config.toml`) + user-scope primitives
- #861        Dev Container Feature `ghcr.io/microsoft/apm/apm-cli`
- #982/#984   shared/apm.md `apps:` array for cross-org private packages
- #820        `target:` in apm.yml validates at parse time
- #1032       `apm marketplace add` honors manifest.name (Claude Code parity)
- #1000/#998/#994 unified `--policy` / `--policy-source` accepted forms

User-facing fixes:
- #1015 ADO Entra ID auth + `apm install --update` pre-flight abort
- #1019/#1020 GEMINI.md only created when target requested
- #1008 marketplace producer respects GITHUB_HOST + multi-host URL forms
- #1018 POSIX paths in auto-discovery output (Windows compat)
- #996  drop stray 'specify' from generated file footer

Maintainer tooling:
- #1043 NOTICE.md per CELA template
- #1045/#1044 NOTICE drift gate + license-policy gate in CI
- #1033 shared/apm.md `[a b]` import-input repair (gh-aw#29076 paper-cut)
- #1030 panel workflows skip-don't-fail on unmatched labels; gh-aw v0.71.1
- #1026 shared/apm.md recompiled to apm-action v1.5.0 + bundles-file
- #1022 review-panel: true fan-out + binary verdict + label automation
- #918  complexity audit + benchmarks suite
- #1002 CodeQL clear-text-storage false-positive resolved (token -> placeholder)

Files changed:
- pyproject.toml: 0.10.0 -> 0.11.0
- uv.lock:        regenerated (version field only)
- CHANGELOG.md:   [Unreleased] promoted to [0.11.0] - 2026-04-29

NOTICE drift check passes against the bumped lockfile.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@danielmeppiel danielmeppiel added this to the 0.11.0 milestone Apr 29, 2026
danielmeppiel pushed a commit that referenced this pull request Apr 29, 2026
Promotes [Unreleased] -> [0.11.0] - 2026-04-29 and bumps
pyproject.toml + uv.lock to 0.11.0.

Version-bump rationale: 0.11.0 (minor bump) chosen over 0.10.1 because
this release ships one BREAKING removal (`apm marketplace build` -> exits 2,
use `apm pack`) plus several net-new features (Dev Container Feature,
Codex project-scoped MCP, `marketplace:` block in apm.yml, `apm pack`
unification, multi-org `apps[]`). Strict semver in 0.x: minor for
features-with-break, patch only for bugfixes.

Milestone admin (done out-of-band):
- Renamed milestone #8 `0.10.1` -> `0.11.0`
- Created milestone #9 `0.12.0` as next-up bucket
- Moved 43 open items (42 issues + 1 open PR #999) from `0.11.0` -> `0.12.0`
- 6 closed items stay in `0.11.0`

PRs shipping in 0.11.0 (22 commits since v0.10.0):

User-facing features:
- #1042/#722 `apm pack` unifies bundle + marketplace.json
                   (BREAKING: `apm marketplace build` removed)
- #1038       `marketplace:` block in apm.yml + `apm marketplace migrate`
- #803  /#502 Codex project-scoped MCP (`.codex/config.toml`) + user-scope primitives
- #861        Dev Container Feature `ghcr.io/microsoft/apm/apm-cli`
- #982/#984   shared/apm.md `apps:` array for cross-org private packages
- #820        `target:` in apm.yml validates at parse time
- #1032       `apm marketplace add` honors manifest.name (Claude Code parity)
- #1000/#998/#994 unified `--policy` / `--policy-source` accepted forms

User-facing fixes:
- #1015 ADO Entra ID auth + `apm install --update` pre-flight abort
- #1019/#1020 GEMINI.md only created when target requested
- #1008 marketplace producer respects GITHUB_HOST + multi-host URL forms
- #1018 POSIX paths in auto-discovery output (Windows compat)
- #996  drop stray 'specify' from generated file footer

Maintainer tooling:
- #1043 NOTICE.md per CELA template
- #1045/#1044 NOTICE drift gate + license-policy gate in CI
- #1033 shared/apm.md `[a b]` import-input repair (gh-aw#29076 paper-cut)
- #1030 panel workflows skip-don't-fail on unmatched labels; gh-aw v0.71.1
- #1026 shared/apm.md recompiled to apm-action v1.5.0 + bundles-file
- #1022 review-panel: true fan-out + binary verdict + label automation
- #918  complexity audit + benchmarks suite
- #1002 CodeQL clear-text-storage false-positive resolved (token -> placeholder)

Files changed:
- pyproject.toml: 0.10.0 -> 0.11.0
- uv.lock:        regenerated (version field only)
- CHANGELOG.md:   [Unreleased] promoted to [0.11.0] - 2026-04-29

NOTICE drift check passes against the bumped lockfile.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
danielmeppiel added a commit that referenced this pull request Apr 29, 2026
* chore(release): cut 0.11.0

Promotes [Unreleased] -> [0.11.0] - 2026-04-29 and bumps
pyproject.toml + uv.lock to 0.11.0.

Version-bump rationale: 0.11.0 (minor bump) chosen over 0.10.1 because
this release ships one BREAKING removal (`apm marketplace build` -> exits 2,
use `apm pack`) plus several net-new features (Dev Container Feature,
Codex project-scoped MCP, `marketplace:` block in apm.yml, `apm pack`
unification, multi-org `apps[]`). Strict semver in 0.x: minor for
features-with-break, patch only for bugfixes.

Milestone admin (done out-of-band):
- Renamed milestone #8 `0.10.1` -> `0.11.0`
- Created milestone #9 `0.12.0` as next-up bucket
- Moved 43 open items (42 issues + 1 open PR #999) from `0.11.0` -> `0.12.0`
- 6 closed items stay in `0.11.0`

PRs shipping in 0.11.0 (22 commits since v0.10.0):

User-facing features:
- #1042/#722 `apm pack` unifies bundle + marketplace.json
                   (BREAKING: `apm marketplace build` removed)
- #1038       `marketplace:` block in apm.yml + `apm marketplace migrate`
- #803  /#502 Codex project-scoped MCP (`.codex/config.toml`) + user-scope primitives
- #861        Dev Container Feature `ghcr.io/microsoft/apm/apm-cli`
- #982/#984   shared/apm.md `apps:` array for cross-org private packages
- #820        `target:` in apm.yml validates at parse time
- #1032       `apm marketplace add` honors manifest.name (Claude Code parity)
- #1000/#998/#994 unified `--policy` / `--policy-source` accepted forms

User-facing fixes:
- #1015 ADO Entra ID auth + `apm install --update` pre-flight abort
- #1019/#1020 GEMINI.md only created when target requested
- #1008 marketplace producer respects GITHUB_HOST + multi-host URL forms
- #1018 POSIX paths in auto-discovery output (Windows compat)
- #996  drop stray 'specify' from generated file footer

Maintainer tooling:
- #1043 NOTICE.md per CELA template
- #1045/#1044 NOTICE drift gate + license-policy gate in CI
- #1033 shared/apm.md `[a b]` import-input repair (gh-aw#29076 paper-cut)
- #1030 panel workflows skip-don't-fail on unmatched labels; gh-aw v0.71.1
- #1026 shared/apm.md recompiled to apm-action v1.5.0 + bundles-file
- #1022 review-panel: true fan-out + binary verdict + label automation
- #918  complexity audit + benchmarks suite
- #1002 CodeQL clear-text-storage false-positive resolved (token -> placeholder)

Files changed:
- pyproject.toml: 0.10.0 -> 0.11.0
- uv.lock:        regenerated (version field only)
- CHANGELOG.md:   [Unreleased] promoted to [0.11.0] - 2026-04-29

NOTICE drift check passes against the bumped lockfile.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(changelog): tighten 0.11.0 entries to lead with user impact

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(changelog): move Dev Container Feature to Maintainer tooling (not yet published)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore(changelog): de-dupe within 0.11.0 (combine #722 Removed bullets, drop #820 Fixed pointer)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

panel-review Trigger the apm-review-panel gh-aw workflow

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Add apm marketplace generate command to pack all plugins and produce a marketplace.json

2 participants