From bedbd1d872fd7ad5ec60278d86e254927619452c Mon Sep 17 00:00:00 2001 From: Defame1297 Date: Sun, 30 Aug 2026 12:42:04 +0000 Subject: [PATCH] refactor(gitea-workflow): retrofit to the ADR-0020 context contract Description 1012 -> 347 chars, body 582 -> 170 words, Gotchas 3 entries -> 1 at 22.9% of body. Clears the description FAIL and all four Vale CompositionNote errors -- the last carriers in the corpus, so that rule now fires nowhere. Cut the 'human-facing entry point and router' architecture note, the /gitea migration history and the six-skill composition list; all were already in the README or the routing table. Split three mutually exclusive flows into a dispatch table keyed on invocation shape, each branch self-contained in references/: status-checkin.md, number-resolution.md, skill-index.md. Report stays in the body as the gate common to every branch; each branch's own format moved to its file. The old Step 1-4 numbering presented three alternatives as a sequence. The description grew from an intermediate 283 chars on purpose: that draft had dropped flow 3's trigger entirely, leaving the domain-routing index -- a third of the skill -- reachable only through a tail clause whose grammatical subject was the request rather than the skill. Both gates were green over that. Boundary clauses are one arrow per target, so both resolve (#107: the resolver extracts only the first target per clause and reports 1 of 1 on a clause naming two). The local-git exclusion keeps its wording but drops the route to git-workflow, which would not resolve in a gitea-only install. Known residual: the dispatch conditions are stated twice, as a table and as literal conditionals. That is #109 -- body-discipline.md mandates the literal form while the ADR's cited exemplar, apm-workflow, uses a bare table plus one summary line. Fixing it here would settle that contradiction in a skill rather than in the spec, so it rides with #109. Refs #99, #107, #109 --- .../.apm/skills/gitea-workflow/README.md | 7 +- .../gitea/.apm/skills/gitea-workflow/SKILL.md | 66 +++++-------------- .../references/number-resolution.md | 19 ++++++ .../gitea-workflow/references/skill-index.md | 22 +++++++ .../gitea-workflow/references/sources.md | 8 +-- .../references/status-checkin.md | 15 +++++ 6 files changed, 83 insertions(+), 54 deletions(-) create mode 100644 plugins/gitea/.apm/skills/gitea-workflow/references/number-resolution.md create mode 100644 plugins/gitea/.apm/skills/gitea-workflow/references/skill-index.md create mode 100644 plugins/gitea/.apm/skills/gitea-workflow/references/status-checkin.md diff --git a/plugins/gitea/.apm/skills/gitea-workflow/README.md b/plugins/gitea/.apm/skills/gitea-workflow/README.md index 4c81d20..02ebd19 100644 --- a/plugins/gitea/.apm/skills/gitea-workflow/README.md +++ b/plugins/gitea/.apm/skills/gitea-workflow/README.md @@ -4,7 +4,7 @@ Human-facing entry point and router for the Gitea integration. ## What it does -This skill is the conversational front door to the Gitea suite — it replaces the old flat `/gitea` skill. On its own it never calls a Gitea MCP tool; it composes the six domain skills (`gitea-issues`, `gitea-labels-milestones`, `gitea-prs`, `gitea-branches`, `gitea-files`, `gitea-releases`). It handles the no-args status check-in (open issues + open PRs), resolves ambiguous issue-or-PR numbers before dispatching (issues and PRs share one number space), and points a user or agent to the right domain skill when it's unclear which one applies. +This skill is the conversational front door to the Gitea suite — it replaces the old flat `/gitea` skill. On its own it never calls a Gitea MCP tool; it composes the six domain skills (`gitea-issues`, `gitea-labels-milestones`, `gitea-prs`, `gitea-branches`, `gitea-files`, `gitea-releases`). It handles the no-args status check-in (open issues + open PRs), which preserves the original flat `/gitea` skill's default behavior; resolves ambiguous issue-or-PR numbers before dispatching (issues and PRs share one number space); and points a user or agent to the right domain skill when it's unclear which one applies. ## Usage @@ -18,5 +18,8 @@ Invoke with no arguments for a status check-in, with a bare number to resolve an | File | Purpose | |------|---------| -| `SKILL.md` | Skill instructions for agents — Gotchas, status view, ambiguous-number resolution, and the domain-skill index | +| `SKILL.md` | Skill instructions for agents — Gotchas, the dispatch table keyed on invocation shape, and the common report gate every branch ends in — each branch's own format lives with its reference file | +| `references/status-checkin.md` | Loaded when the skill is invoked with no specific request — the two parallel open-issue/open-PR reads and the two-section report | +| `references/number-resolution.md` | Loaded when the request carries a bare number that says neither "issue" nor "PR" — the `is_pull` resolution call and the hidden-permission-error 404 | +| `references/skill-index.md` | Loaded when the request names a capability but not which skill owns it — the six-skill routing index | | `references/sources.md` | Research sources backing the routing/status guidance | diff --git a/plugins/gitea/.apm/skills/gitea-workflow/SKILL.md b/plugins/gitea/.apm/skills/gitea-workflow/SKILL.md index 92b7a6e..eeee87b 100644 --- a/plugins/gitea/.apm/skills/gitea-workflow/SKILL.md +++ b/plugins/gitea/.apm/skills/gitea-workflow/SKILL.md @@ -2,25 +2,17 @@ name: gitea-workflow description: > - Use when a human wants a general or ambiguous Gitea status check or isn't sure which Gitea - domain skill applies — a no-args check-in ("what's going on in the repo", "any updates?"), - a bare-numbered reference that could be an issue or a PR ("what's the status of #42", "what's - happening with #17"), or a request to discover which Gitea capability handles a task. This is - the human-facing entry point and router for the Gitea integration — it replaces the old flat - `/gitea` invocation (now `/gitea-workflow`) and composes the six domain skills - (`gitea-issues`, `gitea-labels-milestones`, `gitea-prs`, `gitea-branches`, `gitea-files`, - `gitea-releases`) rather than calling any Gitea MCP tool directly. Do not use this skill when - the domain is already known and unambiguous — invoke the matching domain skill directly instead - (e.g. "create an issue" → `gitea-issues`, "merge PR #10" → `gitea-prs`, "cut a release" → - `gitea-releases`). Do not use for local git operations with no Gitea component (use - `git-workflow`). + Use when a Gitea request is general or ambiguous — a no-args repo check-in, a bare number that + could be an issue or a PR, or a capability whose owning skill is unclear. Resolves which + domain skill applies. Not an unambiguous issue request -> `gitea-issues`. Not an + unambiguous PR request -> `gitea-prs`. Not local git work with no Gitea component. compatibility: Requires Gitea MCP server configured with a token; delegates all calls to the six domain skills, which in turn require write:issue and write:repository scopes at minimum. metadata: category: integration - version: "0.1.0" + version: "0.1.3" source_keys: - gitea-mcp-repo - gitea-mcp-slim-go @@ -29,46 +21,24 @@ metadata: ## Gotchas -- **This skill never calls a Gitea MCP tool itself.** Every read or write goes through one of the six domain skills. If a request needs a raw `mcp__gitea__*` call that no domain skill exposes, that's a gap in a domain skill, not something to patch here. -- **Issues and PRs share one number space** — a bare number like `#42` could be either. Never guess from context clues alone; resolve it with a real call (see Step 2) before dispatching. -- **A 404 on the resolution call doesn't necessarily mean the number doesn't exist.** Gitea hides permission errors as not-found (documented in `gitea-issues`' Gotchas). If resolution 404s unexpectedly, say so and suggest checking token scope rather than reporting "no such issue or PR." +- **This skill never calls a Gitea MCP tool itself.** Every read and write goes through a domain skill. A needed `mcp__gitea__*` call that no domain skill exposes is a gap in that skill, not something to patch here. -## Step 1 — Default status view (no args) +## Dispatch -When invoked with no specific request, give a status check-in: +The invocation's shape selects exactly one branch. -1. Invoke `gitea-issues` to list open issues (`state: "open"`). -2. Invoke `gitea-prs` to list open PRs (`state: "open"`). -3. Run both in parallel — they're independent reads. -4. Report as two sections, "Open Issues" and "Open Pull Requests", each as a compact list (number, title). This preserves the original flat `/gitea` skill's default behavior. +| Invocation shape | Flow | Reference | +|---|---|---| +| No arguments, no specific request | Repo status check-in | `references/status-checkin.md` | +| A bare number, with neither "issue" nor "PR" said | Resolve which domain the number belongs to | `references/number-resolution.md` | +| A named capability whose owning skill is unclear | Route to the domain skill that owns it | `references/skill-index.md` | -## Step 2 — Resolve an ambiguous number +If the invocation carries no specific request, read `references/status-checkin.md`. -When the user references a bare number without saying "issue" or "PR" (e.g. "what's going on with #42"): +If the request references a bare number and never says "issue" or "PR", read `references/number-resolution.md`. -1. Invoke `gitea-issues` to run `issue_read method: "get"` on that number. -2. Check the response's `is_pull` field: - - `true` → it's a PR. Invoke `gitea-prs` for full PR detail (status, diff, reviews as appropriate to the request) and present that instead. - - `false` or absent → it's an issue. Present the issue detail already retrieved. -3. If the resolution call 404s, don't conclude the number doesn't exist — report the 404 and suggest verifying token scope (`write:issue`) per `gitea-issues`' Gotchas, since permission errors are hidden as not-found in Gitea. +If the request names a capability but not which skill owns it, read `references/skill-index.md`. -Never dispatch to `gitea-issues` or `gitea-prs` based on guessing from phrasing alone ("that sounds like a bug" is not evidence) — always resolve first. +## Report -## Step 3 — Route explicit but domain-unclear requests - -For requests that name a capability but not obviously which skill owns it, use this index: - -| Skill | Covers | -|---|---| -| `gitea-issues` | List/read/create/update issues, comments, search across issues and PRs. Composes `gitea-labels-milestones` for label/milestone resolution. | -| `gitea-labels-milestones` | Label and milestone CRUD, label inference from conversation context, resolving names/titles to the numeric IDs writes require. Cross-cutting — used by both `gitea-issues` and `gitea-prs`. | -| `gitea-prs` | List/read/create/update/merge PRs, code reviews. Composes `gitea-labels-milestones` the same way `gitea-issues` does. | -| `gitea-branches` | Branch list/create/delete, plus commit history (list commits, get a single commit by SHA). | -| `gitea-files` | Read/write/delete individual files, list a directory, walk the full repo tree. | -| `gitea-releases` | Release and tag CRUD — draft/prerelease flags, release notes, semver tags. | - -If a request clearly names one of these (e.g. "create a milestone" → `gitea-labels-milestones`, "read this file from the repo" → `gitea-files`), invoke that skill directly rather than routing through here. Use this table only when the user or an upstream agent is unsure which skill applies. - -## Step 4 — Report - -Present results in plain language. For the status view, two labeled sections. For a resolved ambiguous number, say which domain it turned out to be before showing detail ("That's a pull request:" / "That's an issue:"). For routing, name the skill and hand off — don't duplicate its output format, let it report. +Every branch ends here. Present results in plain language; the branch's reference file carries its format. diff --git a/plugins/gitea/.apm/skills/gitea-workflow/references/number-resolution.md b/plugins/gitea/.apm/skills/gitea-workflow/references/number-resolution.md new file mode 100644 index 0000000..280d567 --- /dev/null +++ b/plugins/gitea/.apm/skills/gitea-workflow/references/number-resolution.md @@ -0,0 +1,19 @@ +--- +topic: number-resolution +source_keys: + - gitea-mcp-repo + - gitea-mcp-slim-go + - context7-websites-gitea +--- + +# Resolving a bare issue-or-PR number + +The user has referenced a bare number without saying "issue" or "PR" (e.g. "what's going on with #42"). Resolve it with a real call — never dispatch to `gitea-issues` or `gitea-prs` by guessing from phrasing alone, because "that sounds like a bug" is not evidence and the two domains share one number space. + +1. Invoke `gitea-issues` to run `issue_read method: "get"` on that number. +2. Check the response's `is_pull` field: + - `true` → it's a PR. Invoke `gitea-prs` for full PR detail (status, diff, reviews as appropriate to the request) and present that instead. + - `false` or absent → it's an issue. Present the issue detail already retrieved. +3. If the resolution call 404s, don't conclude the number doesn't exist. Gitea hides permission errors as not-found (documented in `gitea-issues`' Gotchas), so report the 404 and suggest verifying the token carries `write:issue` rather than reporting "no such issue or PR." + +Then report per `SKILL.md`'s Report section, saying which domain the number turned out to be before showing detail ("That's a pull request:" / "That's an issue:") — otherwise the user cannot tell the resolution happened. diff --git a/plugins/gitea/.apm/skills/gitea-workflow/references/skill-index.md b/plugins/gitea/.apm/skills/gitea-workflow/references/skill-index.md new file mode 100644 index 0000000..e556e75 --- /dev/null +++ b/plugins/gitea/.apm/skills/gitea-workflow/references/skill-index.md @@ -0,0 +1,22 @@ +--- +topic: skill-index +source_keys: + - gitea-mcp-repo +--- + +# Domain-skill index + +The request names a capability but not obviously which skill owns it. Find the owner here, then invoke it: + +| Skill | Covers | +|---|---| +| `gitea-issues` | List/read/create/update issues, comments, search across issues and PRs. Composes `gitea-labels-milestones` for label/milestone resolution. | +| `gitea-labels-milestones` | Label and milestone CRUD, label inference from conversation context, resolving names/titles to the numeric IDs writes require. Cross-cutting — used by both `gitea-issues` and `gitea-prs`. | +| `gitea-prs` | List/read/create/update/merge PRs, code reviews. Composes `gitea-labels-milestones` the same way `gitea-issues` does. | +| `gitea-branches` | Branch list/create/delete, plus commit history (list commits, get a single commit by SHA). | +| `gitea-files` | Read/write/delete individual files, list a directory, walk the full repo tree. | +| `gitea-releases` | Release and tag CRUD — draft/prerelease flags, release notes, semver tags. | + +A request that already names its own owner (e.g. "create a milestone" → `gitea-labels-milestones`, "read this file from the repo" → `gitea-files`) never needed this index — invoke that skill directly rather than routing through here. + +Then report per `SKILL.md`'s Report section: name the skill and hand off — don't duplicate its output format, let it report. diff --git a/plugins/gitea/.apm/skills/gitea-workflow/references/sources.md b/plugins/gitea/.apm/skills/gitea-workflow/references/sources.md index 852e7af..27d4fe7 100644 --- a/plugins/gitea/.apm/skills/gitea-workflow/references/sources.md +++ b/plugins/gitea/.apm/skills/gitea-workflow/references/sources.md @@ -3,9 +3,9 @@ ## gitea-mcp-repo - **URL:** https://gitea.com/gitea/gitea-mcp -- **Description:** Official gitea-mcp repository (v1.3.0) — `operation/*.go` source files documenting all 55 MCP tools. This skill's status view relies on `list_issues`/`list_pull_requests` semantics (via `gitea-issues`/`gitea-prs`), and its ambiguous-number resolution relies on `issue_read`'s `is_pull` field, both verified against this source at authoring time. +- **Description:** Official gitea-mcp repository (v1.3.0) — `operation/*.go` source files documenting all 55 MCP tools. This skill's status view relies on `list_issues`/`list_pull_requests` semantics (via `gitea-issues`/`gitea-prs`), its ambiguous-number resolution relies on `issue_read`'s `is_pull` field, and its domain-skill index groups that tool surface by owning skill — all verified against this source at authoring time. - **Research doc:** plugins/gitea/docs/research/docs/gitea/sources.md -- **Contributing files:** SKILL.md +- **Contributing files:** references/status-checkin.md, references/number-resolution.md, references/skill-index.md - **Status:** `extracted` ## gitea-mcp-slim-go @@ -13,7 +13,7 @@ - **URL:** https://gitea.com/gitea/gitea-mcp/raw/branch/main/operation/issue/slim.go - **Description:** Slim response shape structs from gitea-mcp source — confirms `is_pull` is present on a single-item `issue_read` response, the field this skill's resolution step depends on to distinguish an issue from a PR sharing the same number. - **Research doc:** plugins/gitea/docs/research/docs/gitea/sources.md -- **Contributing files:** SKILL.md +- **Contributing files:** references/number-resolution.md - **Status:** `extracted` ## context7-websites-gitea @@ -21,7 +21,7 @@ - **URL:** context7:/websites/gitea - **Description:** Official Gitea docs mirror on Context7 — confirms issues and pull requests share a single per-repository number sequence, and that Gitea returns 404 for permission failures rather than a distinct 403, both facts this skill's resolution and error-handling steps depend on. - **Research doc:** plugins/gitea/docs/research/docs/gitea/sources.md -- **Contributing files:** SKILL.md +- **Contributing files:** references/number-resolution.md - **Status:** `extracted` ## context7-gitea-tea-cli diff --git a/plugins/gitea/.apm/skills/gitea-workflow/references/status-checkin.md b/plugins/gitea/.apm/skills/gitea-workflow/references/status-checkin.md new file mode 100644 index 0000000..987ce6f --- /dev/null +++ b/plugins/gitea/.apm/skills/gitea-workflow/references/status-checkin.md @@ -0,0 +1,15 @@ +--- +topic: status-checkin +source_keys: + - gitea-mcp-repo +--- + +# Status check-in (invoked with no request) + +Give a repo status check-in: + +1. Invoke `gitea-issues` to list open issues (`state: "open"`). +2. Invoke `gitea-prs` to list open PRs (`state: "open"`). Run this alongside step 1 — the two are independent reads, so serialising them only adds latency. +3. Report as two sections, "Open Issues" and "Open Pull Requests", each a compact list of number and title. + +Then report per `SKILL.md`'s Report section.