Skip to content

feat!: one plugin, aplyca-adf, with a packaged install, and semantic versioning (decisions 0016, 0017) - #20

Merged
mauricios merged 6 commits into
mainfrom
docs/propose-0016-packaged-install
Oct 2, 2026
Merged

mauricios merged 6 commits into
mainfrom
docs/propose-0016-packaged-install

Conversation

@mauricios

@mauricios mauricios commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

What changed and why

Implements 0016, revised after review, and adds 0017. Breaking: the plugin aplyca-framework is renamed aplyca-adf, and the next release is v1.0.0.

One plugin, aplyca-adf (0016)

  • The installer moves in: /aplyca-adf:adopt, /aplyca-adf:upgrade, and /aplyca-adf:cost-report, under plugins/aplyca-adf/skills/, moved with git mv.
  • Next to them, for the packaged install: the 20 skills, 8 agents, 4 workflows, and hook scripts. They're generated from skeleton/.claude/ by scripts/build-aplyca-adf.sh, which rebuilds only the paths listed in .generated, and they're named under the plugin (/aplyca-adf:triage, @aplyca-adf:code-reviewer).
  • The marketplace lists one plugin.
  • In a committed project the copies step aside:
    • Hooks: _lib.sh makes a copy that isn't the project's own stand down unless CLAUDE.md's stamp says install: packaged. This is enforced in code, and tested: it acts in a packaged project, stands down in a committed one, and does nothing in a project without the framework.
    • Skills and agents open with "Step 0 — which copy": unless CLAUDE.md says "This project uses the packaged install", follow the committed file. In live tests, the agent skipped that step when both copies matched. So:
    • Every project pins its release: "ref": "vX.Y.Z" on the marketplace, equal to the stamp's release, committed projects included. The plugin's copies and the committed files are always one release, so a skill listed twice never runs a different version.
  • Switching installs is a recorded decision: when /aplyca-adf:upgrade switches a project between committed and packaged, the same pull request writes a PDR in the project. It covers why, what changes for the team, how to switch back, and the deciders, adds the index row, and marks PDR-0001 as amended. Switching back to committed keeps aplyca-adf on and pinned.
  • The rename: /aplyca-adf:upgrade replaces aplyca-framework@aplyca. The plugin README and the changelog give the uninstall commands.

Semantic versioning (0017)

  • The rules: MAJOR when an adopting team has to act, MINOR for additive or opt-in capabilities, PATCH for fixes.
  • Where it shows:
    • The changelog heading: ## vX.Y.Z — <date> — <title>.
    • The tag vX.Y.Z on the release PR's merge commit.
    • The plugin's "version", which changes only in a release. A static check holds it equal to the newest release.
    • The stamp, which keeps the commit for the diff: Skeleton source: v1.0.0 · <SHA> (<date>). Older stamps still work.
  • Upgrades move from release to release.

Joining an adopted project needs no install

  • The project's .claude/settings.json works like a package manifest. In the first session after a developer trusts the folder, Claude Code fetches the marketplace at the pinned release and loads aplyca-adf, because the marketplace lists it by a relative path.
  • The project's own docs/getting-started/DEV-SETUP.md says so. It's now merge-required in the upgrade taxonomy; it was unlisted, so upgrades skipped it.
  • The install prompt stops when the plugin's already on, instead of sending a joining developer to /aplyca-adf:upgrade. ADOPT.md asks before it treats an adopted project as an upgrade.
  • A packaged project's DEV-SETUP.md lists the key commands by their full names, written by /aplyca-adf:adopt and by the install switch.

Where it's documented

  • docs/SETUP.md: § Packaged install, and the stamp format.
  • docs/UPGRADING.md: the versioning convention, and the packaged scenario.
  • CONTRIBUTING.md: cutting a release, the generated paths.
  • Both READMEs, ADOPT.md, the skills catalog, SECURITY.md, the repo's CLAUDE.md, and the changelog.

Upgrade impact

  • Overwrite: .claude/hooks/_lib.sh.
  • Merge: CLAUDE.md's first line, for the stamp format; docs/getting-started/DEV-SETUP.md, for the joining paragraph.
  • Migration:
    1. Install aplyca-adf with the install prompt.
    2. Run /aplyca-adf:upgrade, which renames the setting and pins the release.
    3. Uninstall aplyca-framework.

