feat(cli): introduce apm plugin init noun-verb surface#1370
Conversation
Adds 'apm plugin init' as the canonical scaffolding command for plugin
authors, completing the noun-verb namespace already established by
'apm marketplace <verb>'. The four supported repo shapes -- single-plugin,
aggregator, monorepo, hybrid -- emerge from composing these two verbs;
APM does not gate shapes behind a --shape flag.
Soft-deprecates 'apm init --plugin' and 'apm init --marketplace' (stderr
warning naming the replacement; legacy flags keep working through v0.15;
removal in v0.16). 'apm init' becomes consumer-first and prints a
'Next steps' panel teaching the noun-verb taxonomy.
Adds three producer docs pages (repo-shapes, releasing-from-any-ci,
versioning-strategies). The CI guidance is vendor-neutral: one portable
shell recipe wrapped in GitHub Actions, GitLab CI, Jenkins, and Azure
DevOps -- APM does not generate CI pipelines.
Verification:
* tests/integration/test_producer_journey.py -- 11 new tests covering
all four shapes + parity + deprecation contracts
* tests/unit/commands/test_plugin_init_command.py -- 7 new tests
* Full unit suite: 8613 passed
* Lint silent
Closes-part-of: #1348
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The docs added in the prior commit were authored directly from the design artifact, bypassing the doc-sync skill contract. Reverting so docs land through the proper orchestration. Code + tests + CHANGELOG kept; only docs/src/ pages reverted. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Docs sync advisoryVerdict: structural * Pages affected: 4 (1 new + 3 edits) * LLM calls: 11/15 * Took: ~6 min Important Docs land the PRODUCE promise cleanly with one redraft pass -- verb-first lede, no speculative future-verbs, no legacy in the teaching ramp. The technical substrate is solid (verifier confirms 6/7 claims, writer self-corrected the 1 refutation against the architect outline); the redraft below is editorial discipline at the lede plus one teaching-narrative leak. No companion docs PR will be opened automatically -- the Classifier verdictStructural (high confidence). The PR introduces a brand-new top-level CLI verb namespace ( Architect TOC delta
S7 verifier evidence
Patch 1 of 4 -- NEW page
|
| Flag | Description |
|---|---|
PROJECT_NAME |
Optional positional. If provided, scaffolds into a new subdirectory of that name; otherwise writes into the current directory. |
--yes, -y |
Skip interactive prompts and use auto-detected defaults. |
--target |
Comma-separated target list (e.g. copilot,claude,codex). Skips the target prompt and writes selections directly. |
--verbose, -v |
Show detailed output. |
Migration from apm init --plugin
If you've used apm init --plugin before, here's the move: run apm plugin init instead. The generated files are byte-for-byte identical.
The legacy apm init --plugin flag still works and still produces the same output, but prints a deprecation warning on stderr:
[!] Deprecation: 'apm init --plugin' is deprecated. Use 'apm plugin init' instead.
Legacy flag will be removed in v0.16.
Migrate at your convenience before v0.16.
Examples
Single-plugin repo
One repo, one plugin. Author publishes a git tag; consumers reference it as owner/repo@version.
mkdir my-skill && cd my-skill
apm plugin init --yes
git init && git add . && git commit -m "init"
git tag v0.1.0Aggregator repo
One repo that ships a marketplace and the plugins it indexes side-by-side. Useful when you want one place to govern a small fleet of related plugins.
mkdir agents-hub && cd agents-hub
apm marketplace init --yes
apm plugin init review-bot --yes
apm plugin init lint-bot --yesThe top-level apm.yml carries the marketplace authoring config; each plugin lives in its own subdirectory with its own plugin.json and apm.yml.
See also
apm marketplace-- author and publish marketplaces that index your plugins.
</details>
### Patch 2 of 4 -- IN-PLACE `docs/src/content/docs/reference/cli/init.md`
**Edit A: Description paragraph**
```diff
- Use `--plugin` to also scaffold `plugin.json` for a publishable
- plugin, or `--marketplace` to seed an authoring block for a
- marketplace.
+ The legacy `--plugin` and `--marketplace` flags (which scaffolded a
+ plugin or marketplace authoring block alongside `apm.yml`) are
+ deprecated and will be removed in v0.16; use [`apm plugin init`](../plugin/)
+ and [`apm marketplace init`](../marketplace/) instead.
Edit B: Options table --plugin row (prefix with **Deprecated (removed in v0.16).** Use [\apm plugin init`](../plugin/) instead.`)
Edit C: Options table --marketplace row (prefix with **Deprecated (removed in v0.16).** Use [\apm marketplace init`](../marketplace/) instead.`)
Edit D: NEW ## Deprecations subsection (insert between ## Behavior and ## Related)
## Deprecations
The `--plugin` and `--marketplace` flags are deprecated and will be
removed in **v0.16**. They remain functional during the deprecation
window; each invocation prints a one-line warning to stderr pointing
at the replacement command (`apm plugin init` or `apm marketplace
init`). Migrate to:
- [`apm plugin init`](../plugin/) -- replaces `apm init --plugin`.
- [`apm marketplace init`](../marketplace/) -- replaces
`apm init --marketplace`.Edit E: ## Related list + :::note[Next steps] aside (add apm plugin init and apm marketplace init bullets; describe the new Next steps panel printed after apm init succeeds)
Patch 3 of 4 -- IN-PLACE docs/src/content/docs/getting-started/first-package.md
- If you know up front that you want to ship a plugin, you can scaffold with
- `apm init --plugin team-skills`, which adds `plugin.json` next to `apm.yml`
- from day one. APM still gives you dependency management, the lockfile, and
- audit while you author; pack produces the plugin bundle when you ship.
+ If you know up front that you want to ship a plugin, you can scaffold with
+ `apm plugin init team-skills`, which adds `plugin.json` next to `apm.yml`
+ from day one. APM still gives you dependency management, the lockfile, and
+ audit while you author; pack produces the plugin bundle when you ship.Patch 4 of 4 -- IN-PLACE docs/src/content/docs/reference/manifest-schema.md
- Created automatically by `apm init --plugin`. Use [`apm install --dev`](../cli/install/) to add packages:
+ Created automatically by [`apm plugin init`](../cli/plugin/). Use [`apm install --dev`](../cli/install/) to add packages:Panel disagreement notes
- Editorial verdict: revise (9 tone findings, mostly about lede taxonomy and one legacy-flag leak into a teaching narrative). All findings folded into the redraft above.
- Growth verdict: ship. Flagged forward-link risk -- CDO decided
trim_to_repo_shapes(see "Open scope decisions" below). - CDO synthesis: revise-then-ship. Redraft is the patch set above; no second loop needed.
Open scope decisions for the maintainer
- Forward links trimmed. The architect's original
See alsoblock referenced 3 producer pages that don't exist in main yet (producer/repo-shapes,producer/releasing-from-any-ci,producer/versioning-strategies). CDO trimmed all 3 from the new page to avoid shipping broken links. Re-add them when those pages land via a follow-up doc-sync run. - Repo-shape vocabulary scoped down.
monorepoandhybridare removed from the new page untilproducer/repo-shapesexists to define them. The page documents onlysingle-pluginandaggregatortoday. - Companion PR not opened. Per the docs-sync skill contract, the companion docs PR fires only when this PR carries the
docs-sync-confirmlabel. Apply that label and re-run the workflow (or apply the patches manually) to land the docs.
Growth release-note angle (out of scope, for CEO triage)
This PR is a quiet positioning unlock disguised as a CLI ergonomics fix. One-line elevator pitch worth surfacing in the v0.15 release notes:
apm plugin initscaffolds a publishable AI plugin in one command -- the same waynpm initscaffolds a Node package.
Recommend the maintainer pass this to oss-growth for the release-note draft. Keep it out of the docs PR scope.
Generated by the docs-sync skill (advisory; does not gate merge). Re-run by re-applying the docs-sync label.
…l guides Wave 6 of #1348 producer-experience refresh. Four new pages and one refresh, drafted through the doc-sync persona panel (doc-writer + python-architect verification + editorial-owner + oss-growth-hacker) and synthesized by CDO. New pages: - producer/repo-shapes.md: single-plugin, aggregator, monorepo-hybrid - producer/releasing-from-any-ci.md: vendor-neutral release sequence (GitHub Actions, GitLab, Jenkins, Azure DevOps), with apm-action@v1 as a documented convenience wrapper - producer/versioning-strategies.md: lockstep / tag_pattern / per_package - consumer/installing-from-marketplaces.md: native runtime install table Refresh: - producer/publish-to-a-marketplace.md: trims duplicated CI prose, delegates to the new pages, keeps registry schema as the canonical reference Updates .apm/docs-index.yml with the four new entries. All CLI claims verified against the local apm binary (apm pack --check-versions / --check-clean / --json; apm plugin init; apm marketplace init; apm marketplace package add). ASCII-only. Refs #1348 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR introduces apm plugin init as a first-class noun-verb CLI surface for plugin author scaffolding, while keeping apm init --plugin/--marketplace working via a soft deprecation path. It also expands producer/consumer documentation and adds unit + integration coverage for the end-to-end producer journey across multiple repo layouts.
Changes:
- Added a new
apm plugincommand group withapm plugin init, delegating to shared init logic for parity with legacy flags. - Updated
apm initto emit deprecation warnings for--plugin/--marketplaceand to print consumer “Next steps” hints that point to the new noun namespaces. - Added unit + integration tests and new docs pages to document repo shapes, versioning/release gates, and marketplace installation paths.
Show a summary per file
| File | Description |
|---|---|
src/apm_cli/cli.py |
Registers the new plugin command group at the top-level CLI. |
src/apm_cli/commands/init.py |
Extracts shared init logic into _perform_init(), adds deprecation stderr warnings, and updates “Next steps” hints. |
src/apm_cli/commands/plugin/__init__.py |
New apm plugin noun namespace (Click group). |
src/apm_cli/commands/plugin/init.py |
New apm plugin init command delegating to _perform_init(plugin=True, source="plugin"). |
tests/unit/test_init_command.py |
Updates expectations for consumer init “Next steps” content. |
tests/unit/commands/test_plugin_init_command.py |
Adds unit tests for apm plugin init behavior and legacy-flag deprecation warnings. |
tests/integration/test_producer_journey.py |
Adds an end-to-end journey matrix covering multiple producer repo shapes and legacy/new parity. |
docs/src/content/docs/producer/repo-shapes.md |
New producer doc explaining supported repo layouts and the noun-verb composition. |
docs/src/content/docs/producer/releasing-from-any-ci.md |
New producer doc describing a portable CI release sequence using apm pack release gates. |
docs/src/content/docs/producer/versioning-strategies.md |
New producer doc describing marketplace.versioning.strategy and apm pack --check-versions. |
docs/src/content/docs/producer/publish-to-a-marketplace.md |
Refreshes and de-duplicates marketplace authoring docs; links out to the new pages. |
docs/src/content/docs/consumer/installing-from-marketplaces.md |
New consumer doc mapping install commands/auth/cache per runtime. |
.apm/docs-index.yml |
Adds new docs pages to the docs index/symbol map. |
CHANGELOG.md |
Adds Unreleased entries for the new CLI surface + docs and the deprecation notice. |
Copilot's findings
- Files reviewed: 14/14 changed files
- Comments generated: 3
| - `apm init --plugin` and `apm init --marketplace` are deprecated in favor of `apm plugin init` and `apm marketplace init`. The legacy flags still work; they print a one-line stderr warning naming the replacement and **will be removed in v0.16**. Existing scripts continue to function unchanged during the deprecation window. (#1348) | ||
|
|
||
| - Refactored duplicate code blocks across MCP client adapters and marketplace modules: extracted shared helpers `_apply_pypi_homebrew_generic_config`, `_apply_auth_and_headers_impl`, and `_resolve_env_vars_with_prompting` into `MCPClientAdapter` base class; extracted `iter_semver_tags` into `marketplace._shared`; fixed homebrew formula slash-stripping, `Authorization` header skip-only-when-injected logic, and CI-aware prompting guard (`CI`/`APM_E2E_TESTS` env vars now suppress interactive prompts). (#1360) | ||
| ### Changed: extracted shared helpers `_apply_pypi_homebrew_generic_config`, `_apply_auth_and_headers_impl`, and `_resolve_env_vars_with_prompting` into `MCPClientAdapter` base class; extracted `iter_semver_tags` into `marketplace._shared`; fixed homebrew formula slash-stripping, `Authorization` header skip-only-when-injected logic, and CI-aware prompting guard (`CI`/`APM_E2E_TESTS` env vars now suppress interactive prompts). (#1360) |
| @@ -0,0 +1,72 @@ | |||
| --- | |||
| title: Installing from marketplaces | |||
| description: Five ways consumers install APM-published plugins -- through APM, VS Code, Cursor, Copilot CLI, Claude Code, and Codex -- and the auth and cache layout of each. | |||
| --- | ||
| title: Repo shapes for marketplace producers | ||
| description: Three layouts for shipping APM plugins -- single-plugin, aggregator, and monorepo-hybrid -- and the noun-verb commands that scaffold each. | ||
| sidebar: | ||
| order: 5 | ||
| --- | ||
|
|
||
| A marketplace producer repo is just an `apm.yml` (or several) plus a | ||
| `marketplace:` block. There is no `--shape` flag and no scaffold | ||
| mode: every layout below emerges from the same two commands, | ||
| `apm plugin init` and `apm marketplace init`, composed differently. | ||
|
|
||
| Pick the shape that matches how the source code is already | ||
| organised. You can migrate later by moving directories and re-running | ||
| the same commands. | ||
|
|
||
| | Shape | Source files | When | | ||
| |------------------|---------------------------------------------------|-----------------------------------------------------| | ||
| | Single-plugin | One `apm.yml` at the repo root | One plugin per repo. Smallest surface, fewest gotchas. | | ||
| | Aggregator | One `apm.yml` at the root, N remote `packages:` | You curate other repos into a marketplace. | | ||
| | Monorepo-hybrid | Root `apm.yml` plus per-plugin `apm.yml` subdirs | Many plugins live alongside the marketplace in one repo. | | ||
|
|
Applies the four patches recommended by the docs-sync workflow advisory on PR #1370 (comment 4479394909): - NEW: docs/src/content/docs/reference/cli/plugin.md (sidebar.order=21) Noun page mirroring marketplace.md, hosting all apm plugin <verb> subcommands. Documents single-plugin and aggregator repo shapes by composing apm plugin init + apm marketplace init. - EDIT: docs/src/content/docs/reference/cli/init.md Deprecate --plugin and --marketplace flag rows; add Deprecations subsection; cross-link to new noun pages in Related. - EDIT: docs/src/content/docs/getting-started/first-package.md Swap 'apm init --plugin team-skills' -> 'apm plugin init team-skills'. - EDIT: docs/src/content/docs/reference/manifest-schema.md Update devDependencies callout cross-link to apm plugin init. - EDIT: .apm/docs-index.yml Add reference/cli/plugin.md to apm plugin init symbol_index. Patches verified by the doc-sync persona panel (S7 evidence: 6/7 claims verified, 1 self-corrected against the architect outline). ASCII-only. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- producer/index.md: name apm plugin init as scaffold entry; add 'two primitive postures + composition' framing; insert 'Production-grade releases' sidebar table linking the three Wave 6 operational pages; fix dead 'apm publish via a marketplace adapter' vocabulary to marketplace.outputs-aware wording. - producer/repo-shapes.md: reframe lead from 'three layouts' to 'two primitive postures plus a hybrid composition'; mark monorepo-hybrid section as advanced with zava-agent-configs as the canonical example. - getting-started/first-package.md: cross-link 'apm plugin init' to reference/cli/plugin and producer/repo-shapes so first-time authors discover the noun-verb command and pick a layout. Joint CDO + CEO recommendation: keep all three documented shapes (hybrid is real and tested), but frame as 2 primitives + 1 composition so cold-visitor cognitive load stays at 2 and the 5-rung happy path stays uncluttered. No README/MANIFESTO touch in this PR per CEO scope boundary. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CHANGELOG.md: fix malformed '### Changed: extracted helpers...' heading. Split into standalone '### Changed' heading + bullet underneath so Keep a Changelog auto-parsing works. - CHANGELOG.md: drop 'four supported repo shapes' claim that contradicts the just-shipped CDO+CEO framing. Replace with 'two primitive postures (single-plugin, aggregator) plus the hybrid composition' matching producer/index.md and repo-shapes.md. - installing-from-marketplaces.md: frontmatter description said 'Five ways' but the table lists six (APM, VS Code, Cursor, Copilot CLI, Claude Code, Codex). Fix to 'Six ways'. Closes inline review comments 3261253412, 3261253469, 3261253496. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: cut 0.14.0 Renames the [Unreleased] block in CHANGELOG.md to [0.14.0] - 2026-05-18 and bumps the package version from 0.13.0 to 0.14.0 in pyproject.toml (and uv.lock by regeneration). 0.14.0 ships the producer-experience epic (#1348) on the CLI side -- notably: - apm pack --check-versions / --check-clean (#1365), the release gates consumed by apm-action mode: release. - apm plugin init (#1370), the noun-verb successor to apm init --plugin. - apm pack multi-format outputs (--marketplace, --marketplace-path, --json, marketplace.outputs map form) (#1317). - New producer docs corpus (repo-shapes / releasing-from-any-ci / versioning-strategies) (#1370). - Breaking: MCP registry client adopts the official v0.1 spec; self- hosted registries must serve /v0.1/ paths (#1337). Plus the deprecations and fixes already listed in the moved block. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(changelog): tighten v0.14.0 entries; add post-cut PRs - One concise line per PR answering 'so what?' for end users - Add 5 missing entries: #1376 (perf resolver), #1373 (shared/apm.md matrix secret-stripping), #1246 (install.ps1 GHES env vars), #1255 (warn missing apm.yml), #1248 (extends:org unmanaged_files) - Drop internal/CI/test-infra entries (#1270, #1271, #1272, #1274, #1276, #1291, #1360 refactor) - Consolidate three #605 lines and four #1317 lines into one entry per PR where appropriate - Promote MCP Registry v0.1 to a dedicated Breaking section Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(changelog): add #1377 Bitbucket DC tilde fix Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Daniel Meppiel <copilot-rework@github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
feat(cli): introduce
apm plugin initnoun-verb surfaceTL;DR
Adds
apm plugin initas the canonical scaffolding command for plugin authors, completing the noun-verb namespace already established byapm marketplace <verb>. Soft-deprecatesapm init --pluginandapm init --marketplace(warning + replacement; legacy keeps working through v0.15; removal in v0.16). Ships three new vendor-neutral producer docs and an 11-test end-to-end matrix covering all four supported repo shapes. Closes the "init landscape confusion" UX gap surfaced in discussion #1322 and the producer-journey verification gap surfaced by the adversarial DevX review.Problem (WHY)
apm marketplaceis a full noun-verb namespace (add,remove,init,doctor), but plugin scaffolding lives on a--pluginflag of the consumer command. The shape of the surface tells producers "plugins are a side mode of init" -- they are not.release.shscaffolder) failed two principles: no package manager generates CI pipelines, and it would have cannibalizedapm-action. Both were correctly rejected by the user.pack's plugin emission path could break aggregator without breaking single-plugin, and CI would not notice.Approach (WHAT)
apm plugin init; deprecate--plugin/--marketplaceflagsapm init --shape=...(rejected: vendor-neutrality + mental model debt)apm initteaches both verbs--helpepilog only (rejected: invisible to new users)release.ymlper CI (rejected: not vendor-neutral; cannibalizes apm-action)tests/integration/test_producer_journey.py, 11 tests across 4 shapes + parity + deprecationImplementation (HOW)
src/apm_cli/commands/plugin/__init__.py(new)src/apm_cli/commands/plugin/init.py(new)apm plugin init-- thin wrapper delegating to_perform_init(plugin=True, source="plugin")src/apm_cli/commands/init.py_perform_init(); added stderr deprecation echoes for--plugin/--marketplace; branched "Next steps" onsourceso consumer init teaches the noun-verb namespacesrc/apm_cli/cli.pyplugingrouptests/unit/commands/test_plugin_init_command.py(new)tests/integration/test_producer_journey.py(new)docs/src/content/docs/producer/repo-shapes.md(new)docs/src/content/docs/producer/releasing-from-any-ci.md(new)docs/src/content/docs/producer/versioning-strategies.md(new)--check-versionsenforces alignmentdocs/src/content/docs/consumer/installing-from-marketplaces.md(new)docs/src/content/docs/producer/publish-to-a-marketplace.md.apm/docs-index.ymlCHANGELOG.mdDiagrams
The producer-surface command graph. Boxed nodes are NEW.
flowchart LR user((Producer)) user --> initc[apm init<br/>consumer] user --> pinit[apm plugin init]:::new user --> minit[apm marketplace init] initc -.deprecated.-> legacy_p[apm init --plugin]:::deprecated initc -.deprecated.-> legacy_m[apm init --marketplace] legacy_p -.redirects.-> pinit legacy_m -.redirects.-> minit pinit --> plugin_json[plugin.json + apm.yml] minit --> mkt_block[marketplace block in apm.yml] classDef new fill:#d4edda,stroke:#28a745,stroke-width:2px classDef deprecated fill:#fff3cd,stroke:#856404,stroke-dasharray:5The four repo shapes that emerge from composing the two verbs. None require a
--shapeflag.flowchart TB subgraph Shapes s1[single-plugin<br/>apm plugin init] s2[aggregator<br/>apm init + apm marketplace init] s3[monorepo<br/>aggregator + per-package apm plugin init] s4[hybrid<br/>apm plugin init + apm marketplace init] end s1 --> pack[apm pack] s2 --> pack s3 --> pack s4 --> pack pack --> bundle[build/]The e2e matrix and what each test proves.
flowchart LR A[Wave 7 matrix] --> B[single-plugin<br/>3 tests] A --> C[aggregator<br/>2 tests incl. legacy flag] A --> D[monorepo<br/>1 test: 2 packages] A --> E[hybrid<br/>1 test] A --> F[parity<br/>byte-equivalence new vs legacy] A --> G[deprecation contract<br/>2 tests: --plugin / --marketplace]Trade-offs
apm plugin initandapm init --pluginwork. The deprecation echo nudges migration; legacy removal is locked to v0.16. The alternative -- hard-removing in this PR -- would break every existing user.release.ymlgenerator and reduce producer effort to zero on day one. Rejected because (a) no canonical package manager generates CI pipelines, (b) it would compete withapm-action, and (c) it locks us to one vendor's syntax. The portable shell recipe wins on neutrality and longevity.apm init --lib --workspace(npm/cargo-style). Tempting because it matches a familiar mental model, but it would force a breaking rename of the existingmarketplacenoun namespace and force every monorepo user to migrate. The noun-verb composition reaches the same destination at zero migration cost.Benefits
apm <noun> <verb>works the same way forpluginandmarketplace, so the two halves of the producer surface no longer disagree about their own shape.--plugin/--marketplaceinvocations keep working through v0.15.initorpackthat breaks one shape fails CI in <5 seconds.Companion PRs
mode: releaseto the action, the GitHub-Actions-flavoured convenience wrapper that the newreleasing-from-any-ci.mdpage documents alongside equally-weighted GitLab / Jenkins / Azure DevOps recipes.Validation
Local validation transcript (lint + targeted tests + journey matrix)
Scenario Evidence
test_init_produces_plugin_json_and_apm_ymltest_init_two_packages_under_monorepo--pluginscript keeps working"test_new_surface_matches_legacy_flag_byte_for_bytetest_apm_init_consumer_surfaces_namespace_hintstest_init_plugin_flag_warning_shape,test_init_marketplace_flag_warning_shapeHow to test
git fetch && git checkout danielmeppiel/wave-3-portable-release-pipelineuv run --extra dev pytest tests/integration/test_producer_journey.py -v-- 11 greenapm plugin init demo --yesthen inspectdemo/plugin.jsonanddemo/apm.ymlapm init demo --plugin --yesand confirm the stderr deprecation message namesapm plugin initandv0.16apm init demo --yesand confirm the "Next steps" panel surfaces bothapm plugin initandapm marketplace initproducer/repo-shapes,producer/releasing-from-any-ci,producer/versioning-strategies,consumer/installing-from-marketplaces) and confirm the refreshedproducer/publish-to-a-marketplaceno longer duplicates their contentCo-authored-by: Copilot 223556219+Copilot@users.noreply.github.com