feat: dashboard reads the sprint, the risks, aging and bottlenecks
A new projectInsights reading (GraphQL Project.insights, REST
/projects/{project}/insights, MCP get_project_insights), computed by pure
functions over the read model and the timeline:
- the sprint under way: days left, points done, pace against what is
needed and whether it gets there;
- tickets at risk: overdue, due within a week, blocked by an open ticket
and stuck (7 days or more in an in-progress or QA status);
- aging of the work under way against the p85 cycle time;
- average days in each in-progress and QA status, with WIP limits.
The dashboard shows them in four new panels, reloaded on every change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
MemberInput,
|
||||
Project,
|
||||
ProjectAnalytics,
|
||||
ProjectInsights,
|
||||
ProjectSettings,
|
||||
ProjectsGateway,
|
||||
ProjectStats,
|
||||
@@ -18,6 +19,7 @@ import {
|
||||
DeleteProjectDocument,
|
||||
MyProjectsDocument,
|
||||
ProjectAnalyticsDocument,
|
||||
ProjectInsightsDocument,
|
||||
ProjectDocument,
|
||||
ProjectStatsDocument,
|
||||
PublicProjectsDocument,
|
||||
@@ -61,6 +63,12 @@ export class GraphqlProjectsGateway extends ProjectsGateway {
|
||||
.pipe(map((d) => toStats(d.project.stats)));
|
||||
}
|
||||
|
||||
insights(projectId: string): Observable<ProjectInsights> {
|
||||
return this.gql
|
||||
.query(ProjectInsightsDocument, { idOrKey: projectId })
|
||||
.pipe(map((d) => d.project.insights));
|
||||
}
|
||||
|
||||
analytics(projectId: string, days: number): Observable<ProjectAnalytics> {
|
||||
return this.gql
|
||||
.query(ProjectAnalyticsDocument, { idOrKey: projectId, days })
|
||||
|
||||
Reference in New Issue
Block a user