openclaw-productboard 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.
@@ -0,0 +1,262 @@
1
+ /**
2
+ * ProductBoard API Type Definitions
3
+ */
4
+ export interface PaginatedResponse<T> {
5
+ data: T[];
6
+ links?: {
7
+ next?: string;
8
+ prev?: string;
9
+ };
10
+ totalResults?: number;
11
+ }
12
+ export interface ApiError {
13
+ code: string;
14
+ message: string;
15
+ details?: Record<string, unknown>;
16
+ }
17
+ export interface Feature {
18
+ id: string;
19
+ name: string;
20
+ description?: string;
21
+ status?: FeatureStatus;
22
+ parent?: {
23
+ feature?: {
24
+ id: string;
25
+ };
26
+ product?: {
27
+ id: string;
28
+ };
29
+ component?: {
30
+ id: string;
31
+ };
32
+ };
33
+ owner?: {
34
+ email: string;
35
+ };
36
+ timeframe?: {
37
+ startDate?: string;
38
+ endDate?: string;
39
+ };
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ links?: {
43
+ self: string;
44
+ html: string;
45
+ };
46
+ }
47
+ export type FeatureStatus = 'new' | 'in-progress' | 'shipped' | 'archived' | 'postponed' | 'candidate';
48
+ export interface CreateFeatureParams {
49
+ name: string;
50
+ description?: string;
51
+ status?: FeatureStatus;
52
+ parent?: {
53
+ product?: {
54
+ id: string;
55
+ };
56
+ component?: {
57
+ id: string;
58
+ };
59
+ feature?: {
60
+ id: string;
61
+ };
62
+ };
63
+ owner?: {
64
+ email: string;
65
+ };
66
+ timeframe?: {
67
+ startDate?: string;
68
+ endDate?: string;
69
+ };
70
+ }
71
+ export interface UpdateFeatureParams {
72
+ name?: string;
73
+ description?: string;
74
+ status?: FeatureStatus;
75
+ parent?: {
76
+ product?: {
77
+ id: string;
78
+ };
79
+ component?: {
80
+ id: string;
81
+ };
82
+ feature?: {
83
+ id: string;
84
+ };
85
+ };
86
+ owner?: {
87
+ email: string;
88
+ };
89
+ timeframe?: {
90
+ startDate?: string;
91
+ endDate?: string;
92
+ };
93
+ }
94
+ export interface ListFeaturesParams {
95
+ productId?: string;
96
+ componentId?: string;
97
+ status?: FeatureStatus;
98
+ ownerId?: string;
99
+ limit?: number;
100
+ cursor?: string;
101
+ }
102
+ export interface Product {
103
+ id: string;
104
+ name: string;
105
+ description?: string;
106
+ createdAt: string;
107
+ updatedAt: string;
108
+ links?: {
109
+ self: string;
110
+ html: string;
111
+ };
112
+ }
113
+ export interface Component {
114
+ id: string;
115
+ name: string;
116
+ description?: string;
117
+ parent?: {
118
+ product?: {
119
+ id: string;
120
+ };
121
+ component?: {
122
+ id: string;
123
+ };
124
+ };
125
+ createdAt: string;
126
+ updatedAt: string;
127
+ links?: {
128
+ self: string;
129
+ html: string;
130
+ };
131
+ }
132
+ export interface ProductHierarchy {
133
+ products: Product[];
134
+ components: Component[];
135
+ }
136
+ export interface ListProductsParams {
137
+ limit?: number;
138
+ cursor?: string;
139
+ }
140
+ export interface Note {
141
+ id: string;
142
+ title?: string;
143
+ content: string;
144
+ displayUrl?: string;
145
+ source?: {
146
+ origin?: string;
147
+ record_id?: string;
148
+ };
149
+ user?: {
150
+ email: string;
151
+ name?: string;
152
+ };
153
+ company?: {
154
+ id?: string;
155
+ name?: string;
156
+ };
157
+ tags?: string[];
158
+ features?: Array<{
159
+ id: string;
160
+ }>;
161
+ createdAt: string;
162
+ updatedAt: string;
163
+ links?: {
164
+ self: string;
165
+ html: string;
166
+ };
167
+ }
168
+ export interface CreateNoteParams {
169
+ title?: string;
170
+ content: string;
171
+ displayUrl?: string;
172
+ source?: {
173
+ origin?: string;
174
+ record_id?: string;
175
+ };
176
+ user?: {
177
+ email: string;
178
+ name?: string;
179
+ };
180
+ company?: {
181
+ id?: string;
182
+ name?: string;
183
+ };
184
+ tags?: string[];
185
+ }
186
+ export interface ListNotesParams {
187
+ limit?: number;
188
+ cursor?: string;
189
+ createdFrom?: string;
190
+ createdTo?: string;
191
+ }
192
+ export interface AttachNoteParams {
193
+ noteId: string;
194
+ featureId: string;
195
+ }
196
+ export interface User {
197
+ id: string;
198
+ email: string;
199
+ name?: string;
200
+ role?: string;
201
+ createdAt?: string;
202
+ }
203
+ export interface CurrentUser extends User {
204
+ workspaceId?: string;
205
+ workspaceName?: string;
206
+ }
207
+ export interface ListUsersParams {
208
+ limit?: number;
209
+ cursor?: string;
210
+ }
211
+ export interface SearchParams {
212
+ query: string;
213
+ type?: 'feature' | 'note' | 'product' | 'component';
214
+ limit?: number;
215
+ }
216
+ export interface SearchResult {
217
+ type: 'feature' | 'note' | 'product' | 'component';
218
+ id: string;
219
+ name?: string;
220
+ title?: string;
221
+ content?: string;
222
+ description?: string;
223
+ score?: number;
224
+ links?: {
225
+ self: string;
226
+ html: string;
227
+ };
228
+ }
229
+ export interface PluginConfig {
230
+ apiToken: string;
231
+ apiBaseUrl?: string;
232
+ cacheTtlSeconds?: number;
233
+ rateLimitPerMinute?: number;
234
+ }
235
+ export interface ToolDefinition {
236
+ name: string;
237
+ description: string;
238
+ parameters: {
239
+ type: 'object';
240
+ properties: Record<string, ParameterSchema>;
241
+ required?: string[];
242
+ };
243
+ handler: (params: Record<string, unknown>) => Promise<unknown>;
244
+ }
245
+ export interface ParameterSchema {
246
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object';
247
+ description?: string;
248
+ enum?: string[];
249
+ default?: unknown;
250
+ items?: ParameterSchema;
251
+ properties?: Record<string, ParameterSchema>;
252
+ }
253
+ export interface PluginAPI {
254
+ config: PluginConfig;
255
+ registerTool: (tool: ToolDefinition) => void;
256
+ log: {
257
+ info: (message: string, data?: unknown) => void;
258
+ warn: (message: string, data?: unknown) => void;
259
+ error: (message: string, data?: unknown) => void;
260
+ debug: (message: string, data?: unknown) => void;
261
+ };
262
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * ProductBoard API Type Definitions
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvZHVjdEJvYXJkIEFQSSBUeXBlIERlZmluaXRpb25zXG4gKi9cblxuLy8gQmFzZSB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXNwb25zZTxUPiB7XG4gIGRhdGE6IFRbXTtcbiAgbGlua3M/OiB7XG4gICAgbmV4dD86IHN0cmluZztcbiAgICBwcmV2Pzogc3RyaW5nO1xuICB9O1xuICB0b3RhbFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3Ige1xuICBjb2RlOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBGZWF0dXJlIHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGZWF0dXJlU3RhdHVzO1xuICBwYXJlbnQ/OiB7XG4gICAgZmVhdHVyZT86IHsgaWQ6IHN0cmluZyB9O1xuICAgIHByb2R1Y3Q/OiB7IGlkOiBzdHJpbmcgfTtcbiAgICBjb21wb25lbnQ/OiB7IGlkOiBzdHJpbmcgfTtcbiAgfTtcbiAgb3duZXI/OiB7IGVtYWlsOiBzdHJpbmcgfTtcbiAgdGltZWZyYW1lPzogeyBzdGFydERhdGU/OiBzdHJpbmc7IGVuZERhdGU/OiBzdHJpbmcgfTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBsaW5rcz86IHtcbiAgICBzZWxmOiBzdHJpbmc7XG4gICAgaHRtbDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdHVzID1cbiAgfCAnbmV3J1xuICB8ICdpbi1wcm9ncmVzcydcbiAgfCAnc2hpcHBlZCdcbiAgfCAnYXJjaGl2ZWQnXG4gIHwgJ3Bvc3Rwb25lZCdcbiAgfCAnY2FuZGlkYXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGZWF0dXJlUGFyYW1zIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgc3RhdHVzPzogRmVhdHVyZVN0YXR1cztcbiAgcGFyZW50Pzoge1xuICAgIHByb2R1Y3Q/OiB7IGlkOiBzdHJpbmcgfTtcbiAgICBjb21wb25lbnQ/OiB7IGlkOiBzdHJpbmcgfTtcbiAgICBmZWF0dXJlPzogeyBpZDogc3RyaW5nIH07XG4gIH07XG4gIG93bmVyPzogeyBlbWFpbDogc3RyaW5nIH07XG4gIHRpbWVmcmFtZT86IHsgc3RhcnREYXRlPzogc3RyaW5nOyBlbmREYXRlPzogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmVhdHVyZVBhcmFtcyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGZWF0dXJlU3RhdHVzO1xuICBwYXJlbnQ/OiB7XG4gICAgcHJvZHVjdD86IHsgaWQ6IHN0cmluZyB9O1xuICAgIGNvbXBvbmVudD86IHsgaWQ6IHN0cmluZyB9O1xuICAgIGZlYXR1cmU/OiB7IGlkOiBzdHJpbmcgfTtcbiAgfTtcbiAgb3duZXI/OiB7IGVtYWlsOiBzdHJpbmcgfTtcbiAgdGltZWZyYW1lPzogeyBzdGFydERhdGU/OiBzdHJpbmc7IGVuZERhdGU/OiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmVhdHVyZXNQYXJhbXMge1xuICBwcm9kdWN0SWQ/OiBzdHJpbmc7XG4gIGNvbXBvbmVudElkPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGZWF0dXJlU3RhdHVzO1xuICBvd25lcklkPzogc3RyaW5nO1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xufVxuXG4vLyBQcm9kdWN0IHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG4gIGxpbmtzPzoge1xuICAgIHNlbGY6IHN0cmluZztcbiAgICBodG1sOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcGFyZW50Pzoge1xuICAgIHByb2R1Y3Q/OiB7IGlkOiBzdHJpbmcgfTtcbiAgICBjb21wb25lbnQ/OiB7IGlkOiBzdHJpbmcgfTtcbiAgfTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBsaW5rcz86IHtcbiAgICBzZWxmOiBzdHJpbmc7XG4gICAgaHRtbDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RIaWVyYXJjaHkge1xuICBwcm9kdWN0czogUHJvZHVjdFtdO1xuICBjb21wb25lbnRzOiBDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0UHJvZHVjdHNQYXJhbXMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xufVxuXG4vLyBOb3RlIHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIE5vdGUge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBkaXNwbGF5VXJsPzogc3RyaW5nO1xuICBzb3VyY2U/OiB7XG4gICAgb3JpZ2luPzogc3RyaW5nO1xuICAgIHJlY29yZF9pZD86IHN0cmluZztcbiAgfTtcbiAgdXNlcj86IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH07XG4gIGNvbXBhbnk/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfTtcbiAgdGFncz86IHN0cmluZ1tdO1xuICBmZWF0dXJlcz86IEFycmF5PHsgaWQ6IHN0cmluZyB9PjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICBsaW5rcz86IHtcbiAgICBzZWxmOiBzdHJpbmc7XG4gICAgaHRtbDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGVQYXJhbXMge1xuICB0aXRsZT86IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBkaXNwbGF5VXJsPzogc3RyaW5nO1xuICBzb3VyY2U/OiB7XG4gICAgb3JpZ2luPzogc3RyaW5nO1xuICAgIHJlY29yZF9pZD86IHN0cmluZztcbiAgfTtcbiAgdXNlcj86IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH07XG4gIGNvbXBhbnk/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfTtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3ROb3Rlc1BhcmFtcyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIGNyZWF0ZWRGcm9tPzogc3RyaW5nO1xuICBjcmVhdGVkVG8/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNoTm90ZVBhcmFtcyB7XG4gIG5vdGVJZDogc3RyaW5nO1xuICBmZWF0dXJlSWQ6IHN0cmluZztcbn1cblxuLy8gVXNlciB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgcm9sZT86IHN0cmluZztcbiAgY3JlYXRlZEF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRVc2VyIGV4dGVuZHMgVXNlciB7XG4gIHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RVc2Vyc1BhcmFtcyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBjdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8vIFNlYXJjaCB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYXJhbXMge1xuICBxdWVyeTogc3RyaW5nO1xuICB0eXBlPzogJ2ZlYXR1cmUnIHwgJ25vdGUnIHwgJ3Byb2R1Y3QnIHwgJ2NvbXBvbmVudCc7XG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdCB7XG4gIHR5cGU6ICdmZWF0dXJlJyB8ICdub3RlJyB8ICdwcm9kdWN0JyB8ICdjb21wb25lbnQnO1xuICBpZDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgY29udGVudD86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNjb3JlPzogbnVtYmVyO1xuICBsaW5rcz86IHtcbiAgICBzZWxmOiBzdHJpbmc7XG4gICAgaHRtbDogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBQbHVnaW4gY29uZmlndXJhdGlvblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Db25maWcge1xuICBhcGlUb2tlbjogc3RyaW5nO1xuICBhcGlCYXNlVXJsPzogc3RyaW5nO1xuICBjYWNoZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJhdGVMaW1pdFBlck1pbnV0ZT86IG51bWJlcjtcbn1cblxuLy8gT3BlbkNsYXcgUGx1Z2luIEFQSSB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBUb29sRGVmaW5pdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcGFyYW1ldGVyczoge1xuICAgIHR5cGU6ICdvYmplY3QnO1xuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcmFtZXRlclNjaGVtYT47XG4gICAgcmVxdWlyZWQ/OiBzdHJpbmdbXTtcbiAgfTtcbiAgaGFuZGxlcjogKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyU2NoZW1hIHtcbiAgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJyB8ICdhcnJheScgfCAnb2JqZWN0JztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGVudW0/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdD86IHVua25vd247XG4gIGl0ZW1zPzogUGFyYW1ldGVyU2NoZW1hO1xuICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgUGFyYW1ldGVyU2NoZW1hPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5BUEkge1xuICBjb25maWc6IFBsdWdpbkNvbmZpZztcbiAgcmVnaXN0ZXJUb29sOiAodG9vbDogVG9vbERlZmluaXRpb24pID0+IHZvaWQ7XG4gIGxvZzoge1xuICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHdhcm46IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIGVycm9yOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ProductBoard OpenClaw Plugin
3
+ *
4
+ * Provides integration with ProductBoard for managing features, products,
5
+ * customer feedback notes, and workspace users.
6
+ */
7
+ import { PluginAPI } from './client/types';
8
+ /**
9
+ * Plugin registration function called by OpenClaw
10
+ */
11
+ export default function register(api: PluginAPI): void;
12
+ export type { PluginAPI, PluginConfig } from './client/types';
13
+ export { ProductBoardClient } from './client/api-client';
14
+ export { ProductBoardError } from './client/errors';
package/dist/index.js ADDED
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * ProductBoard OpenClaw Plugin
4
+ *
5
+ * Provides integration with ProductBoard for managing features, products,
6
+ * customer feedback notes, and workspace users.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ProductBoardError = exports.ProductBoardClient = void 0;
10
+ exports.default = register;
11
+ const api_client_1 = require("./client/api-client");
12
+ const tools_1 = require("./tools");
13
+ /**
14
+ * Plugin registration function called by OpenClaw
15
+ */
16
+ function register(api) {
17
+ const config = api.config;
18
+ // Validate required configuration
19
+ if (!config.apiToken) {
20
+ api.log.error('ProductBoard API token is required');
21
+ throw new Error('ProductBoard API token is required. Set it in plugin configuration.');
22
+ }
23
+ api.log.info('Initializing ProductBoard plugin');
24
+ // Initialize the API client
25
+ const client = new api_client_1.ProductBoardClient(config);
26
+ // Validate token on startup (non-blocking)
27
+ validateTokenAsync(client, api);
28
+ // Register all tools
29
+ const allTools = [
30
+ ...(0, tools_1.createFeatureTools)(client),
31
+ ...(0, tools_1.createProductTools)(client),
32
+ ...(0, tools_1.createNoteTools)(client),
33
+ ...(0, tools_1.createSearchTools)(client),
34
+ ];
35
+ for (const tool of allTools) {
36
+ api.registerTool(tool);
37
+ api.log.debug(`Registered tool: ${tool.name}`);
38
+ }
39
+ api.log.info(`ProductBoard plugin initialized with ${allTools.length} tools`);
40
+ }
41
+ /**
42
+ * Validate API token asynchronously
43
+ */
44
+ async function validateTokenAsync(client, api) {
45
+ try {
46
+ const isValid = await client.validateToken();
47
+ if (isValid) {
48
+ api.log.info('ProductBoard API token validated successfully');
49
+ }
50
+ else {
51
+ api.log.warn('ProductBoard API token validation failed - requests may fail with 401');
52
+ }
53
+ }
54
+ catch (error) {
55
+ api.log.warn('Could not validate ProductBoard API token', { error });
56
+ }
57
+ }
58
+ var api_client_2 = require("./client/api-client");
59
+ Object.defineProperty(exports, "ProductBoardClient", { enumerable: true, get: function () { return api_client_2.ProductBoardClient; } });
60
+ var errors_1 = require("./client/errors");
61
+ Object.defineProperty(exports, "ProductBoardError", { enumerable: true, get: function () { return errors_1.ProductBoardError; } });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFjSCwyQkErQkM7QUEzQ0Qsb0RBQXlEO0FBRXpELG1DQUtpQjtBQUVqQjs7R0FFRztBQUNILFNBQXdCLFFBQVEsQ0FBQyxHQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFzQixDQUFDO0lBRTFDLGtDQUFrQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBRWpELDRCQUE0QjtJQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLDJDQUEyQztJQUMzQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFaEMscUJBQXFCO0lBQ3JCLE1BQU0sUUFBUSxHQUFHO1FBQ2YsR0FBRyxJQUFBLDBCQUFrQixFQUFDLE1BQU0sQ0FBQztRQUM3QixHQUFHLElBQUEsMEJBQWtCLEVBQUMsTUFBTSxDQUFDO1FBQzdCLEdBQUcsSUFBQSx1QkFBZSxFQUFDLE1BQU0sQ0FBQztRQUMxQixHQUFHLElBQUEseUJBQWlCLEVBQUMsTUFBTSxDQUFDO0tBQzdCLENBQUM7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsUUFBUSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQTBCLEVBQUUsR0FBYztJQUMxRSxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNoRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7QUFDSCxDQUFDO0FBSUQsa0RBQXlEO0FBQWhELGdIQUFBLGtCQUFrQixPQUFBO0FBQzNCLDBDQUFvRDtBQUEzQywyR0FBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvZHVjdEJvYXJkIE9wZW5DbGF3IFBsdWdpblxuICpcbiAqIFByb3ZpZGVzIGludGVncmF0aW9uIHdpdGggUHJvZHVjdEJvYXJkIGZvciBtYW5hZ2luZyBmZWF0dXJlcywgcHJvZHVjdHMsXG4gKiBjdXN0b21lciBmZWVkYmFjayBub3RlcywgYW5kIHdvcmtzcGFjZSB1c2Vycy5cbiAqL1xuXG5pbXBvcnQgeyBQcm9kdWN0Qm9hcmRDbGllbnQgfSBmcm9tICcuL2NsaWVudC9hcGktY2xpZW50JztcbmltcG9ydCB7IFBsdWdpbkFQSSwgUGx1Z2luQ29uZmlnIH0gZnJvbSAnLi9jbGllbnQvdHlwZXMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmVhdHVyZVRvb2xzLFxuICBjcmVhdGVQcm9kdWN0VG9vbHMsXG4gIGNyZWF0ZU5vdGVUb29scyxcbiAgY3JlYXRlU2VhcmNoVG9vbHMsXG59IGZyb20gJy4vdG9vbHMnO1xuXG4vKipcbiAqIFBsdWdpbiByZWdpc3RyYXRpb24gZnVuY3Rpb24gY2FsbGVkIGJ5IE9wZW5DbGF3XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyKGFwaTogUGx1Z2luQVBJKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZyA9IGFwaS5jb25maWcgYXMgUGx1Z2luQ29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25cbiAgaWYgKCFjb25maWcuYXBpVG9rZW4pIHtcbiAgICBhcGkubG9nLmVycm9yKCdQcm9kdWN0Qm9hcmQgQVBJIHRva2VuIGlzIHJlcXVpcmVkJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQcm9kdWN0Qm9hcmQgQVBJIHRva2VuIGlzIHJlcXVpcmVkLiBTZXQgaXQgaW4gcGx1Z2luIGNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cblxuICBhcGkubG9nLmluZm8oJ0luaXRpYWxpemluZyBQcm9kdWN0Qm9hcmQgcGx1Z2luJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgQVBJIGNsaWVudFxuICBjb25zdCBjbGllbnQgPSBuZXcgUHJvZHVjdEJvYXJkQ2xpZW50KGNvbmZpZyk7XG5cbiAgLy8gVmFsaWRhdGUgdG9rZW4gb24gc3RhcnR1cCAobm9uLWJsb2NraW5nKVxuICB2YWxpZGF0ZVRva2VuQXN5bmMoY2xpZW50LCBhcGkpO1xuXG4gIC8vIFJlZ2lzdGVyIGFsbCB0b29sc1xuICBjb25zdCBhbGxUb29scyA9IFtcbiAgICAuLi5jcmVhdGVGZWF0dXJlVG9vbHMoY2xpZW50KSxcbiAgICAuLi5jcmVhdGVQcm9kdWN0VG9vbHMoY2xpZW50KSxcbiAgICAuLi5jcmVhdGVOb3RlVG9vbHMoY2xpZW50KSxcbiAgICAuLi5jcmVhdGVTZWFyY2hUb29scyhjbGllbnQpLFxuICBdO1xuXG4gIGZvciAoY29uc3QgdG9vbCBvZiBhbGxUb29scykge1xuICAgIGFwaS5yZWdpc3RlclRvb2wodG9vbCk7XG4gICAgYXBpLmxvZy5kZWJ1ZyhgUmVnaXN0ZXJlZCB0b29sOiAke3Rvb2wubmFtZX1gKTtcbiAgfVxuXG4gIGFwaS5sb2cuaW5mbyhgUHJvZHVjdEJvYXJkIHBsdWdpbiBpbml0aWFsaXplZCB3aXRoICR7YWxsVG9vbHMubGVuZ3RofSB0b29sc2ApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIEFQSSB0b2tlbiBhc3luY2hyb25vdXNseVxuICovXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVRva2VuQXN5bmMoY2xpZW50OiBQcm9kdWN0Qm9hcmRDbGllbnQsIGFwaTogUGx1Z2luQVBJKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IGNsaWVudC52YWxpZGF0ZVRva2VuKCk7XG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIGFwaS5sb2cuaW5mbygnUHJvZHVjdEJvYXJkIEFQSSB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5sb2cud2FybignUHJvZHVjdEJvYXJkIEFQSSB0b2tlbiB2YWxpZGF0aW9uIGZhaWxlZCAtIHJlcXVlc3RzIG1heSBmYWlsIHdpdGggNDAxJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFwaS5sb2cud2FybignQ291bGQgbm90IHZhbGlkYXRlIFByb2R1Y3RCb2FyZCBBUEkgdG9rZW4nLCB7IGVycm9yIH0pO1xuICB9XG59XG5cbi8vIEV4cG9ydCB0eXBlcyBmb3IgY29uc3VtZXJzXG5leHBvcnQgdHlwZSB7IFBsdWdpbkFQSSwgUGx1Z2luQ29uZmlnIH0gZnJvbSAnLi9jbGllbnQvdHlwZXMnO1xuZXhwb3J0IHsgUHJvZHVjdEJvYXJkQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQvYXBpLWNsaWVudCc7XG5leHBvcnQgeyBQcm9kdWN0Qm9hcmRFcnJvciB9IGZyb20gJy4vY2xpZW50L2Vycm9ycyc7XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ProductBoard Feature Management Tools
3
+ */
4
+ import { ProductBoardClient } from '../client/api-client';
5
+ import { ToolDefinition } from '../client/types';
6
+ export declare function createFeatureTools(client: ProductBoardClient): ToolDefinition[];