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 ADDED
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2026-01-30
9
+
10
+ ### Added
11
+
12
+ - Initial release of OpenClaw ProductBoard plugin
13
+ - **15 Agent Tools**:
14
+ - Feature management: `pb_feature_create`, `pb_feature_list`, `pb_feature_get`, `pb_feature_update`, `pb_feature_delete`, `pb_feature_search`
15
+ - Product management: `pb_product_list`, `pb_product_get`, `pb_product_hierarchy`
16
+ - Notes & feedback: `pb_note_create`, `pb_note_list`, `pb_note_attach`
17
+ - Search & users: `pb_search`, `pb_user_current`, `pb_user_list`
18
+ - **3 Skills**:
19
+ - `productboard-search` - Search and explore ProductBoard data
20
+ - `productboard-feedback` - Capture customer feedback
21
+ - `productboard-release` - Release planning workflows
22
+ - **Core Features**:
23
+ - Bearer token authentication
24
+ - LRU caching with configurable TTL
25
+ - Token bucket rate limiting
26
+ - Automatic retries with exponential backoff
27
+ - Comprehensive error handling
28
+ - Full TypeScript support
29
+
30
+ ### Technical Details
31
+
32
+ - Built with TypeScript 5.3+
33
+ - Uses axios for HTTP requests
34
+ - Uses lru-cache for caching
35
+ - Targets Node.js 18+
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Roberto Moreno
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # OpenClaw ProductBoard Plugin
2
+
3
+ A lean, fast OpenClaw plugin for ProductBoard integration. Provides 15 agent tools for managing features, products, customer feedback notes, and workspace users, plus 3 skills for common workflows.
4
+
5
+ ## Features
6
+
7
+ - **15 Agent Tools** for full ProductBoard API coverage
8
+ - **3 Skills** for search, feedback capture, and release planning
9
+ - **LRU Caching** with configurable TTL for read operations
10
+ - **Rate Limiting** with token bucket algorithm
11
+ - **Automatic Retries** with exponential backoff
12
+ - **Bearer Token Authentication**
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ openclaw plugins install -l ./openclaw-productboard
18
+ ```
19
+
20
+ Or install from npm (coming soon):
21
+
22
+ ```bash
23
+ openclaw plugins install openclaw-productboard
24
+ ```
25
+
26
+ ## Configuration
27
+
28
+ Add your ProductBoard API token to your OpenClaw configuration:
29
+
30
+ ```json
31
+ {
32
+ "plugins": {
33
+ "entries": {
34
+ "productboard": {
35
+ "config": {
36
+ "apiToken": "pb_your_api_token_here",
37
+ "apiBaseUrl": "https://api.productboard.com",
38
+ "cacheTtlSeconds": 300,
39
+ "rateLimitPerMinute": 100
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### Configuration Options
48
+
49
+ | Option | Type | Required | Default | Description |
50
+ |--------|------|----------|---------|-------------|
51
+ | `apiToken` | string | Yes | - | ProductBoard API bearer token |
52
+ | `apiBaseUrl` | string | No | `https://api.productboard.com` | API base URL |
53
+ | `cacheTtlSeconds` | number | No | `300` | Cache TTL for read operations |
54
+ | `rateLimitPerMinute` | number | No | `100` | Max API requests per minute |
55
+
56
+ ### Getting Your API Token
57
+
58
+ 1. Log in to ProductBoard
59
+ 2. Go to **Settings** → **Integrations** → **Public API**
60
+ 3. Generate a new API token
61
+ 4. Copy the token and add it to your configuration
62
+
63
+ ## Agent Tools
64
+
65
+ ### Feature Management (6 tools)
66
+
67
+ | Tool | Description |
68
+ |------|-------------|
69
+ | `pb_feature_create` | Create a new feature |
70
+ | `pb_feature_list` | List features with optional filters |
71
+ | `pb_feature_get` | Get detailed feature information |
72
+ | `pb_feature_update` | Update an existing feature |
73
+ | `pb_feature_delete` | Archive/delete a feature |
74
+ | `pb_feature_search` | Search features by name or description |
75
+
76
+ ### Product Management (3 tools)
77
+
78
+ | Tool | Description |
79
+ |------|-------------|
80
+ | `pb_product_list` | List all products |
81
+ | `pb_product_get` | Get product details with components |
82
+ | `pb_product_hierarchy` | Get complete product/component tree |
83
+
84
+ ### Notes & Feedback (3 tools)
85
+
86
+ | Tool | Description |
87
+ |------|-------------|
88
+ | `pb_note_create` | Create customer feedback note |
89
+ | `pb_note_list` | List notes with date filters |
90
+ | `pb_note_attach` | Attach note to a feature |
91
+
92
+ ### Search & Users (3 tools)
93
+
94
+ | Tool | Description |
95
+ |------|-------------|
96
+ | `pb_search` | Global search across all entities |
97
+ | `pb_user_current` | Get current authenticated user |
98
+ | `pb_user_list` | List workspace users |
99
+
100
+ ## Skills
101
+
102
+ ### ProductBoard Search (`/productboard-search`)
103
+
104
+ Search and explore your ProductBoard workspace. Find features, products, components, and customer feedback using natural language queries.
105
+
106
+ ```
107
+ /productboard-search
108
+ ```
109
+
110
+ ### ProductBoard Feedback (`/productboard-feedback`)
111
+
112
+ Capture customer feedback and link it to features. Create notes from support tickets, user interviews, or any customer interaction.
113
+
114
+ ```
115
+ /productboard-feedback
116
+ ```
117
+
118
+ ### ProductBoard Release (`/productboard-release`)
119
+
120
+ Plan and manage releases by organizing features, tracking progress, and updating statuses. (Internal skill, not user-invocable)
121
+
122
+ ## Usage Examples
123
+
124
+ ### Create a Feature
125
+
126
+ ```
127
+ Create a new feature called "Dark Mode Support" in ProductBoard with status "candidate"
128
+ ```
129
+
130
+ ### Search Features
131
+
132
+ ```
133
+ Search ProductBoard for features related to "authentication"
134
+ ```
135
+
136
+ ### Capture Customer Feedback
137
+
138
+ ```
139
+ Create a note in ProductBoard: "Customer requested ability to export reports to PDF"
140
+ from user john@acme.com at Acme Corp, tagged as "feature-request"
141
+ ```
142
+
143
+ ### View Product Structure
144
+
145
+ ```
146
+ Show me the ProductBoard product hierarchy
147
+ ```
148
+
149
+ ## Development
150
+
151
+ ### Prerequisites
152
+
153
+ - Node.js 18+
154
+ - npm or yarn
155
+
156
+ ### Setup
157
+
158
+ ```bash
159
+ # Install dependencies
160
+ npm install
161
+
162
+ # Build
163
+ npm run build
164
+
165
+ # Watch mode
166
+ npm run dev
167
+ ```
168
+
169
+ ### Project Structure
170
+
171
+ ```
172
+ openclaw-productboard/
173
+ ├── openclaw.plugin.json # Plugin manifest
174
+ ├── package.json # Dependencies
175
+ ├── tsconfig.json # TypeScript config
176
+ ├── src/
177
+ │ ├── index.ts # Plugin entry point
178
+ │ ├── client/
179
+ │ │ ├── api-client.ts # ProductBoard API client
180
+ │ │ ├── types.ts # TypeScript types
181
+ │ │ └── errors.ts # Error handling
182
+ │ ├── tools/
183
+ │ │ ├── features.ts # Feature tools
184
+ │ │ ├── products.ts # Product tools
185
+ │ │ ├── notes.ts # Note tools
186
+ │ │ └── search.ts # Search & user tools
187
+ │ └── utils/
188
+ │ ├── cache.ts # LRU cache
189
+ │ └── rate-limiter.ts # Rate limiting
190
+ └── skills/
191
+ ├── productboard-search/
192
+ ├── productboard-feedback/
193
+ └── productboard-release/
194
+ ```
195
+
196
+ ## API Reference
197
+
198
+ This plugin uses the [ProductBoard Public API](https://developer.productboard.com/). The following endpoints are utilized:
199
+
200
+ - `GET/POST/PATCH/DELETE /features` - Feature management
201
+ - `GET /products` - Product listing
202
+ - `GET /components` - Component listing
203
+ - `GET/POST /notes` - Note management
204
+ - `POST /notes/{id}/connections` - Note-feature linking
205
+ - `GET /users` - User listing
206
+ - `GET /users/me` - Current user
207
+
208
+ ## Error Handling
209
+
210
+ The plugin handles common API errors gracefully:
211
+
212
+ - **401 Unauthorized** - Invalid or expired API token
213
+ - **403 Forbidden** - Insufficient permissions
214
+ - **404 Not Found** - Resource doesn't exist
215
+ - **429 Rate Limited** - Automatic retry with backoff
216
+ - **5xx Server Errors** - Automatic retry with exponential backoff
217
+
218
+ ## License
219
+
220
+ MIT
221
+
222
+ ## Contributing
223
+
224
+ Contributions are welcome! Please open an issue or submit a pull request.
225
+
226
+ ## Links
227
+
228
+ - [ProductBoard](https://www.productboard.com/)
229
+ - [ProductBoard API Documentation](https://developer.productboard.com/)
230
+ - [OpenClaw](https://openclaw.dev/)
@@ -0,0 +1,64 @@
1
+ /**
2
+ * ProductBoard API Client
3
+ */
4
+ import { Feature, Product, Component, Note, User, CurrentUser, SearchResult, CreateFeatureParams, UpdateFeatureParams, ListFeaturesParams, ListProductsParams, CreateNoteParams, ListNotesParams, ListUsersParams, SearchParams, PluginConfig, ProductHierarchy } from './types';
5
+ export declare class ProductBoardClient {
6
+ private client;
7
+ private cache;
8
+ private rateLimiter;
9
+ private baseUrl;
10
+ constructor(config: PluginConfig);
11
+ private setupInterceptors;
12
+ /**
13
+ * Execute a request with retry logic and rate limiting
14
+ */
15
+ private request;
16
+ private sleep;
17
+ /**
18
+ * Paginate through all results
19
+ */
20
+ private paginate;
21
+ createFeature(params: CreateFeatureParams): Promise<Feature>;
22
+ listFeatures(params?: ListFeaturesParams): Promise<Feature[]>;
23
+ getFeature(id: string): Promise<Feature>;
24
+ updateFeature(id: string, params: UpdateFeatureParams): Promise<Feature>;
25
+ deleteFeature(id: string): Promise<void>;
26
+ searchFeatures(query: string, limit?: number): Promise<Feature[]>;
27
+ listProducts(params?: ListProductsParams): Promise<Product[]>;
28
+ getProduct(id: string): Promise<Product>;
29
+ listComponents(params?: {
30
+ productId?: string;
31
+ limit?: number;
32
+ }): Promise<Component[]>;
33
+ getProductHierarchy(): Promise<ProductHierarchy>;
34
+ createNote(params: CreateNoteParams): Promise<Note>;
35
+ listNotes(params?: ListNotesParams): Promise<Note[]>;
36
+ getNote(id: string): Promise<Note>;
37
+ attachNoteToFeature(noteId: string, featureId: string): Promise<void>;
38
+ getCurrentUser(): Promise<CurrentUser>;
39
+ listUsers(params?: ListUsersParams): Promise<User[]>;
40
+ search(params: SearchParams): Promise<SearchResult[]>;
41
+ /**
42
+ * Validate the API token by making a test request
43
+ */
44
+ validateToken(): Promise<boolean>;
45
+ /**
46
+ * Clear all cached data
47
+ */
48
+ clearCache(): void;
49
+ /**
50
+ * Get cache statistics
51
+ */
52
+ getCacheStats(): {
53
+ size: number;
54
+ max: number;
55
+ };
56
+ /**
57
+ * Get rate limiter statistics
58
+ */
59
+ getRateLimiterStats(): {
60
+ tokens: number;
61
+ maxTokens: number;
62
+ waitTime: number;
63
+ };
64
+ }