acuity-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +541 -0
- package/dist/auth/device-flow.d.ts +46 -0
- package/dist/auth/device-flow.d.ts.map +1 -0
- package/dist/auth/device-flow.js +141 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/http-auth.d.ts +25 -0
- package/dist/auth/http-auth.d.ts.map +1 -0
- package/dist/auth/http-auth.js +101 -0
- package/dist/auth/http-auth.js.map +1 -0
- package/dist/auth/jwt-validator.d.ts +20 -0
- package/dist/auth/jwt-validator.d.ts.map +1 -0
- package/dist/auth/jwt-validator.js +83 -0
- package/dist/auth/jwt-validator.js.map +1 -0
- package/dist/auth/token-storage.d.ts +88 -0
- package/dist/auth/token-storage.d.ts.map +1 -0
- package/dist/auth/token-storage.js +273 -0
- package/dist/auth/token-storage.js.map +1 -0
- package/dist/clients/hasura-client.d.ts +33 -0
- package/dist/clients/hasura-client.d.ts.map +1 -0
- package/dist/clients/hasura-client.js +79 -0
- package/dist/clients/hasura-client.js.map +1 -0
- package/dist/config/environments.d.ts +51 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +183 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +593 -0
- package/dist/index.js.map +1 -0
- package/dist/server/http-server.d.ts +14 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +167 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/mcp-core.d.ts +12 -0
- package/dist/server/mcp-core.d.ts.map +1 -0
- package/dist/server/mcp-core.js +200 -0
- package/dist/server/mcp-core.js.map +1 -0
- package/dist/tools/acuity-init.d.ts +84 -0
- package/dist/tools/acuity-init.d.ts.map +1 -0
- package/dist/tools/acuity-init.js +239 -0
- package/dist/tools/acuity-init.js.map +1 -0
- package/dist/tools/get-dashboard-summary.d.ts +96 -0
- package/dist/tools/get-dashboard-summary.d.ts.map +1 -0
- package/dist/tools/get-dashboard-summary.js +264 -0
- package/dist/tools/get-dashboard-summary.js.map +1 -0
- package/dist/tools/get-issue.d.ts +62 -0
- package/dist/tools/get-issue.d.ts.map +1 -0
- package/dist/tools/get-issue.js +150 -0
- package/dist/tools/get-issue.js.map +1 -0
- package/dist/tools/get-lesson-learned.d.ts +53 -0
- package/dist/tools/get-lesson-learned.d.ts.map +1 -0
- package/dist/tools/get-lesson-learned.js +117 -0
- package/dist/tools/get-lesson-learned.js.map +1 -0
- package/dist/tools/get-lookup-values.d.ts +41 -0
- package/dist/tools/get-lookup-values.d.ts.map +1 -0
- package/dist/tools/get-lookup-values.js +127 -0
- package/dist/tools/get-lookup-values.js.map +1 -0
- package/dist/tools/get-project.d.ts +131 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +340 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-risk.d.ts +65 -0
- package/dist/tools/get-risk.d.ts.map +1 -0
- package/dist/tools/get-risk.js +173 -0
- package/dist/tools/get-risk.js.map +1 -0
- package/dist/tools/get-status-reports.d.ts +46 -0
- package/dist/tools/get-status-reports.d.ts.map +1 -0
- package/dist/tools/get-status-reports.js +151 -0
- package/dist/tools/get-status-reports.js.map +1 -0
- package/dist/tools/init-auth.d.ts +47 -0
- package/dist/tools/init-auth.d.ts.map +1 -0
- package/dist/tools/init-auth.js +213 -0
- package/dist/tools/init-auth.js.map +1 -0
- package/dist/tools/list-issues.d.ts +134 -0
- package/dist/tools/list-issues.d.ts.map +1 -0
- package/dist/tools/list-issues.js +285 -0
- package/dist/tools/list-issues.js.map +1 -0
- package/dist/tools/list-lessons-learned.d.ts +79 -0
- package/dist/tools/list-lessons-learned.d.ts.map +1 -0
- package/dist/tools/list-lessons-learned.js +155 -0
- package/dist/tools/list-lessons-learned.js.map +1 -0
- package/dist/tools/list-projects.d.ts +200 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +396 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-risks.d.ts +166 -0
- package/dist/tools/list-risks.d.ts.map +1 -0
- package/dist/tools/list-risks.js +356 -0
- package/dist/tools/list-risks.js.map +1 -0
- package/dist/tools/search-projects.d.ts +90 -0
- package/dist/tools/search-projects.d.ts.map +1 -0
- package/dist/tools/search-projects.js +191 -0
- package/dist/tools/search-projects.js.map +1 -0
- package/dist/utils/formatters.d.ts +12 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +28 -0
- package/dist/utils/formatters.js.map +1 -0
- package/openapi.yaml +194 -0
- package/package.json +68 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_projects
|
|
3
|
+
* Lists all projects the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Enum conversion: input strings → DB integers, DB integers → output strings
|
|
7
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
8
|
+
* - Multiple filters: state, health_status, schedule_status, budget_status, etc.
|
|
9
|
+
*/
|
|
10
|
+
import type { HasuraClient } from '../clients/hasura-client.js';
|
|
11
|
+
export type ProjectState = 'active' | 'hold' | 'completed' | 'cancelled' | 'pending';
|
|
12
|
+
export type StoplightStatus = 'green' | 'yellow' | 'red' | 'gray';
|
|
13
|
+
export type ProjectType = 'project' | 'proposal' | 'all';
|
|
14
|
+
export interface ListProjectsInput {
|
|
15
|
+
project_type?: ProjectType;
|
|
16
|
+
state?: ProjectState | ProjectState[];
|
|
17
|
+
health_status?: StoplightStatus | StoplightStatus[];
|
|
18
|
+
schedule_status?: StoplightStatus | StoplightStatus[];
|
|
19
|
+
budget_status?: StoplightStatus | StoplightStatus[];
|
|
20
|
+
department_id?: number;
|
|
21
|
+
category_id?: number;
|
|
22
|
+
lifecycle_id?: number;
|
|
23
|
+
strategic_objective_id?: number;
|
|
24
|
+
portfolio_id?: number;
|
|
25
|
+
order_by?: 'rank' | 'updated_at' | 'name';
|
|
26
|
+
limit?: number;
|
|
27
|
+
offset?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ProjectListItem {
|
|
30
|
+
id: number;
|
|
31
|
+
name: string;
|
|
32
|
+
description: string | null;
|
|
33
|
+
project_type: 'project' | 'proposal';
|
|
34
|
+
state: ProjectState;
|
|
35
|
+
health_status: StoplightStatus | null;
|
|
36
|
+
schedule_status: StoplightStatus | null;
|
|
37
|
+
budget_status: StoplightStatus | null;
|
|
38
|
+
quality_status: StoplightStatus | null;
|
|
39
|
+
percent_complete: number;
|
|
40
|
+
start_date: string | null;
|
|
41
|
+
end_date: string | null;
|
|
42
|
+
value_priority_score: number | null;
|
|
43
|
+
risk_priority_score: number | null;
|
|
44
|
+
portfolio: {
|
|
45
|
+
id: number;
|
|
46
|
+
name: string;
|
|
47
|
+
} | null;
|
|
48
|
+
department: {
|
|
49
|
+
id: number;
|
|
50
|
+
name: string;
|
|
51
|
+
} | null;
|
|
52
|
+
category: {
|
|
53
|
+
id: number;
|
|
54
|
+
name: string;
|
|
55
|
+
} | null;
|
|
56
|
+
lifecycle: {
|
|
57
|
+
id: number;
|
|
58
|
+
name: string;
|
|
59
|
+
} | null;
|
|
60
|
+
strategic_objective: {
|
|
61
|
+
id: number;
|
|
62
|
+
name: string;
|
|
63
|
+
} | null;
|
|
64
|
+
project_manager: {
|
|
65
|
+
id: number;
|
|
66
|
+
name: string;
|
|
67
|
+
} | null;
|
|
68
|
+
open_risks_count: number;
|
|
69
|
+
closed_risks_count: number;
|
|
70
|
+
total_risks_count: number;
|
|
71
|
+
open_issues_count: number;
|
|
72
|
+
closed_issues_count: number;
|
|
73
|
+
total_issues_count: number;
|
|
74
|
+
open_benefits_count: number;
|
|
75
|
+
closed_benefits_count: number;
|
|
76
|
+
total_benefits_count: number;
|
|
77
|
+
total_lessons_count: number;
|
|
78
|
+
}
|
|
79
|
+
export interface ListProjectsResult {
|
|
80
|
+
projects: ProjectListItem[];
|
|
81
|
+
total_count: number;
|
|
82
|
+
has_more: boolean;
|
|
83
|
+
offset: number;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* List projects handler
|
|
87
|
+
*/
|
|
88
|
+
export declare function listProjects(input: ListProjectsInput, hasuraClient: HasuraClient): Promise<ListProjectsResult>;
|
|
89
|
+
export declare const listProjectsTool: {
|
|
90
|
+
name: string;
|
|
91
|
+
description: string;
|
|
92
|
+
inputSchema: {
|
|
93
|
+
type: string;
|
|
94
|
+
properties: {
|
|
95
|
+
project_type: {
|
|
96
|
+
type: string;
|
|
97
|
+
enum: string[];
|
|
98
|
+
description: string;
|
|
99
|
+
default: string;
|
|
100
|
+
};
|
|
101
|
+
state: {
|
|
102
|
+
oneOf: ({
|
|
103
|
+
type: string;
|
|
104
|
+
enum: string[];
|
|
105
|
+
items?: undefined;
|
|
106
|
+
} | {
|
|
107
|
+
type: string;
|
|
108
|
+
items: {
|
|
109
|
+
type: string;
|
|
110
|
+
enum: string[];
|
|
111
|
+
};
|
|
112
|
+
enum?: undefined;
|
|
113
|
+
})[];
|
|
114
|
+
description: string;
|
|
115
|
+
};
|
|
116
|
+
health_status: {
|
|
117
|
+
oneOf: ({
|
|
118
|
+
type: string;
|
|
119
|
+
enum: string[];
|
|
120
|
+
items?: undefined;
|
|
121
|
+
} | {
|
|
122
|
+
type: string;
|
|
123
|
+
items: {
|
|
124
|
+
type: string;
|
|
125
|
+
enum: string[];
|
|
126
|
+
};
|
|
127
|
+
enum?: undefined;
|
|
128
|
+
})[];
|
|
129
|
+
description: string;
|
|
130
|
+
};
|
|
131
|
+
schedule_status: {
|
|
132
|
+
oneOf: ({
|
|
133
|
+
type: string;
|
|
134
|
+
enum: string[];
|
|
135
|
+
items?: undefined;
|
|
136
|
+
} | {
|
|
137
|
+
type: string;
|
|
138
|
+
items: {
|
|
139
|
+
type: string;
|
|
140
|
+
enum: string[];
|
|
141
|
+
};
|
|
142
|
+
enum?: undefined;
|
|
143
|
+
})[];
|
|
144
|
+
description: string;
|
|
145
|
+
};
|
|
146
|
+
budget_status: {
|
|
147
|
+
oneOf: ({
|
|
148
|
+
type: string;
|
|
149
|
+
enum: string[];
|
|
150
|
+
items?: undefined;
|
|
151
|
+
} | {
|
|
152
|
+
type: string;
|
|
153
|
+
items: {
|
|
154
|
+
type: string;
|
|
155
|
+
enum: string[];
|
|
156
|
+
};
|
|
157
|
+
enum?: undefined;
|
|
158
|
+
})[];
|
|
159
|
+
description: string;
|
|
160
|
+
};
|
|
161
|
+
department_id: {
|
|
162
|
+
type: string;
|
|
163
|
+
description: string;
|
|
164
|
+
};
|
|
165
|
+
category_id: {
|
|
166
|
+
type: string;
|
|
167
|
+
description: string;
|
|
168
|
+
};
|
|
169
|
+
lifecycle_id: {
|
|
170
|
+
type: string;
|
|
171
|
+
description: string;
|
|
172
|
+
};
|
|
173
|
+
strategic_objective_id: {
|
|
174
|
+
type: string;
|
|
175
|
+
description: string;
|
|
176
|
+
};
|
|
177
|
+
portfolio_id: {
|
|
178
|
+
type: string;
|
|
179
|
+
description: string;
|
|
180
|
+
};
|
|
181
|
+
order_by: {
|
|
182
|
+
type: string;
|
|
183
|
+
enum: string[];
|
|
184
|
+
description: string;
|
|
185
|
+
default: string;
|
|
186
|
+
};
|
|
187
|
+
limit: {
|
|
188
|
+
type: string;
|
|
189
|
+
description: string;
|
|
190
|
+
default: number;
|
|
191
|
+
};
|
|
192
|
+
offset: {
|
|
193
|
+
type: string;
|
|
194
|
+
description: string;
|
|
195
|
+
default: number;
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=list-projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_projects
|
|
3
|
+
* Lists all projects the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Enum conversion: input strings → DB integers, DB integers → output strings
|
|
7
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
8
|
+
* - Multiple filters: state, health_status, schedule_status, budget_status, etc.
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Enum Mappings
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Enum mappings: string → DB integer
|
|
15
|
+
* Verified against Rails models and frontend configs (see strategy-notes.md)
|
|
16
|
+
*/
|
|
17
|
+
const STATE_TO_DB = {
|
|
18
|
+
active: 0,
|
|
19
|
+
hold: 1,
|
|
20
|
+
completed: 2,
|
|
21
|
+
cancelled: 3,
|
|
22
|
+
pending: 4
|
|
23
|
+
};
|
|
24
|
+
const STOPLIGHT_TO_DB = {
|
|
25
|
+
green: 0,
|
|
26
|
+
yellow: 1,
|
|
27
|
+
red: 2,
|
|
28
|
+
gray: 3
|
|
29
|
+
};
|
|
30
|
+
// Special case: schedule_status and budget_status have different order!
|
|
31
|
+
// yellow=0 (on schedule/budget), green=1 (ahead/under), red=2 (behind/over)
|
|
32
|
+
const SCHEDULE_BUDGET_TO_DB = {
|
|
33
|
+
yellow: 0, // on schedule / on budget
|
|
34
|
+
green: 1, // ahead of schedule / under budget
|
|
35
|
+
red: 2, // behind schedule / over budget
|
|
36
|
+
gray: 3
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Reverse mappings: DB integer → string
|
|
40
|
+
*/
|
|
41
|
+
const DB_TO_STATE = {
|
|
42
|
+
0: 'active',
|
|
43
|
+
1: 'hold',
|
|
44
|
+
2: 'completed',
|
|
45
|
+
3: 'cancelled',
|
|
46
|
+
4: 'pending'
|
|
47
|
+
};
|
|
48
|
+
const DB_TO_STOPLIGHT = {
|
|
49
|
+
0: 'green',
|
|
50
|
+
1: 'yellow',
|
|
51
|
+
2: 'red',
|
|
52
|
+
3: 'gray'
|
|
53
|
+
};
|
|
54
|
+
const DB_TO_SCHEDULE_BUDGET = {
|
|
55
|
+
0: 'yellow', // on schedule / on budget
|
|
56
|
+
1: 'green', // ahead / under
|
|
57
|
+
2: 'red', // behind / over
|
|
58
|
+
3: 'gray'
|
|
59
|
+
};
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Helper Functions
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Convert enum values to DB integers for WHERE clause
|
|
65
|
+
*/
|
|
66
|
+
function toDbValues(values, mapping) {
|
|
67
|
+
if (values === undefined)
|
|
68
|
+
return undefined;
|
|
69
|
+
const arr = Array.isArray(values) ? values : [values];
|
|
70
|
+
return arr.map(v => mapping[v]).filter(n => n !== undefined);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert a single DB integer to string
|
|
74
|
+
*/
|
|
75
|
+
function fromDbValue(value, mapping) {
|
|
76
|
+
if (value === null || value === undefined)
|
|
77
|
+
return null;
|
|
78
|
+
return mapping[value] ?? null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Transform raw DB project to formatted output with resolved enums
|
|
82
|
+
*/
|
|
83
|
+
function transformProject(raw) {
|
|
84
|
+
return {
|
|
85
|
+
id: raw.id,
|
|
86
|
+
name: raw.name,
|
|
87
|
+
description: raw.description,
|
|
88
|
+
project_type: raw.project_type,
|
|
89
|
+
// Convert enums from integers to strings
|
|
90
|
+
state: fromDbValue(raw.state, DB_TO_STATE) ?? 'active',
|
|
91
|
+
health_status: fromDbValue(raw.health_status, DB_TO_STOPLIGHT),
|
|
92
|
+
schedule_status: fromDbValue(raw.schedule_status, DB_TO_SCHEDULE_BUDGET),
|
|
93
|
+
budget_status: fromDbValue(raw.budget_status, DB_TO_SCHEDULE_BUDGET),
|
|
94
|
+
quality_status: fromDbValue(raw.quality_status, DB_TO_STOPLIGHT),
|
|
95
|
+
percent_complete: raw.percent_complete ?? 0,
|
|
96
|
+
start_date: raw.start_date,
|
|
97
|
+
end_date: raw.end_date,
|
|
98
|
+
value_priority_score: raw.value_priority_score,
|
|
99
|
+
risk_priority_score: raw.risk_priority_score,
|
|
100
|
+
// Relationships are already resolved by Hasura
|
|
101
|
+
portfolio: raw.portfolio,
|
|
102
|
+
department: raw.department,
|
|
103
|
+
category: raw.category,
|
|
104
|
+
lifecycle: raw.lifecycle,
|
|
105
|
+
strategic_objective: raw.strategic_objective,
|
|
106
|
+
project_manager: raw.project_manager,
|
|
107
|
+
// Counts (default to 0)
|
|
108
|
+
open_risks_count: raw.open_risks_count ?? 0,
|
|
109
|
+
closed_risks_count: raw.closed_risks_count ?? 0,
|
|
110
|
+
total_risks_count: raw.total_risks_count ?? 0,
|
|
111
|
+
open_issues_count: raw.open_issues_count ?? 0,
|
|
112
|
+
closed_issues_count: raw.closed_issues_count ?? 0,
|
|
113
|
+
total_issues_count: raw.total_issues_count ?? 0,
|
|
114
|
+
open_benefits_count: raw.open_benefits_count ?? 0,
|
|
115
|
+
closed_benefits_count: raw.closed_benefits_count ?? 0,
|
|
116
|
+
total_benefits_count: raw.total_benefits_count ?? 0,
|
|
117
|
+
total_lessons_count: raw.total_lessons_count ?? 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ============================================================================
|
|
121
|
+
// Main Handler
|
|
122
|
+
// ============================================================================
|
|
123
|
+
/**
|
|
124
|
+
* List projects handler
|
|
125
|
+
*/
|
|
126
|
+
export async function listProjects(input, hasuraClient) {
|
|
127
|
+
const { project_type = 'project', state, health_status, schedule_status, budget_status, department_id, category_id, lifecycle_id, strategic_objective_id, portfolio_id, order_by = 'updated_at', limit = 15, offset = 0 } = input;
|
|
128
|
+
// Build where conditions
|
|
129
|
+
const whereConditions = {};
|
|
130
|
+
// Filter by project_type (default: 'project', use 'all' to see both)
|
|
131
|
+
if (project_type !== 'all') {
|
|
132
|
+
whereConditions.project_type = { _eq: project_type };
|
|
133
|
+
}
|
|
134
|
+
// When sorting by rank, ONLY show active projects
|
|
135
|
+
// This matches frontend behavior where rank only applies to active projects
|
|
136
|
+
if (order_by === 'rank') {
|
|
137
|
+
whereConditions.state = { _eq: STATE_TO_DB.active };
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Convert state filter
|
|
141
|
+
const stateValues = toDbValues(state, STATE_TO_DB);
|
|
142
|
+
if (stateValues && stateValues.length > 0) {
|
|
143
|
+
whereConditions.state = stateValues.length === 1
|
|
144
|
+
? { _eq: stateValues[0] }
|
|
145
|
+
: { _in: stateValues };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Convert stoplight filters
|
|
149
|
+
const healthValues = toDbValues(health_status, STOPLIGHT_TO_DB);
|
|
150
|
+
if (healthValues && healthValues.length > 0) {
|
|
151
|
+
whereConditions.health_status = healthValues.length === 1
|
|
152
|
+
? { _eq: healthValues[0] }
|
|
153
|
+
: { _in: healthValues };
|
|
154
|
+
}
|
|
155
|
+
const scheduleValues = toDbValues(schedule_status, SCHEDULE_BUDGET_TO_DB);
|
|
156
|
+
if (scheduleValues && scheduleValues.length > 0) {
|
|
157
|
+
whereConditions.schedule_status = scheduleValues.length === 1
|
|
158
|
+
? { _eq: scheduleValues[0] }
|
|
159
|
+
: { _in: scheduleValues };
|
|
160
|
+
}
|
|
161
|
+
const budgetValues = toDbValues(budget_status, SCHEDULE_BUDGET_TO_DB);
|
|
162
|
+
if (budgetValues && budgetValues.length > 0) {
|
|
163
|
+
whereConditions.budget_status = budgetValues.length === 1
|
|
164
|
+
? { _eq: budgetValues[0] }
|
|
165
|
+
: { _in: budgetValues };
|
|
166
|
+
}
|
|
167
|
+
// ID filters
|
|
168
|
+
if (portfolio_id !== undefined) {
|
|
169
|
+
whereConditions.portfolio_id = { _eq: portfolio_id };
|
|
170
|
+
}
|
|
171
|
+
if (department_id !== undefined) {
|
|
172
|
+
whereConditions.department_id = { _eq: department_id };
|
|
173
|
+
}
|
|
174
|
+
if (category_id !== undefined) {
|
|
175
|
+
whereConditions.category_id = { _eq: category_id };
|
|
176
|
+
}
|
|
177
|
+
if (lifecycle_id !== undefined) {
|
|
178
|
+
whereConditions.lifecycle_id = { _eq: lifecycle_id };
|
|
179
|
+
}
|
|
180
|
+
if (strategic_objective_id !== undefined) {
|
|
181
|
+
whereConditions.strategic_objective_id = { _eq: strategic_objective_id };
|
|
182
|
+
}
|
|
183
|
+
// Build order_by clause
|
|
184
|
+
let orderByClause = '{ updated_at: desc }';
|
|
185
|
+
if (order_by === 'rank') {
|
|
186
|
+
// Sort by value_priority_score DESC, risk_priority_score ASC, id ASC
|
|
187
|
+
// This replicates frontend logic in prepareRankForProjects
|
|
188
|
+
orderByClause = '[{ value_priority_score: desc_nulls_last }, { risk_priority_score: asc_nulls_last }, { id: asc }]';
|
|
189
|
+
}
|
|
190
|
+
else if (order_by === 'name') {
|
|
191
|
+
orderByClause = '{ name: asc }';
|
|
192
|
+
}
|
|
193
|
+
// Build GraphQL query with relationships
|
|
194
|
+
const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
|
|
195
|
+
const query = `
|
|
196
|
+
query ListProjects($limit: Int!, $offset: Int!) {
|
|
197
|
+
projects(
|
|
198
|
+
where: ${whereClause},
|
|
199
|
+
order_by: ${orderByClause},
|
|
200
|
+
limit: $limit,
|
|
201
|
+
offset: $offset
|
|
202
|
+
) {
|
|
203
|
+
id
|
|
204
|
+
name
|
|
205
|
+
description
|
|
206
|
+
project_type
|
|
207
|
+
state
|
|
208
|
+
health_status
|
|
209
|
+
schedule_status
|
|
210
|
+
budget_status
|
|
211
|
+
quality_status
|
|
212
|
+
percent_complete
|
|
213
|
+
start_date
|
|
214
|
+
end_date
|
|
215
|
+
value_priority_score
|
|
216
|
+
risk_priority_score
|
|
217
|
+
|
|
218
|
+
# Relationships - Hasura resolves automatically
|
|
219
|
+
portfolio { id name }
|
|
220
|
+
department { id name }
|
|
221
|
+
category { id name }
|
|
222
|
+
lifecycle { id name }
|
|
223
|
+
strategic_objective { id name }
|
|
224
|
+
project_manager { id name }
|
|
225
|
+
|
|
226
|
+
# Counts (cached on project)
|
|
227
|
+
open_risks_count
|
|
228
|
+
closed_risks_count
|
|
229
|
+
total_risks_count
|
|
230
|
+
open_issues_count
|
|
231
|
+
closed_issues_count
|
|
232
|
+
total_issues_count
|
|
233
|
+
open_benefits_count
|
|
234
|
+
closed_benefits_count
|
|
235
|
+
total_benefits_count
|
|
236
|
+
total_lessons_count
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
projects_aggregate(where: ${whereClause}) {
|
|
240
|
+
aggregate {
|
|
241
|
+
count
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
`;
|
|
246
|
+
const result = await hasuraClient.query(query, { limit, offset });
|
|
247
|
+
const totalCount = result.projects_aggregate.aggregate.count;
|
|
248
|
+
const transformedProjects = result.projects.map(transformProject);
|
|
249
|
+
return {
|
|
250
|
+
projects: transformedProjects,
|
|
251
|
+
total_count: totalCount,
|
|
252
|
+
has_more: offset + result.projects.length < totalCount,
|
|
253
|
+
offset
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// ============================================================================
|
|
257
|
+
// Tool Definition
|
|
258
|
+
// ============================================================================
|
|
259
|
+
export const listProjectsTool = {
|
|
260
|
+
name: 'list_projects',
|
|
261
|
+
description: `
|
|
262
|
+
List projects OR proposals the user has access to with optional filtering.
|
|
263
|
+
|
|
264
|
+
IMPORTANT: This tool handles BOTH projects and proposals. They are stored in the same table with different project_type values:
|
|
265
|
+
- project_type: "project" (default) - Active/approved projects being executed
|
|
266
|
+
- project_type: "proposal" - Project proposals awaiting approval
|
|
267
|
+
- project_type: "all" - Both projects and proposals
|
|
268
|
+
|
|
269
|
+
Returns summaries including:
|
|
270
|
+
- Basic info (id, name, description, project_type, state)
|
|
271
|
+
- Health indicators (health_status, schedule_status, budget_status, quality_status)
|
|
272
|
+
- Progress (percent_complete) and dates (start_date, end_date)
|
|
273
|
+
- Scoring (value_priority_score, risk_priority_score)
|
|
274
|
+
- Relationships with NAMES resolved: portfolio, department, category, lifecycle, strategic_objective, project_manager
|
|
275
|
+
- Counts: open_risks_count, closed_risks_count, total_risks_count, open_issues_count, closed_issues_count, total_issues_count, total_lessons_count
|
|
276
|
+
|
|
277
|
+
PROJECT TYPE (default: "project"):
|
|
278
|
+
- "project" - Only active/approved projects
|
|
279
|
+
- "proposal" - Only proposals awaiting approval
|
|
280
|
+
- "all" - Both projects and proposals
|
|
281
|
+
|
|
282
|
+
FILTER VALUES:
|
|
283
|
+
|
|
284
|
+
state: "active", "hold", "completed", "cancelled", "pending"
|
|
285
|
+
- Can pass single value or array: state: "active" OR state: ["active", "hold"]
|
|
286
|
+
|
|
287
|
+
health_status / quality_status: "green", "yellow", "red", "gray"
|
|
288
|
+
- green = healthy/good
|
|
289
|
+
- yellow = caution/warning
|
|
290
|
+
- red = critical/problem
|
|
291
|
+
- gray = unknown/not set
|
|
292
|
+
|
|
293
|
+
schedule_status: "yellow", "green", "red", "gray"
|
|
294
|
+
- yellow = on schedule
|
|
295
|
+
- green = ahead of schedule
|
|
296
|
+
- red = behind schedule
|
|
297
|
+
|
|
298
|
+
budget_status: "yellow", "green", "red", "gray"
|
|
299
|
+
- yellow = on budget
|
|
300
|
+
- green = under budget
|
|
301
|
+
- red = over budget
|
|
302
|
+
|
|
303
|
+
SORTING:
|
|
304
|
+
- "updated_at" (default) - most recently updated first
|
|
305
|
+
- "name" - alphabetical
|
|
306
|
+
- "rank" - sorts by VALUE score (highest value_priority_score first, then lowest risk_priority_score, then id).
|
|
307
|
+
Only shows ACTIVE projects. Use for: "top ranked", "highest value", "best projects", "top 10 projects".
|
|
308
|
+
NOTE: The "rank" field in database is NOT used. Ranking is calculated from value_priority_score and risk_priority_score.
|
|
309
|
+
|
|
310
|
+
EXAMPLES:
|
|
311
|
+
- "Show all active projects" → state: "active"
|
|
312
|
+
- "List all proposals" → project_type: "proposal"
|
|
313
|
+
- "Show pending proposals" → project_type: "proposal", state: "pending"
|
|
314
|
+
- "Projects at risk" → health_status: ["yellow", "red"]
|
|
315
|
+
- "Behind schedule projects" → schedule_status: "red"
|
|
316
|
+
- "Projects in Engineering department" → department_id: 5
|
|
317
|
+
- "Top 10 ranked projects" → order_by: "rank", limit: 10
|
|
318
|
+
- "All items (projects + proposals)" → project_type: "all"
|
|
319
|
+
`.trim(),
|
|
320
|
+
inputSchema: {
|
|
321
|
+
type: 'object',
|
|
322
|
+
properties: {
|
|
323
|
+
project_type: {
|
|
324
|
+
type: 'string',
|
|
325
|
+
enum: ['project', 'proposal', 'all'],
|
|
326
|
+
description: 'Type of items to list. "project" = active projects (default), "proposal" = proposals awaiting approval, "all" = both',
|
|
327
|
+
default: 'project'
|
|
328
|
+
},
|
|
329
|
+
state: {
|
|
330
|
+
oneOf: [
|
|
331
|
+
{ type: 'string', enum: ['active', 'hold', 'completed', 'cancelled', 'pending'] },
|
|
332
|
+
{ type: 'array', items: { type: 'string', enum: ['active', 'hold', 'completed', 'cancelled', 'pending'] } }
|
|
333
|
+
],
|
|
334
|
+
description: 'Filter by project state. Can be single value or array.'
|
|
335
|
+
},
|
|
336
|
+
health_status: {
|
|
337
|
+
oneOf: [
|
|
338
|
+
{ type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
|
|
339
|
+
{ type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
|
|
340
|
+
],
|
|
341
|
+
description: 'Filter by health status (green=good, yellow=caution, red=critical)'
|
|
342
|
+
},
|
|
343
|
+
schedule_status: {
|
|
344
|
+
oneOf: [
|
|
345
|
+
{ type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
|
|
346
|
+
{ type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
|
|
347
|
+
],
|
|
348
|
+
description: 'Filter by schedule status (yellow=on schedule, green=ahead, red=behind)'
|
|
349
|
+
},
|
|
350
|
+
budget_status: {
|
|
351
|
+
oneOf: [
|
|
352
|
+
{ type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
|
|
353
|
+
{ type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
|
|
354
|
+
],
|
|
355
|
+
description: 'Filter by budget status (yellow=on budget, green=under, red=over)'
|
|
356
|
+
},
|
|
357
|
+
department_id: {
|
|
358
|
+
type: 'number',
|
|
359
|
+
description: 'Filter by department ID'
|
|
360
|
+
},
|
|
361
|
+
category_id: {
|
|
362
|
+
type: 'number',
|
|
363
|
+
description: 'Filter by category ID'
|
|
364
|
+
},
|
|
365
|
+
lifecycle_id: {
|
|
366
|
+
type: 'number',
|
|
367
|
+
description: 'Filter by lifecycle ID'
|
|
368
|
+
},
|
|
369
|
+
strategic_objective_id: {
|
|
370
|
+
type: 'number',
|
|
371
|
+
description: 'Filter by strategic objective ID'
|
|
372
|
+
},
|
|
373
|
+
portfolio_id: {
|
|
374
|
+
type: 'number',
|
|
375
|
+
description: 'Filter by portfolio ID'
|
|
376
|
+
},
|
|
377
|
+
order_by: {
|
|
378
|
+
type: 'string',
|
|
379
|
+
enum: ['rank', 'updated_at', 'name'],
|
|
380
|
+
description: 'Sort order. "rank" = by value_priority_score (only active projects). Use "rank" for "top projects", "best ranked", "highest value".',
|
|
381
|
+
default: 'updated_at'
|
|
382
|
+
},
|
|
383
|
+
limit: {
|
|
384
|
+
type: 'number',
|
|
385
|
+
description: 'Maximum projects to return (default: 15, max: 100)',
|
|
386
|
+
default: 15
|
|
387
|
+
},
|
|
388
|
+
offset: {
|
|
389
|
+
type: 'number',
|
|
390
|
+
description: 'Skip this many projects for pagination (default: 0)',
|
|
391
|
+
default: 0
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
//# sourceMappingURL=list-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"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"}
|