agentleFS
Stuko0Stuko0/alice-agent/skills/gitea/gitea-issues/SKILL.md

gitea-issues

Skill1 starsChanged 2 months agoMITView on GitHub

Create, triage, label, assign Gitea issues via tea or REST.

  • Reads credentials
  • Sends data out

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 3 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Create, search, triage, and manage GitHub issues.

    line 16
  2. Distinctive:

    When asked to triage issues:

    line 303
  3. Distinctive:

    Assign: if the owner is clear

    line 326
  4. Distinctive:

    Comment with triage notes: if needed

    line 328

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Gitea Issues Management

Create, search, triage, and manage GitHub issues. Each section shows tea first, then the curl fallback.

Prerequisites

  • Authenticated with Gitea (see gitea-auth skill)
  • Inside a git repo with a GitHub remote, or specify the repo explicitly

Setup

if command -v tea &>/dev/null && tea logins list &>/dev/null; then
  AUTH="tea"
else
  AUTH="git"
  if [ -z "$GITEA_TOKEN" ]; then
    if _alice_env="${ALICE_HOME:-$HOME/.alice}/.env"; [ -f "$_alice_env" ] && grep -q "^GITEA_TOKEN=" "$_alice_env"; then
      GITEA_TOKEN=$(grep "^GITEA_TOKEN=" "$_alice_env" | head -1 | cut -d= -f2 | tr -d '\n\r')
    elif grep -q "github.com" ~/.git-credentials 2>/dev/null; then
      GITEA_TOKEN=$(grep "github.com" ~/.git-credentials 2>/dev/null | head -1 | sed 's|https://[^:]*:\([^@]*\)@.*|\1|')
    fi
  fi
fi

REMOTE_URL=$(git remote get-url origin)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's|.*${GITEA_HOST:-gitea\.com}[:/]||; s|\.git$||')
OWNER=$(echo "$OWNER_REPO" | cut -d/ -f1)
REPO=$(echo "$OWNER_REPO" | cut -d/ -f2)

1. Viewing Issues

With tea:

tea issues list
tea issues list --state open --label "bug"
tea issues list --assignee @me
tea issues list --search "authentication error" --state all
tea issues view 42

With curl:

# List open issues
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  "https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues?state=open&per_page=20" \
  | python3 -c "