How to verify

  1. ./evals/run-evals.sh. New and changed checks:
    • the generated paths match the skeleton (a copy of the plugin is rebuilt and diffed);
    • the marketplace lists only aplyca-adf;
    • the version is semver and matches the newest release;
    • the hooks act only where they should;
    • the rename migration is in /aplyca-adf:upgrade;
    • joining needs no install: DEV-SETUP.md, the install prompt, the packaged names.
  2. claude plugin validate plugins/aplyca-adf and claude plugin validate . both pass.

Verified / not verified

  • Verified:
    • Static suites: 153, 75, 45, and 11 pass.
    • Live sessions with the generated plugin, about $1.20 in all:
      • Packaged project: the plugin's guard blocks --no-verify.
      • Committed project: only the project's own guard blocks, and the plugin's copy stands down.
      • Joining with no install: a fresh plugin cache, a folder marked trusted in a throwaway config, and only the committed settings pinned to this branch. Claude Code fetched the marketplace and loaded aplyca-adf 1.0.0 with all 27 commands; no install record was written.
      • The handover step: followed when it said to read the file; skipped twice when it relied on the visible note with identical copies. That's why the release pin carries the guarantee.
  • Not verified:
    • A real v1.0.0 tag pinned by a project. The tag comes with the release.
    • A real /aplyca-adf:adopt or /aplyca-adf:upgrade in packaged mode, or migrating from aplyca-framework. The pilot is the test.
    • Claude Code's cloud sessions, which don't load the plugin.

Merge danger

Reversible: mostly. Reverting restores aplyca-framework, but projects that already switched would have to switch back.
Blast radius:

  • Every adopted project that turns on aplyca-framework@aplyca: its teammates lose /upgrade until the project switches. Today that's the pilot, whose #221 isn't merged and can switch first.
  • Committed projects: only the _lib.sh change, which behaves the same and is tested.

🤖 Generated with Claude Code

mauricios and others added 3 commits October 2, 2026 00:46
…ugin

A pilot's upgrade touched 82 files, mostly generic machinery no project
edits, and its team asked to use the framework like a package. Proposes
an opt-in packaged mode for Claude Code-only teams: the core skills,
agents, workflows, and hook scripts ship as the plugin aplyca-adf,
generated from skeleton/ and pinned per project to a release tag; the
project keeps committing its own layer and every module. Records a
spike's findings: prefixed names, bare names resolving for the model,
plugin hooks reading the project's config, branch and tag pins, the
per-user marketplace entry, trust, and cloud sessions. Status: proposed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on 0016)

Accepts 0016, amending 0009. A team that works in Claude Code only can
take the skills, agents, workflows, and hook scripts from a plugin
pinned to a release tag, and commit only its own layer and its
modules — about 40 fewer files. The committed install stays the
default.

- plugins/aplyca-adf, generated from skeleton/.claude by
  scripts/build-aplyca-adf.sh: 20 skills, 8 agents as flat files, 4
  workflows, the hook scripts and hooks.json. Names inside are the
  plugin's (/aplyca-adf:triage, @aplyca-adf:code-reviewer); no pinned
  version, so each release tag loads as its own. Listed in the
  marketplace.
- _lib.sh reads config.sh next to the scripts or, packaged, the
  project's .claude/hooks/config.sh through CLAUDE_PROJECT_DIR.
- /adopt asks committed or packaged; /upgrade bumps a packaged
  project's pin from release to release, skips the plugin's paths, and
  offers the switch either way.
- SETUP.md § Packaged install (settings, the names note for CLAUDE.md,
  the stamp, CI), UPGRADING.md, both READMEs, CONTRIBUTING (release
  tags, the build script), CLAUDE.md.
- Checks: the plugin matches the skeleton, the marketplace lists both
  plugins, aplyca-adf pins no version; hook tests for the packaged
  config lookup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… install

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mauricios mauricios changed the title docs: propose 0016 — a packaged install, the machinery as a pinned plugin (aplyca-adf) feat: the packaged install — the machinery as a pinned plugin, aplyca-adf (decision 0016) Oct 2, 2026
…6, 0017)

