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:
2026-10-15 16:20:35 +02:00
parent 4acf629106
commit 869acd3f1f
41 changed files with 895 additions and 13 deletions

View File

@@ -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,