import sys, json
for i in json.load(sys.stdin):
    if 'pull_request' not in i:  # GitHub API returns PRs in /issues too
        labels = ', '.join(l['name'] for l in i['labels'])
        print(f\"#{i['number']:5}  {i['state']:6}  {labels:30}  {i['title']}\")"

# Filter by label
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  "https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues?state=open&labels=bug&per_page=20" \
  | python3 -c "
import sys, json
for i in json.load(sys.stdin):
    if 'pull_request' not in i:
        print(f\"#{i['number']}  {i['title']}\")"

# View a specific issue
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42 \
  | python3 -c "
import sys, json
i = json.load(sys.stdin)
labels = ', '.join(l['name'] for l in i['labels'])
assignees = ', '.join(a['login'] for a in i['assignees'])
print(f\"#{i['number']}: {i['title']}\")
print(f\"State: {i['state']}  Labels: {labels}  Assignees: {assignees}\")
print(f\"Author: {i['user']['login']}  Created: {i['created_at']}\")
print(f\"\n{i['body']}\")"

# Search issues
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  "https://\${GITEA_HOST:-gitea.com}/api/v1/search/issues?q=authentication+error+repo:$OWNER/$REPO" \
  | python3 -c "
import sys, json
for i in json.load(sys.stdin)['items']:
    print(f\"#{i['number']}  {i['state']:6}  {i['title']}\")"

2. Creating Issues

With tea:

tea issues create \
  --title "Login redirect ignores ?next= parameter" \
  --body "## Description
After logging in, users always land on /dashboard.

## Steps to Reproduce
1. Navigate to /settings while logged out
2. Get redirected to /login?next=/settings
3. Log in
4. Actual: redirected to /dashboard (should go to /settings)

## Expected Behavior
Respect the ?next= query parameter." \
  --label "bug,backend" \
  --assignee "username"

With curl:

curl -s -X POST \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues \
  -d '{
    "title": "Login redirect ignores ?next= parameter",
    "body": "## Description\nAfter logging in, users always land on /dashboard.\n\n## Steps to Reproduce\n1. Navigate to /settings while logged out\n2. Get redirected to /login?next=/settings\n3. Log in\n4. Actual: redirected to /dashboard\n\n## Expected Behavior\nRespect the ?next= query parameter.",
    "labels": ["bug", "backend"],
    "assignees": ["username"]
  }'

Bug Report Template

## Bug Description
<What's happening>

## Steps to Reproduce
1. <step>
2. <step>

## Expected Behavior
<What should happen>

## Actual Behavior
<What actually happens>

## Environment
- OS: <os>
- Version: <version>

Feature Request Template

## Feature Description
<What you want>

## Motivation
<Why this would be useful>

## Proposed Solution
<How it could work>

## Alternatives Considered
<Other approaches>

3. Managing Issues

Add/Remove Labels

With tea:

tea issues edit 42 --add-label "priority:high,bug"
tea issues edit 42 --remove-label "needs-triage"

With curl:

# Add labels
curl -s -X POST \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42/labels \
  -d '{"labels": ["priority:high", "bug"]}'

# Remove a label
curl -s -X DELETE \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42/labels/needs-triage

# List available labels in the repo
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/labels \
  | python3 -c "
import sys, json
for l in json.load(sys.stdin):
    print(f\"  {l['name']:30}  {l.get('description', '')}\")"

Assignment

With tea:

tea issues edit 42 --add-assignee username
tea issues edit 42 --add-assignee @me

With curl:

curl -s -X POST \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42/assignees \
  -d '{"assignees": ["username"]}'

Commenting

With tea:

tea issues comment 42 --body "Investigated — root cause is in auth middleware. Working on a fix."

With curl:

curl -s -X POST \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42/comments \
  -d '{"body": "Investigated — root cause is in auth middleware. Working on a fix."}'

Closing and Reopening

With tea:

tea issues close 42
tea issues close 42 --reason "not planned"
tea issues reopen 42

With curl:

# Close
curl -s -X PATCH \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42 \
  -d '{"state": "closed", "state_reason": "completed"}'

# Reopen
curl -s -X PATCH \
  -H "Authorization: token $GITEA_TOKEN" \
  https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/42 \
  -d '{"state": "open"}'

Linking Issues to PRs

Issues are automatically closed when a PR merges with the right keywords in the body:

Closes #42
Fixes #42
Resolves #42

To create a branch from an issue:

With tea:

tea issues checkout 42 --checkout

With git (manual equivalent):

git checkout main && git pull origin main
git checkout -b fix/issue-42-login-redirect

4. Issue Triage Workflow

When asked to triage issues:

  1. List untriaged issues:
# With tea
tea issues list --label "needs-triage" --state open

# With curl
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  "https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues?labels=needs-triage&state=open" \
  | python3 -c "
import sys, json
for i in json.load(sys.stdin):
    if 'pull_request' not in i:
        print(f\"#{i['number']}  {i['title']}\")"
  1. Read and categorize each issue (view details, understand the bug/feature)
  2. Apply labels and priority (see Managing Issues above)
  3. Assign if the owner is clear
  4. Comment with triage notes if needed

5. Bulk Operations

For batch operations, combine API calls with shell scripting:

With tea:

# Close all issues with a specific label
tea issues list --label "wontfix" --json number --jq '.[].number' | \
  xargs -I {} tea issues close {} --reason "not planned"

With curl:

# List issue numbers with a label, then close each
curl -s \
  -H "Authorization: token $GITEA_TOKEN" \
  "https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues?labels=wontfix&state=open" \
  | python3 -c "import sys,json; [print(i['number']) for i in json.load(sys.stdin)]" \
  | while read num; do
    curl -s -X PATCH \
      -H "Authorization: token $GITEA_TOKEN" \
      https://\${GITEA_HOST:-gitea.com}/api/v1/repos/$OWNER/$REPO/issues/$num \
      -d '{"state": "closed", "state_reason": "not_planned"}'
    echo "Closed #$num"
  done

Quick Reference Table

Actionteacurl endpoint
List issuestea issues listGET /repos/{o}/{r}/issues
View issuetea issues view NGET /repos/{o}/{r}/issues/N
Create issuetea issues create ...POST /repos/{o}/{r}/issues
Add labelstea issues edit N --add-label ...POST /repos/{o}/{r}/issues/N/labels
Assigntea issues edit N --add-assignee ...POST /repos/{o}/{r}/issues/N/assignees
Commenttea issues comment N --body ...POST /repos/{o}/{r}/issues/N/comments
Closetea issues close NPATCH /repos/{o}/{r}/issues/N
Searchtea issues list --search "..."GET /search/issues?q=...

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.