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.
- package/CHANGELOG.md +35 -0
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/client/api-client.d.ts +64 -0
- package/dist/client/api-client.js +379 -0
- package/dist/client/errors.d.ts +51 -0
- package/dist/client/errors.js +128 -0
- package/dist/client/types.d.ts +262 -0
- package/dist/client/types.js +6 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +62 -0
- package/dist/tools/features.d.ts +6 -0
- package/dist/tools/features.js +318 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/notes.d.ts +6 -0
- package/dist/tools/notes.js +176 -0
- package/dist/tools/products.d.ts +6 -0
- package/dist/tools/products.js +148 -0
- package/dist/tools/search.d.ts +6 -0
- package/dist/tools/search.js +116 -0
- package/dist/utils/cache.d.ts +54 -0
- package/dist/utils/cache.js +123 -0
- package/dist/utils/rate-limiter.d.ts +58 -0
- package/dist/utils/rate-limiter.js +118 -0
- package/openclaw.plugin.json +57 -0
- package/package.json +53 -0
- package/skills/productboard-feedback/SKILL.md +105 -0
- package/skills/productboard-release/SKILL.md +146 -0
- package/skills/productboard-search/SKILL.md +62 -0
|
@@ -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=
|
package/dist/index.d.ts
ADDED
|
@@ -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=
|