feat: teams within a project
Projects keep teams of members in their settings (settings.teams; people outside the project are dropped, teams are archived, not removed; absent when saving means unchanged). Tickets go to a team (`team`, also filtered in the list and in MCP search_issues), and a comment mentioning @[Frontend](team-FRONT) tells each of its members. Settings has the teams with their members, the ticket a «Equipo» select, the list a team filter, and «@» offers the teams after the people. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1777,6 +1777,14 @@ export interface components {
|
||||
options: string[];
|
||||
archived: boolean;
|
||||
};
|
||||
TeamDto: {
|
||||
/** @example FRONTEND */
|
||||
id: string;
|
||||
/** @example Frontend */
|
||||
name: string;
|
||||
memberIds: string[];
|
||||
archived: boolean;
|
||||
};
|
||||
ProjectSettingsDto: {
|
||||
/** @description In board order */
|
||||
statuses: components["schemas"]["WorkflowStatusDto"][];
|
||||
@@ -1786,6 +1794,7 @@ export interface components {
|
||||
customFields: components["schemas"]["CustomFieldDefinitionDto"][];
|
||||
/** @description Definition of done: tickets reach DONE only with their checklist ticked */
|
||||
checklistBeforeDone: boolean;
|
||||
teams: components["schemas"]["TeamDto"][];
|
||||
};
|
||||
ProjectDto: {
|
||||
/** Format: uuid */
|
||||
@@ -1931,6 +1940,16 @@ export interface components {
|
||||
/** @default false */
|
||||
archived: boolean;
|
||||
};
|
||||
TeamBodyDto: {
|
||||
/** @example FRONTEND */
|
||||
id: string;
|
||||
/** @example Frontend */
|
||||
name: string;
|
||||
/** @description Pireon user ids of project members (others are dropped) */
|
||||
memberIds?: string[];
|
||||
/** @default false */
|
||||
archived: boolean;
|
||||
};
|
||||
ProjectSettingsBodyDto: {
|
||||
/** @description In board order. Values cannot be removed: archive them instead. */
|
||||
statuses: components["schemas"]["WorkflowStatusBodyDto"][];
|
||||
@@ -1939,6 +1958,8 @@ export interface components {
|
||||
areas: components["schemas"]["AreaOptionBodyDto"][];
|
||||
/** @description Absent: unchanged. Fields cannot be removed: archive them. */
|
||||
customFields?: components["schemas"]["CustomFieldDefinitionBodyDto"][];
|
||||
/** @description Absent: unchanged. Teams cannot be removed: archive them. */
|
||||
teams?: components["schemas"]["TeamBodyDto"][];
|
||||
/** @description Definition of done: tickets reach a DONE status only with their checklist ticked (owners and admins may override). Absent: unchanged */
|
||||
checklistBeforeDone?: boolean;
|
||||
};
|
||||
@@ -2051,6 +2072,8 @@ export interface components {
|
||||
type: string;
|
||||
/** @example FRONTEND */
|
||||
area: string | null;
|
||||
/** @description A team id */
|
||||
team: string | null;
|
||||
title: string;
|
||||
description: string | null;
|
||||
/**
|
||||
@@ -2410,6 +2433,11 @@ export interface components {
|
||||
* @example FRONTEND
|
||||
*/
|
||||
area?: string | null;
|
||||
/**
|
||||
* @description A team id of the project's settings
|
||||
* @example FRONTEND
|
||||
*/
|
||||
team?: string | null;
|
||||
priority?: components["schemas"]["IssuePriority"];
|
||||
labels?: string[];
|
||||
/** @description Figma frame (https) for UI changes */
|
||||
@@ -2467,6 +2495,11 @@ export interface components {
|
||||
* @example FRONTEND
|
||||
*/
|
||||
area?: string | null;
|
||||
/**
|
||||
* @description A team id of the project's settings
|
||||
* @example FRONTEND
|
||||
*/
|
||||
team?: string | null;
|
||||
priority?: components["schemas"]["IssuePriority"];
|
||||
labels?: string[];
|
||||
/** @description Figma frame (https) for UI changes */
|
||||
@@ -4946,6 +4979,8 @@ export interface operations {
|
||||
type?: string[];
|
||||
/** @description Area ids */
|
||||
area?: string[];
|
||||
/** @description Team ids */
|
||||
team?: string[];
|
||||
priority?: components["schemas"]["IssuePriority"][];
|
||||
/** @description Pireon user id */
|
||||
assigneeId?: string;
|
||||
|
||||
@@ -37,6 +37,10 @@ const ids = (what: string) =>
|
||||
const issueFields = {
|
||||
description: z.string().max(50000).optional(),
|
||||
area: z.string().optional().describe('Area id (see get_project)'),
|
||||
team: z
|
||||
.string()
|
||||
.optional()
|
||||
.describe('Team id (see get_project settings.teams)'),
|
||||
priority: PRIORITY.optional(),
|
||||
labels: z.array(z.string().max(40)).max(20).optional(),
|
||||
figmaUrl: z.string().url().optional().describe('Figma frame (https)'),
|
||||
@@ -57,6 +61,7 @@ const issueFields = {
|
||||
type IssueFields = {
|
||||
description?: string;
|
||||
area?: string;
|
||||
team?: string;
|
||||
priority?: z.infer<typeof PRIORITY>;
|
||||
labels?: string[];
|
||||
figmaUrl?: string;
|
||||
@@ -144,6 +149,7 @@ export class IssuesResolver {
|
||||
categories: z.array(CATEGORY).optional(),
|
||||
types: ids('Ticket type'),
|
||||
areas: ids('Area'),
|
||||
teams: ids('Team'),
|
||||
priorities: z.array(PRIORITY).optional(),
|
||||
assigneeId: z.string().optional().describe('User id'),
|
||||
unassigned: z.boolean().optional(),
|
||||
@@ -187,6 +193,7 @@ export class IssuesResolver {
|
||||
categories?: z.infer<typeof CATEGORY>[];
|
||||
types?: string[];
|
||||
areas?: string[];
|
||||
teams?: string[];
|
||||
priorities?: z.infer<typeof PRIORITY>[];
|
||||
assigneeId?: string;
|
||||
unassigned?: boolean;
|
||||
@@ -216,6 +223,7 @@ export class IssuesResolver {
|
||||
category: params.categories,
|
||||
type: params.types,
|
||||
area: params.areas,
|
||||
team: params.teams,
|
||||
priority: params.priorities,
|
||||
assigneeId: params.assigneeId,
|
||||
unassigned: params.unassigned,
|
||||
|
||||
Reference in New Issue
Block a user