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

@@ -234,6 +234,7 @@ describe('ProjectFacade', () => {
issueTypes: [],
areas: [],
customFields: [],
teams: [],
};
project.saveSettings(settings);

View File

@@ -1,6 +1,7 @@
import { computed, inject, Injectable, Provider } from '@angular/core';
import { injectDispatch } from '@ngrx/signals/events';
import {
TEAM_MENTION_PREFIX,
CreateReleaseInput,
CreateSprintInput,
ProjectRole,
@@ -25,6 +26,20 @@ export class ProjectFacade {
readonly project = this.store.project;
readonly members = this.store.members;
/**
* Who `@` offers: the members, then the active teams (a team's mention,
* `team-<id>`, tells each of its members).
*/
readonly mentionable = computed(() => [
...this.store.members().map((m) => m.user),
...this.store
.workflow()
.activeTeams()
.map((t) => ({
id: `${TEAM_MENTION_PREFIX}${t.id}`,
name: `${t.name} · equipo`,
})),
]);
readonly stats = this.store.stats;
readonly releases = this.store.releases;
/** Under way, planned, then closed; with their progress. */