|
# retoor <retoor@molodetz.nl>
|
|
|
|
from __future__ import annotations
|
|
|
|
from ..spec import Action
|
|
from ._shared import ATTACHMENTS, body, confirm, path, query
|
|
|
|
|
|
ISSUE_ACTIONS: tuple[Action, ...] = (
|
|
Action(
|
|
name="list_issues",
|
|
method="GET",
|
|
path="/issues",
|
|
summary="List issue tickets from the Gitea tracker",
|
|
requires_auth=False,
|
|
params=(
|
|
query("state", "Filter by state: open, closed, or all."),
|
|
query("page", "1-based page number."),
|
|
),
|
|
),
|
|
Action(
|
|
name="create_issue",
|
|
method="POST",
|
|
path="/issues/create",
|
|
summary="Report an issue. It is rewritten by AI and filed on the tracker.",
|
|
description=(
|
|
"Queues a background issue creation job and returns {uid, status_url}. Poll the "
|
|
"status_url with issue_job_status until status is 'done', then show the user the "
|
|
"issue_url pointing at the filed ticket."
|
|
),
|
|
params=(
|
|
body("title", "Issue title.", required=True),
|
|
body("description", "Issue description.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="planning_report_generate",
|
|
method="POST",
|
|
path="/issues/planning",
|
|
summary="Queue an admin planning report of open tickets.",
|
|
description=(
|
|
"Queues a background job that builds a phased, ordered markdown implementation "
|
|
"document for open tickets and returns {uid, status_url}. Pass 'numbers' as a "
|
|
"comma-separated list of issue numbers to plan only those tickets; omit it to plan "
|
|
"every open ticket. Each ticket's full description is reproduced verbatim, both "
|
|
"inline and in a 'Source Tickets (verbatim)' appendix, so the document is "
|
|
"self-contained. Poll the status_url until status is 'done', then show the markdown "
|
|
"and the download_url. Admin only."
|
|
),
|
|
params=(
|
|
body(
|
|
"numbers",
|
|
"Comma-separated issue numbers to include (e.g. '1,4,7'). Omit for all open tickets.",
|
|
),
|
|
),
|
|
requires_auth=True,
|
|
requires_admin=True,
|
|
),
|
|
Action(
|
|
name="issue_job_status",
|
|
method="GET",
|
|
path="/issues/jobs/{uid}",
|
|
summary="Poll an issue creation job and obtain the filed issue ticket URL once finished",
|
|
description=(
|
|
"Returns the job status. When status is 'done', issue_url and number are populated; "
|
|
"while 'pending' or 'running', poll again shortly."
|
|
),
|
|
params=(path("uid", "Issue job uid returned by create_issue."),),
|
|
requires_auth=False,
|
|
),
|
|
Action(
|
|
name="view_issue",
|
|
method="GET",
|
|
path="/issues/{number}",
|
|
summary="View an issue ticket and its developer updates",
|
|
requires_auth=False,
|
|
params=(path("number", "The issue ticket number from a /issues listing."),),
|
|
),
|
|
Action(
|
|
name="comment_issue",
|
|
method="POST",
|
|
path="/issues/{number}/comment",
|
|
summary="Post a comment on an issue ticket, attributed to the current user",
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
body("body", "Comment text.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="set_issue_status",
|
|
method="POST",
|
|
path="/issues/{number}/status",
|
|
summary="Change an issue ticket status (admin only)",
|
|
requires_admin=True,
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
body("status", "New status: open or closed.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="list_issue_attachments",
|
|
method="GET",
|
|
path="/issues/{number}/attachments",
|
|
summary="List the files attached to an issue ticket",
|
|
requires_auth=False,
|
|
params=(path("number", "The issue ticket number."),),
|
|
),
|
|
Action(
|
|
name="add_issue_attachment",
|
|
method="POST",
|
|
path="/issues/{number}/attachments",
|
|
summary="Attach already-uploaded files to an open issue ticket",
|
|
description=(
|
|
"Upload files first with upload_file, then pass their uids here. Only works while "
|
|
"the issue is open; the files are mirrored to the tracker."
|
|
),
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
body("attachment_uids", ATTACHMENTS, required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="delete_issue_attachment",
|
|
method="DELETE",
|
|
path="/issues/{number}/attachments/{uid}",
|
|
summary="Delete a file from an open issue ticket (your own, or any when administrator). Soft delete, confirmation required",
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
path("uid", "The attachment uid."),
|
|
confirm(),
|
|
),
|
|
),
|
|
Action(
|
|
name="add_comment_attachment",
|
|
method="POST",
|
|
path="/issues/{number}/comments/{cid}/attachments",
|
|
summary="Attach already-uploaded files to an issue comment (issue must be open)",
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
path("cid", "The Gitea comment id."),
|
|
body("attachment_uids", ATTACHMENTS, required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="delete_comment_attachment",
|
|
method="DELETE",
|
|
path="/issues/{number}/comments/{cid}/attachments/{uid}",
|
|
summary="Delete a file from an issue comment (your own, or any when administrator). Soft delete, confirmation required",
|
|
params=(
|
|
path("number", "The issue ticket number."),
|
|
path("cid", "The Gitea comment id."),
|
|
path("uid", "The attachment uid."),
|
|
confirm(),
|
|
),
|
|
),
|
|
)
|