feat: release notes

Each release can carry notes in Markdown, written before or after it
ships. A draft is generated from its finished tickets grouped by type, to
edit and copy from the releases page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 15:19:23 +02:00
parent 45a3dc1e16
commit 24b37b6628
40 changed files with 1251 additions and 31 deletions

View File

@@ -782,6 +782,46 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/releases/{releaseId}/notes": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
/**
* Write the release notes (Markdown)
* @description Also after the release ships; not once archived.
*/
put: operations["ReleasesController_writeNotes"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/releases/{releaseId}/notes/draft": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* A Markdown draft of the notes from the finished tickets
* @description Grouped by type; nothing is saved.
*/
get: operations["ReleasesController_notesDraft"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/releases/{releaseId}/archive": {
parameters: {
query?: never;
@@ -1737,6 +1777,8 @@ export interface components {
status: components["schemas"]["ReleaseStatus"];
/** Format: date-time */
releasedAt: string | null;
/** @description What shipped, told for people (Markdown) */
notes: string | null;
/** Format: date-time */
createdAt: string;
version: number;
@@ -1784,6 +1826,20 @@ export interface components {
*/
force: boolean;
};
ReleaseNotesDto: {
/** @description Markdown; null removes the notes */
notes: string | null;
};
ReleaseNotesDraftDto: {
/**
* @example ## v1.4.0
*
* ### Novedades
*
* - Pago con tarjeta (WEB-1)
*/
markdown: string;
};
Object: Record<string, never>;
/** @enum {string} */
NotificationKind: "ASSIGNED" | "STATUS_CHANGED" | "QA_FAILED" | "COMMENTED" | "MENTIONED" | "WATCHED" | "ADDED_TO_PROJECT" | "REMINDER";
@@ -5712,6 +5768,142 @@ export interface operations {
};
};
};
ReleasesController_writeNotes: {
parameters: {
query?: never;
header?: never;
path: {
releaseId: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": components["schemas"]["ReleaseNotesDto"];
};
};
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CommandResultDto"];
};
};
/** @description Invalid input */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Missing or rejected Pireon token */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Not a member of the project (or not allowed) */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Not found */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Someone changed it at the same time: retry */
409: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Business rule (e.g. a transition the workflow forbids) */
422: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
};
};
ReleasesController_notesDraft: {
parameters: {
query?: never;
header?: never;
path: {
releaseId: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ReleaseNotesDraftDto"];
};
};
/** @description Invalid input */
400: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Missing or rejected Pireon token */
401: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Not a member of the project (or not allowed) */
403: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
/** @description Not found */
404: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["ApiErrorDto"];
};
};
};
};
ReleasesController_archive: {
parameters: {
query?: never;