The installer aplyca-framework is renamed aplyca-adf and takes in the
packaged machinery: one plugin for both installs. Its skills are
/aplyca-adf:adopt, :upgrade, :cost-report, and in a packaged project
the framework's skills, agents, workflows, and hooks.

- In a committed project the plugin's copies step aside: its hooks
  stand down unless CLAUDE.md's stamp says install: packaged (_lib.sh,
  enforced in code), and its skills and agents open with a step that
  hands over to the committed files. Every project pins its release
  ("ref": "vX.Y.Z"), so the plugin's copies and the committed files
  are always one release.
- Semantic versioning from v1.0.0 (0017): MAJOR when a team has to act,
  MINOR additive or opt-in, PATCH fixes. vX.Y.Z tags, the plugin's
  version equal to the newest release (checked), and the stamp keeps
  the commit for the diff. Upgrades move from release to release.
- The build script rebuilds only the paths it lists in .generated; the
  installer skills, plugin.json, and README are hand-written.
- /aplyca-adf:upgrade migrates aplyca-framework@aplyca to the new name.
- Tests: the plugin's hooks act only in a packaged project and do
  nothing in one that hasn't adopted the framework.

BREAKING CHANGE: the plugin aplyca-framework is now aplyca-adf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mauricios mauricios changed the title feat: the packaged install — the machinery as a pinned plugin, aplyca-adf (decision 0016) feat!: one plugin, aplyca-adf, with a packaged install, and semantic versioning (decisions 0016, 0017) Oct 2, 2026
mauricios and others added 2 commits October 2, 2026 10:41
Switching between the committed and packaged installs changes how the
team works — the names they type, which tools and sessions get the
skills — so the switch now lands with a process decision record in the
same pull request: the next docs/process/NNNN from the template, its
index row, the deciders, and PDR-0001 marked as amended. Also fixes the
packaged → committed step: aplyca-adf stays on and pinned for upgrades.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The project's committed .claude/settings.json works like a package manifest:
in the first session after a developer trusts the folder, Claude Code fetches
the marketplace at the pinned release and loads aplyca-adf, with no install
command (tested on a fresh plugin cache).

- DEV-SETUP.md says so, and is merge-required in the upgrade taxonomy
- the install prompt stops when the project already turns the plugin on;
  ADOPT.md asks before treating an adopted project as an upgrade
- a packaged project's DEV-SETUP.md names the key commands in full
  (/adopt, the /upgrade install switch, SETUP.md)
- the plugin README's "For teams" shows the pinned entry and the no-install load

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mauricios
mauricios marked this pull request as ready for review October 2, 2026 22:58
@mauricios
mauricios merged commit 9958c51 into main Oct 2, 2026
1 check passed
@mauricios
mauricios deleted the docs/propose-0016-packaged-install branch October 2, 2026 22:58
mauricios added a commit that referenced this pull request Oct 2, 2026
…ersioning (#21)

* fix: the install refreshes a marketplace added before

A machine that added the aplyca marketplace before the rename keeps its
copy, which lists only aplyca-framework, and `marketplace add` leaves it
alone — so the install prompt failed with "Plugin aplyca-adf not found"
in every project adopted before it. The prompt, ADOPT.md, and the
documented commands run `claude plugin marketplace update aplyca` before
the install. Tested on a copy of the marketplace from 7383422.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: release v1.0.0 — one plugin, a packaged install, and semantic versioning

Turns Unreleased into v1.0.0, covering #17–#20 and the install fix, and
opens it with the order to upgrade in from 7383422: install aplyca-adf
with the prompt, run /aplyca-adf:upgrade (renames the setting, pins
v1.0.0, restamps), then uninstall aplyca-framework. plugin.json is
already 1.0.0, and the static check now matches it to the heading.

README's "Update a project" and UPGRADING point at releases: the target
is the newest tag, the stamp carries the version, and a project adopted
before v1.0.0 has its own scenario. The plugin README's update section
no longer tells those projects to update a plugin they never installed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant