Files
holocron/plugins/gitea/skills/gitea-files/SKILL.md
Defame1297 be9b8d277f fix(gitea): restore the withLines exception and route rename_branch through the orchestrator
gitea-files' always-loaded Gotchas said "content is base64 both ways" without
qualification. The `main` text carried an exception for `withLines: true` and both
halves were dropped. Verified live: `get_file_contents` with `withLines: true`
returns plain JSON text while the same response still reports `"encoding":"base64"`.
An agent that follows the recommendation two sentences later and applies the
unconditional decode gets garbage, with the response's own field confirming the
wrong answer. Exception restored, and the lying field named.

gitea-orchestrate was never updated for `rename_branch`: absent from the operation
enum, so an agent caller got "unknown operation", and absent from the
destructive-confirm list, though branches.md requires a rename with open PRs or a
protection rule to be confirmed exactly as `delete_branch` is. Added to both — the
confirm gate rather than the enum alone, because accepting the operation without it
routes around a rule the skill states while appearing to support it. The
compatibility frontmatter, which the agent reads, still omitted the tool too.

Two more always-loaded Gotchas contradicted their own reference files, and the
Gotcha was wrong both times: issues and PRs are distinguishable on a list item by
the `html_url` path segment (confirmed live — #129 at /pulls/, #128 at /issues/),
and `get_repository_tree` takes `tree_sha`, not `ref`.

`review_comments` was asserted as unconditionally present on the PR get response.
It is absent on a PR with no review comments, so the claim is downgraded to
present-when-non-zero rather than stated as response shape.

The label-exclusivity relocation moved the rule out of label-inference.md and into
labels.md without updating sources.md, leaving the one rule in this branch that
writes differently to live repos citing a file that no longer carries it. The rule
itself is correct as it stands and `main` was wrong — every Kind/* label on this
instance is exclusive:false, every Priority/* and Status/* is true — so only the
provenance record is corrected.

Routing: gitea-workflow lost the human-caller discriminator and widened from status
checks to any request, which sent "close #42" to a branch that resolves the number
and presents detail without ever closing it. gitea-branches and gitea-issues regain
trigger phrasings the retrofit dropped.

Refs: #92
2026-09-01 12:38:53 +00:00

2.6 KiB

name, description, compatibility, metadata, allowed-tools
name description compatibility metadata allowed-tools
gitea-files Use when reading or writing files or directories in a Gitea repository via the MCP server, rather than the local filesystem (for a local path use Read/Write/Edit) — even when the user does not say "Gitea". Not commit history -> `gitea-branches`. Not pull requests -> `gitea-prs`. Requires the Gitea MCP server configured with a token scoped to at least write:repository. Tested with a token holding write:issue + write:repository; write:issue is not actually required for any of this domain's five tools.
category source_keys
gitea
gitea-mcp-repo
gitea-mcp-slim-go
context7-websites-gitea
mcp__gitea__get_file_contents mcp__gitea__get_dir_contents mcp__gitea__get_repository_tree mcp__gitea__create_or_update_file mcp__gitea__delete_file

Gotchas

  • A 404 may mean an under-scoped token, not a missing path. Every tool here gates on write:repository, and Gitea masks insufficient scope as 404. Check scopes first.
  • Reads take ref (tree_sha on get_repository_tree), writes take branch_name. One concept, three names — carry the wrong key and the branch is dropped.
  • content is base64 both ways — except under withLines: true. Encode before a write, decode after a read; but with withLines: true content is already plain JSON text and the reported "encoding": "base64" is a lie. Decoding it yields garbage.

Inputs

owner, repo and the target branch are caller-supplied. This skill never infers them from a git remote: ask the human when they are not stated, and expect an orchestrating caller to have resolved them already.

Dispatch

Read the reference for the row you land on before making the call.

Condition Flow Reference
Read one file, list one directory level, or walk the repository tree Read references/reading.md — the three read tools, their pagination behaviour, and why neither a directory listing nor a tree entry supplies the SHA a write needs
Create, update, or delete a file Write references/writing.md — the SHA-first sequence every update and delete depends on, the worked multi-call sequence, and how to triage a write that fails

A request that reads and then writes runs both flows in that order: fetch the file first, then write with the SHA that call returned.

Handoff

Scope ends at the commit. Gitea's own web UI edits files directly against a branch, so committing straight to a branch is the normal path rather than an escape hatch — hand off to gitea-prs when the change needs review before merging or the target branch is protected, not by default.