A five-agent review of today's seven commits found no executable
regressions and no dangling references, but a set of documents still
asserting, in present tense, machinery that ADR-0024 and its commits
removed. This corrects them in place, keeping the original text as the
historical record wherever the repo's amendment convention applies.
LESSONS.md: the 2026-06-21 entry prescribed a `claude plugin validate`
sweep that now fails on every plugin, so it is marked superseded with
the surviving gates named. The 2026-08-09 entry gained a recurrence
note: today's manifest deletion broke apm's MCP propagation exactly as
that lesson describes, and its prescribed repo-local grep could not
have caught it, because `plugin_parser.py` ships in the apm toolchain
installed outside this repository.
ADR-0019, ADR-0011 and ADR-0021: amendments extended to passages the
earlier correction passes stepped over -- a dead native-consumer guard,
Consequences bullets still calling for a `plugins/gitea/.mcp.json` that
must not be recreated, and a drift-gate list naming a deleted script.
ADR-0021's list is down to one gate, not two: `apm audit --ci` never
read `description` and was never a drift gate.
architecture.md and enrichments.md: the self-containment constraint is
restated on its live source, the agentskills.io APM package-mode spec,
rather than on Claude Code's plugin cache-install, which ADR-0024
consequence 6 pins as a superseded rationale. releasing.md's pointer to
the deleted sync script is rewritten as history.
tests/run-bats.sh and scripts/lib/batch-run.sh: comment-only. The
`.claude/skills/` exclusion comment claimed a duplication that is not
live yet; apm does not strip `tests/`, and the deployed tree is empty
of them only because the lockfile still resolves the six dependencies
to a pre-ADR-0024 commit carrying the flat mirror. The exclusion is
correct but forward-looking, and now says so.
SIMPLIFICATION-AUDIT.md: reconciled against what the commits actually
did. Two closed findings recorded conclusions that ADR-0024 reversed
hours later; findings 1, 3, 31 and 35 carried prescriptions voided the
same day; finding 28 is now recorded as having moved backwards, with
docs/adr/ measured at +336 lines over the day. The section 1 headline
table is re-measured at a6434e0 and labelled with its basis. The
ADR-0012 contradiction between finding 2b and section 8 is resolved in
2b's favour after reading the ADR: only finding 24 is governed by it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBD
9.1 KiB
Gitea skill splits into deep modules under plugins/gitea/, replacing the flat plugins/bin/skills/gitea/
The gitea skill originated under kyberforge (b9c73cc), moved to plugins/bin/skills/gitea/
(4f603cd), and covers only 5 of gitea-mcp's ~15 tool domains (issues, labels, milestones, PRs,
branches) in one flat SKILL.md mixing routing logic with execution detail. Meanwhile
plugins/gitea/ already existed as a plugin scaffold holding comprehensive research docs (all 55
MCP tool schemas, code-derived from gitea-mcp source, at
plugins/gitea/docs/research/docs/gitea/) but empty skills/, agents/, and .mcp.json. This
ADR records the decisions from a grill-with-docs session on issue #6 that splits the flat skill
into deep modules and relocates it to plugins/gitea/.
Relocation. The new deep-module skill structure is built in plugins/gitea/, not
plugins/bin/, making the gitea plugin self-contained — bundling its own skills, agents, and MCP
config — matching this repo's Plugin glossary definition (the deployable unit that bundles skills,
agents, hooks, and MCP servers into a single installable directory) and mirroring the existing
plugins/git/ plugin's shape. The old flat skill stays at plugins/bin/skills/gitea/ untouched
for now, kept as a reference/fallback — not deleted in this pass; removal is a future cleanup once
the new structure is validated in practice.
Scope expansion. Coverage expands beyond the original 5 domains to 3 new domains verified
working with the current token scope (write:issue, write:repository) per
plugins/bin/skills/gitea/references/token-access.md: Files (get/create/update/delete file, dir
contents, repo tree), Commits (list/get), and Releases & Tags (full CRUD). Domains not added:
repo/org listing, user identity, notifications, and packages are blocked by token scope
(read:user, read:organization, read:notification, read:package); Actions/CI (list_runs and
secrets return 403, writes untested) and Wiki (404 on this repo, writes untested) are partially
broken or unverified. All are deferred to future issues once scope is expanded or the domain is
verified safe elsewhere.
Domain skill split. The flat skill becomes 6 domain skills plus a workflow orchestrator and an agent counterpart, composed per the Skill composition pattern:
gitea-issues— issues only (list/read/write/search); closes out 4 enrichments deferred from issue #6 comment #848 — milestone assignment on create, assignee on create (documented workaround sinceget_me/read:useris blocked), dependency-linking convention ("Depends on #N" in body, since gitea-mcp has no native dependency field) — and delegates label inference togitea-labels-milestones.gitea-labels-milestones— split out as its own shared skill since labels/milestones are cross-cutting (apply to both issues and PRs), rather than bundled undergitea-issues; owns the label inference guide (context-pattern → Kind//Priority//Status/* taxonomy mapping).gitea-prs— pull requests + reviews, composesgitea-labels-milestonesfor label/milestone application.gitea-branches— branches + commits bundled together (commits are read-only history within branches, a natural pairing).gitea-files— new domain.gitea-releases— releases + tags bundled together.gitea-workflow— thin human-facing orchestrator mirroringgit-workflow(plugins/git/skills/git-workflow/). Preserves the original flat skill's default no-args status view (composesgitea-issues+gitea-prs) and routes ambiguous requests to the right domain skill. Namedgitea-workflow, not baregitea, for naming consistency with the other 6 skills, despite breaking the old/giteainvocation muscle memory — an explicit accepted tradeoff.gitea-orchestrate(agent, not skill) — agent-facing deterministic counterpart mirroringgit-orchestrate, for multi-step composition when the caller is an agent rather than a human.
Reference-file signature sourcing. Each new skill's references/*.md restates verified MCP
call signatures cross-checked live via ToolSearch at authoring time, not copied from
api-reference.md, which could drift from the deployed MCP server version. This resolves issue #6
comment #849's root-cause question about the original type parameter bug, which happened
because the skill was authored from Gitea REST API docs instead of the actual MCP tool schema.
This is applied manually during this authoring pass; the kyberforge:skill-author meta-skill
itself is not changed — comment #849's "option 2" process fix is considered and explicitly
deferred as out of scope for this PR.
MCP config deferred. plugins/gitea/.mcp.json is deliberately left as an empty mcpServers
block — the real gitea-mcp server config continues to live in the user's ~/.claude.json rather
than being wired into the plugin manifest. This means the gitea plugin is not yet installable
standalone via claude plugin install gitea@holocron without manual MCP setup. A follow-up Gitea
issue tracks closing this gap.
Correction (2026-09-14): this gap is now closed by removal rather than by wiring. ADR-0024
made apm the only supported install path, so claude plugin install gitea@holocron is no longer
a route this repo supports, and the per-plugin manifests it needed are gone. Because apm reads a
plugin-root .mcp.json only on the marketplace-plugin code path, that file became unreadable;
every plugins/*/.mcp.json was deleted, including this one. A plugin that needs an MCP server
declares it in dependencies.mcp in its apm.yml — the supported mechanism, which this repo has
never used. The follow-up issue this paragraph anticipates is moot.
Research backfill. The existing research docs
(plugins/gitea/docs/research/docs/gitea/) are 100% code-derived from gitea-mcp source with zero
external/best-practice content (the original docs.gitea.com fetch timed out and was never
retried). Context7 has /websites/gitea (official docs mirror) and /git_gitea_com/gitea_tea (Tea
CLI) available now — backfilled via a parallel research pass before skill-authoring, so the
Provenance chain (source_keys → sources.md → research doc) has real external sources for
workflow/convention guidance, not just API mechanics.
Authoring route. All 8 artifacts (7 skills + 1 agent) are authored via kyberforge:forge, not
direct skill-author/agent-author calls, even though forge's own routing rule would normally
bypass itself here since the target artifact types are already known — chosen deliberately for
uniform audit/recheck coverage across every artifact.
Considered options
5-skill split, labels+milestones bundled under gitea-issues (rejected) — simpler, one fewer
skill, but re-buries label/milestone logic inside an issues-specific skill even though PRs need it
equally, forcing gitea-prs to either duplicate the guide or reach into gitea-issues'
references/ — breaking the self-contained skill boundary.
8-skill split, one skill per raw API domain, no bundling (rejected) — e.g. separate
gitea-commits and gitea-tags skills. Rejected as over-fragmentation: commits are read-only
history naturally scoped to branches, and tags are naturally scoped to releases, so bundling
avoids two near-empty skills each routing to a single tool family.
Consequences
-
plugins/gitea/gainsskills/gitea-issues/,skills/gitea-labels-milestones/,skills/gitea-prs/,skills/gitea-branches/,skills/gitea-files/,skills/gitea-releases/,skills/gitea-workflow/, andagents/gitea-orchestrate.md(+ Copilot counterpart), each with its ownreferences/and provenance records. -
plugins/gitea/.mcp.jsonstays an emptymcpServersblock until the follow-up issue wires in the real gitea-mcp server config; the plugin is not standalone-installable until then. -
plugins/bin/skills/gitea/remains in place, unreferenced by new work, until a future cleanup issue removes it once the new structure is validated in practice. -
Follow-up issues are needed for: the deferred domains (Actions/CI, Wiki, Notifications, Packages, User/Org), the
.mcp.jsonwiring gap, and the eventual removal ofplugins/bin/skills/gitea/.Correction (2026-09-14): the three bullets above are historical — do not act on them. The
.mcp.jsonhalf is closed by the correction in Decision:c96ca9cdeleted everyplugins/*/.mcp.json, including this plugin's, because apm reads that file only on the marketplace-plugin code path that ADR-0024 removed. Do not recreateplugins/gitea/.mcp.json— an MCP server a plugin needs is declared independencies.mcpin itsapm.yml. The standalone-installability caveat is moot for the same reason:claude plugin install gitea@holocronis not a supported route.plugins/bin/skills/gitea/no longer exists either —3a1305c(2026-07-23) removed it as superseded byplugins/gitea, the cleanup this bullet anticipated — so the "remains in place" claim and its follow-up are both spent. Only the deferred domains remain open. -
Future domain-plugin work in this repo can point to this ADR as the template for splitting an MCP-wrapping skill into deep modules.