feat: portfolio of all my projects
/cartera (and GraphQL portfolio, REST /api/me/portfolio, MCP get_portfolio) shows every active project I belong to (not archived, not as a guest) at a glance: open, overdue, blocked and stuck tickets, the sprint under way and whether it gets there, planned releases with their forecast, and the open epics with their progress. It reuses the dashboard's computations. A release with no tickets now reads «Sin tickets» instead of «Todo hecho», here and on the dashboard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -204,6 +204,31 @@ export class ProjectsResolver {
|
||||
);
|
||||
}
|
||||
|
||||
@Tool({
|
||||
name: 'get_portfolio',
|
||||
description:
|
||||
"All the user's active projects at a glance (not archived, not as a guest): open, overdue, blocked and stuck tickets, the sprint under way and whether it gets there, planned releases with their forecast, and open epics with their progress.",
|
||||
paramsSchema: z.object({}),
|
||||
annotations: READ,
|
||||
})
|
||||
portfolio(_params: Record<string, never>, ctx: McpContext) {
|
||||
return toolResult(async () => {
|
||||
const projects = await this.api.data(
|
||||
this.api.as(ctx).GET('/api/me/portfolio'),
|
||||
);
|
||||
// Compact: epics as key, title and progress.
|
||||
return projects.map(({ epics, ...p }) => ({
|
||||
...p,
|
||||
epics: epics.map((e) => ({
|
||||
key: e.issue.key,
|
||||
title: e.issue.title,
|
||||
dueDate: e.issue.dueDate,
|
||||
percent: e.progress.percent,
|
||||
})),
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
@Tool({
|
||||
name: 'get_project_insights',
|
||||
description:
|
||||
|
||||
Reference in New Issue
Block a user