Adoption & setup
September 13, 2026 · View on GitHub
title: Adoption & setup status: stable kind: feature mode: infra source: > README.md § How adoption works / Adopting the framework / Maintenance. Implemented by the setup family (setup and siblings) and the snapshot + agentic-override model. acceptance:
- The default install a fresh adopter is offered is the marketplace plugin; the snapshot install below is proposed only where a marketplace cannot reach (no plugin mechanism, signed artefact needed, committed pin wanted).
- Installing and adopting are separate acts and are never conflated.
An install touches only the invoking user's agent and writes nothing
to the repo; it never proposes a repo-side artefact, on any harness,
and a declined-or-absent repo side is a finished install. Adoption is
the maintainer act of committing the repo's recommended default
plugin set and its overrides store for every contributor, reached
only through
setup adoptand only on an explicit decision. - A repo's committed default set is a floor, never a ceiling: it does not limit what a contributor may install, and using Magpie on a repo that has not adopted it is a first-class path, not a degraded one.
- On the pinned-snapshot fallback, an adopter commits exactly one skill (setup); everything else is a gitignored snapshot plus committed override + lock files. On the default marketplace install, nothing is committed to the repo at all.
- The committed lock records the install method, and what it records is
method-dependent. On the three snapshot methods it is a pin — URL + ref —
so a fresh clone re-installs the same framework version. On
method: marketplaceit is a floor, not a pin: URL,min_versionand a plugin list, with noref, and a fresh clone is brought up to that minimum and never held down to it. - Drift between the committed pin and the local install is detected and surfaced with an upgrade proposal.
- A gitignored
.apache-magpie-local/supplies per-person overrides that layer above the committed.apache-magpie-overrides/, cannot weaken the safety baseline, and can be ignored for a single run via a one-shot default switch. - A marketplace install never writes the committed default-set block or
scaffolds
.apache-magpie-overrides/, and never offers to: those are adoption, reached only throughsetup adopt. The install recap names/magpie-setup adoptonce, and only when the user asks or says something that means it. - A marketplace install that wrote nothing to the repo is a complete install; neither the recap nor verify describes the result as incomplete or partial.
- The default-set floor is seeded with three plugins and never grows
automatically — not to match which other families this maintainer
installed, and never to include a maintainer-only family. It is enlarged
only when the maintainer explicitly asks, and every surface that reads
it — the derived wiring, verify, uninstall, unadopt — reads the lock's
pluginslist in floor order rather than a fixed count. - Writing the committed default-set block touches only
extraKnownMarketplacesandenabledPluginsin.claude/settings.json, preserves every other top-level key and an existingapache-magpiemarketplace definition, adds only the floor members missing from an existingenabledPluginsand removes nothing, creates the file with just those two keys when it is absent, refuses to rewrite a settings file that does not parse, and stages only the file it wrote — never commits it. - verify reports an absent committed default-set block through the
non-fault glyph with an empty
missinglist, reports every floor member present as current and equally non-faulting, reports some-but-not-all floor members present as stale, the one fault this check raises, naming the missing members in floor order with a repair offer, and gives an entry naming a plugin the marketplace no longer ships the same drift treatment. - uninstall removes only the floor entries named by the lock's
pluginslist fromenabledPluginsand theapache-magpieentry fromextraKnownMarketplaces, keeps every other plugin and marketplace entry untouched, drops either key left empty by the removal, and never deletes.claude/settings.json— nor.apache-magpie.lock, which only unadopt removes. - docs/quick-start.md and docs/setup/marketplace.md both state that the committed default-set block is optional and not a prerequisite to using the plugins in the repo.
Adoption & setup
What it does
Gets the framework in front of an adopter and keeps it current. The
default install is the marketplace plugin
(marketplace-distribution.md) — per machine,
nothing in the repo. This surface is the fallback and the repo-side half:
a snapshot + agentic-override model — one committed bootstrap skill, a
gitignored framework snapshot (a build artefact, never committed),
gitignored skill symlinks, and committed agent-readable override files —
for agents with no plugin mechanism, adopters who need the signed ASF source
artefact, and projects that want every contributor and CI job pinned to one
committed version with drift detection.
Where it lives
- Skill:
setup(install, adopt/unadopt, verify, upgrade, override). - Skills:
setup-isolated-setup-install/-update/-verify/-doctor(the sandbox harness;-doctorprobes live restrictions — SSH agent / Yubikey reachability, localhost port binding, filesystem restrictions),setup-override-upstream(promote a stabilised override into a framework PR),setup-shared-config-sync. - Skill:
setup-status— renders a Markdown adoption dashboard: install method and pin, drift between local and committed locks, which skills are wired in the current repo. - Docs:
docs/setup/(install recipes, agentic-overrides contract, prerequisites). - Lock files:
.apache-magpie.lock(committed — a pin on the snapshot methods, a floor onmethod: marketplace) and.apache-magpie.local.lock(gitignored, what this machine fetched).
Behaviour & contract
- Marketplace first.
setup installwith nomethod:proposes the marketplace install and prints the running agent's exact commands; it proposes the snapshot only for a stated reason (no plugin mechanism, signed artefact, committed pin, or the framework checkout itself). Both installs live on one machine at once is a supported repo state but a double-load for that machine — the skill surfaces it rather than stacking them silently. - One committed skill, no submodules, no vendored framework copies.
The snapshot lives in a gitignored
.apache-magpie/. .agents/skills/is the canonical home for framework-skill symlinks (the path shared by Codex, Cursor, Gemini CLI, Copilot, …); every other agent dir (.claude/skills/,.github/skills/, holdouts) gets per-skill relay symlinks into it. This is uniform — there is no per-project skills-dir convention to detect.- Committed lock is the source of truth. A fresh contributor runs
/magpie-setupand re-installs to the project's pinned version on the snapshot methods, or is brought up to its floor onmethod: marketplace. - Drift detection at the top of every framework skill: if the
gitignored local lock has drifted from the committed pin, the skill
proposes
/magpie-setup upgrade. - Overrides are agent-readable Markdown under
.apache-magpie-overrides/, consulted at runtime and merged before default behaviour ([pairing/correctability is the model]). - Overrides are additive, never authority inversion. An override may supply adopter-specific process details, paths, labels, or wording, but it must not replace or weaken the framework's safety, confidentiality, privacy, or external-content-as-data baseline. If an override conflicts with those baseline rules, the framework rule wins and the conflict is surfaced.
- Personal, gitignored overrides live under
.apache-magpie-local/, a per-person sibling to the committed.apache-magpie-overrides/that is never committed. It is read at runtime under the same additive-only guardrail as any override: it may carry a person's paths, wording, or capability/MCP enablement (for example a release manager enabling a Policy MCP that other members leave off), but it cannot weaken the safety, confidentiality, or privacy baseline. Precedence, first hit wins:.apache-magpie-local/->.apache-magpie-overrides/-> organization defaults -> framework default. Adoption scaffolds the overrides store; the.gitignoreentry for the personal directory is the user's to add, wherever they prefer it, so the directory stays untracked. This is the surface that makes hybrid setups work: one person can run Magpie against a shared or non-adopting repo without committing anything or requiring teammates to opt in. - One-shot default run. A per-invocation switch runs a skill against
framework defaults for that session only, ignoring both
.apache-magpie-local/and.apache-magpie-overrides/, without editing or removing either file. The safety baseline still applies. - Adoption records a floor, not a pin. On the marketplace path,
adoptwrites.apache-magpie.lockwithmethod: marketplace, amin_versionequal to the version installed at adopt time, and a plugin list seeded with the framework's three. Both are minimums: contributors may run newer versions and more plugins, and nothing is ever downgraded, removed, or pinned. The derivedextraKnownMarketplacesentry is written untagged. - The lock is harness-neutral; the wiring is not. The lock is
written on every client.
.claude/settings.jsonis derived from it and written only where the harness can express it. - Every skill's pre-flight brings the machine up to the floor and
then stops for a restart, and does so without asking only when the
lock's
urlisapache/magpie. upgradesplits on adoption: nothing repo-side when the project has not adopted;min_versionraised — never lowered — and staged when it has.
Out of scope
- The runtime behaviour of the modes themselves.
- Editing the adopter's
.claude/settings.jsonbeyond what the install recipe declares.
Acceptance criteria
- A fresh
setup installproposes the marketplace path first, names the agent's commands, and reaches the snapshot flow only with a stated reason. - Adoption commits only the bootstrap skill + lock/override scaffold.
- The committed lock re-installs the same version on a fresh clone on the
snapshot methods, and on
method: marketplacebrings a fresh clone up to the recorded floor without capping it there. - Drift between local and committed locks is surfaced with an upgrade.
- Override files can be discovered and surfaced to skills without editing upstream skill bodies, and override text cannot weaken the safety/confidentiality baseline.
- A gitignored
.apache-magpie-local/is read as a per-person override surface that layers above.apache-magpie-overrides/(personal-local -> committed -> organization -> framework default, first hit wins), under the same additive-only guardrail, and works on a repo that has not adopted Magpie once its.gitignoreline is present. - A one-shot switch runs a skill against framework defaults for a single session, ignoring both override surfaces without deleting them, and the safety baseline still applies.
adopton a marketplace install writes amethod: marketplacelock carrying the installed version and the seeded floor, stages it, and commits nothing; the derived marketplace entry carries no version tag.- A pre-flight on a machine at or ahead of the floor prints nothing; one below it installs or updates only floor plugins, reports what ran, and stops for a restart without removing, downgrading or pinning anything.
- A pre-flight whose lock names a
urlother thanapache/magpieruns nothing and asks first. - Version comparison is PEP 440:
0.10.0satisfies a0.9.0floor, and0.2.0satisfies a0.2.0.dev202609110041floor. upgradewrites nothing to the repo when the project has not adopted, and raises — never lowers —min_versionwhen it has.verifyreports a missing lock and an ahead-of-floor machine as not faults, and a shortfall as one.unadoptremoves the lock;uninstallleaves it; each says which.
Validation
test -f docs/setup/README.md
uv run --project tools/skill-and-tool-validator --group dev skill-and-tool-validate
Known gaps
-
Marketplace distribution is a sibling surface, specified separately in
marketplace-distribution.md. It is the default way an adopter takes the framework; the snapshot install described here is the fallback. The skills delivered are the same tree either way — only the namespace of their invocation differs. -
stable; gaps appear as new agent targets to add to the registry (agents.md) or new override surfaces — recorded by the plan pass. -
Not yet built: the
.apache-magpie-local/personal override surface (acceptance 5) and the one-shot default-run switch (acceptance 6). Both are intended behaviour recorded here and tracked as work itemsmagpie-local-conventionandoverride-bypass-one-shotin the plan. The three hybrid-setup how-tos that build on the local surface are tracked alongside them.