@closedloop-ai/cli 0.2.0 → 0.2.2
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/CONTRIBUTING.md +437 -0
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/docs/CLI_COMMANDS.md +508 -0
- package/package.json +49 -26
- package/packages/cli/dist/api/team.js +45 -0
- package/packages/cli/dist/api/team.js.map +1 -0
- package/{dist → packages/cli/dist}/cli.js +7 -0
- package/packages/cli/dist/cli.js.map +1 -0
- package/packages/cli/dist/commands/team.js +44 -0
- package/packages/cli/dist/commands/team.js.map +1 -0
- package/dist/cli.js.map +0 -1
- package/jest.config.js +0 -14
- package/src/__tests__/cli.test.ts +0 -44
- package/src/__tests__/config.test.ts +0 -38
- package/src/__tests__/errors.test.ts +0 -132
- package/src/__tests__/setup.ts +0 -21
- package/src/__tests__/validation.test.ts +0 -156
- package/src/api/auth.ts +0 -21
- package/src/api/feedback.ts +0 -64
- package/src/api/input.ts +0 -55
- package/src/api/usage.ts +0 -45
- package/src/cli.ts +0 -158
- package/src/commands/config.ts +0 -192
- package/src/commands/feedback.ts +0 -250
- package/src/commands/input.ts +0 -389
- package/src/commands/list.ts +0 -84
- package/src/commands/status.ts +0 -96
- package/src/commands/submit.ts +0 -214
- package/src/config/constants.ts +0 -36
- package/src/config/index.ts +0 -59
- package/src/types/index.ts +0 -119
- package/src/utils/errors.ts +0 -98
- package/src/utils/validation.ts +0 -166
- package/tsconfig.json +0 -25
- /package/{dist → packages/cli/dist}/__tests__/cli.test.js +0 -0
- /package/{dist → packages/cli/dist}/__tests__/cli.test.js.map +0 -0
- /package/{dist → packages/cli/dist}/__tests__/config.test.js +0 -0
- /package/{dist → packages/cli/dist}/__tests__/config.test.js.map +0 -0
- /package/{dist → packages/cli/dist}/__tests__/errors.test.js +0 -0
- /package/{dist → packages/cli/dist}/__tests__/errors.test.js.map +0 -0
- /package/{dist → packages/cli/dist}/__tests__/setup.js +0 -0
- /package/{dist → packages/cli/dist}/__tests__/setup.js.map +0 -0
- /package/{dist → packages/cli/dist}/__tests__/validation.test.js +0 -0
- /package/{dist → packages/cli/dist}/__tests__/validation.test.js.map +0 -0
- /package/{dist → packages/cli/dist}/api/auth.js +0 -0
- /package/{dist → packages/cli/dist}/api/auth.js.map +0 -0
- /package/{dist → packages/cli/dist}/api/feedback.js +0 -0
- /package/{dist → packages/cli/dist}/api/feedback.js.map +0 -0
- /package/{dist → packages/cli/dist}/api/input.js +0 -0
- /package/{dist → packages/cli/dist}/api/input.js.map +0 -0
- /package/{dist → packages/cli/dist}/api/usage.js +0 -0
- /package/{dist → packages/cli/dist}/api/usage.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/config.js +0 -0
- /package/{dist → packages/cli/dist}/commands/config.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/feedback.js +0 -0
- /package/{dist → packages/cli/dist}/commands/feedback.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/input.js +0 -0
- /package/{dist → packages/cli/dist}/commands/input.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/list.js +0 -0
- /package/{dist → packages/cli/dist}/commands/list.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/status.js +0 -0
- /package/{dist → packages/cli/dist}/commands/status.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/submit.js +0 -0
- /package/{dist → packages/cli/dist}/commands/submit.js.map +0 -0
- /package/{dist → packages/cli/dist}/commands/usage.js +0 -0
- /package/{dist → packages/cli/dist}/commands/usage.js.map +0 -0
- /package/{dist → packages/cli/dist}/config/constants.js +0 -0
- /package/{dist → packages/cli/dist}/config/constants.js.map +0 -0
- /package/{dist → packages/cli/dist}/config/index.js +0 -0
- /package/{dist → packages/cli/dist}/config/index.js.map +0 -0
- /package/{dist → packages/cli/dist}/types/index.js +0 -0
- /package/{dist → packages/cli/dist}/types/index.js.map +0 -0
- /package/{dist → packages/cli/dist}/utils/config.js +0 -0
- /package/{dist → packages/cli/dist}/utils/config.js.map +0 -0
- /package/{dist → packages/cli/dist}/utils/errors.js +0 -0
- /package/{dist → packages/cli/dist}/utils/errors.js.map +0 -0
- /package/{dist → packages/cli/dist}/utils/validation.js +0 -0
- /package/{dist → packages/cli/dist}/utils/validation.js.map +0 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# ClosedLoop AI CLI Commands Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for all CLI commands, parameters, and user experience.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Installation](#installation)
|
|
8
|
+
- [Configuration](#configuration)
|
|
9
|
+
- [How to Use API Keys](#how-to-use-api-keys)
|
|
10
|
+
- [Input Commands](#input-commands)
|
|
11
|
+
- [Feedback Commands](#feedback-commands)
|
|
12
|
+
- [General Commands](#general-commands)
|
|
13
|
+
- [Error Handling](#error-handling)
|
|
14
|
+
- [Examples](#examples)
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
### Global Installation (Recommended)
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @closedloop-ai/cli
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Local Installation
|
|
24
|
+
```bash
|
|
25
|
+
npm install @closedloop-ai/cli
|
|
26
|
+
npx cl --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Verify Installation
|
|
30
|
+
```bash
|
|
31
|
+
cl --version
|
|
32
|
+
# Output: 0.2.0
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Configuration
|
|
36
|
+
|
|
37
|
+
### Set API Key
|
|
38
|
+
```bash
|
|
39
|
+
cl config set --api-key your-api-key-here
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### View Configuration
|
|
43
|
+
```bash
|
|
44
|
+
cl config
|
|
45
|
+
# Output:
|
|
46
|
+
# ⚙️ Configuration:
|
|
47
|
+
# ────────────────────────────────────────
|
|
48
|
+
# API Key: ✓ Configured
|
|
49
|
+
# Config File: /Users/jirikobelka/.closedloop/config.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### JSON Configuration
|
|
53
|
+
```bash
|
|
54
|
+
cl config --json
|
|
55
|
+
# Output:
|
|
56
|
+
# {
|
|
57
|
+
# "success": true,
|
|
58
|
+
# "data": {
|
|
59
|
+
# "apiKey": "test-key...",
|
|
60
|
+
# "configFile": "/Users/jirikobelka/.closedloop/config.json",
|
|
61
|
+
# "configured": true
|
|
62
|
+
# }
|
|
63
|
+
# }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Environment Variable
|
|
67
|
+
```bash
|
|
68
|
+
export CLOSEDLOOP_API_KEY="your-api-key-here"
|
|
69
|
+
cl config # Will use environment variable
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Input Commands
|
|
73
|
+
|
|
74
|
+
### Submit Customer Product Feedback
|
|
75
|
+
|
|
76
|
+
#### Basic Submission
|
|
77
|
+
```bash
|
|
78
|
+
cl input "Your customer product feedback here"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### With Metadata
|
|
82
|
+
```bash
|
|
83
|
+
cl input "The dashboard is confusing and hard to navigate" \
|
|
84
|
+
--title "Dashboard UX Issues" \
|
|
85
|
+
--customer "customer-123" \
|
|
86
|
+
--name "John Doe" \
|
|
87
|
+
--email "john@example.com" \
|
|
88
|
+
--url "https://support.example.com/ticket/456"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### Wait for Processing
|
|
92
|
+
```bash
|
|
93
|
+
cl input "Customer complaint about performance" --wait
|
|
94
|
+
# Shows real-time processing status
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### JSON Output
|
|
98
|
+
```bash
|
|
99
|
+
cl input "Great product, love the new features!" --json
|
|
100
|
+
# Output: {"id":"74e3dd87-878f-41cf-8e5a-87527bbf7770","status":"submitted"}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### List Customer Inputs
|
|
104
|
+
|
|
105
|
+
#### Basic List
|
|
106
|
+
```bash
|
|
107
|
+
cl input
|
|
108
|
+
# Shows table of recent inputs
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### With Pagination
|
|
112
|
+
```bash
|
|
113
|
+
cl input --page 2 --limit 10
|
|
114
|
+
# Shows page 2 with 10 items per page
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### JSON Output
|
|
118
|
+
```bash
|
|
119
|
+
cl input --json
|
|
120
|
+
# Output: {"data":[...],"pagination":{...}}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### View Specific Input
|
|
124
|
+
|
|
125
|
+
#### By ID
|
|
126
|
+
```bash
|
|
127
|
+
cl input 74e3dd87-878f-41cf-8e5a-87527bbf7770
|
|
128
|
+
# Shows detailed input information
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### JSON Output
|
|
132
|
+
```bash
|
|
133
|
+
cl input 74e3dd87-878f-41cf-8e5a-87527bbf7770 --json
|
|
134
|
+
# Output: {"id":"...","content":"...","status":"..."}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Input Parameters
|
|
138
|
+
|
|
139
|
+
| Parameter | Type | Required | Description | Example |
|
|
140
|
+
|-----------|------|----------|-------------|---------|
|
|
141
|
+
| `content` | string | Yes | Customer product feedback content | `"The app crashes when uploading files"` |
|
|
142
|
+
| `--title` | string | No | Title for the feedback | `"File Upload Issue"` |
|
|
143
|
+
| `--customer` | string | No | Customer identifier | `"customer-123"` |
|
|
144
|
+
| `--name` | string | No | Reporter name | `"John Doe"` |
|
|
145
|
+
| `--email` | string | No | Reporter email | `"john@example.com"` |
|
|
146
|
+
| `--url` | string | No | Source URL | `"https://support.example.com/ticket/456"` |
|
|
147
|
+
| `--wait` | flag | No | Wait for processing to complete | `--wait` |
|
|
148
|
+
| `--json` | flag | No | Output in JSON format | `--json` |
|
|
149
|
+
| `--page` | number | No | Page number for listing | `--page 2` |
|
|
150
|
+
| `--limit` | number | No | Items per page (max 100) | `--limit 20` |
|
|
151
|
+
|
|
152
|
+
## Feedback Commands
|
|
153
|
+
|
|
154
|
+
### List AI-Generated Insights
|
|
155
|
+
|
|
156
|
+
#### Basic List
|
|
157
|
+
```bash
|
|
158
|
+
cl feedback
|
|
159
|
+
# Shows table of AI-generated insights
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### With Pagination
|
|
163
|
+
```bash
|
|
164
|
+
cl feedback --page 2 --limit 5
|
|
165
|
+
# Shows page 2 with 5 items per page
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### JSON Output
|
|
169
|
+
```bash
|
|
170
|
+
cl feedback --json
|
|
171
|
+
# Output: {"data":[...],"pagination":{...}}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### View Specific Insight
|
|
175
|
+
|
|
176
|
+
#### By ID
|
|
177
|
+
```bash
|
|
178
|
+
cl feedback 2ea8f556-052b-4f5c-bf86-833780b3d00d
|
|
179
|
+
# Shows detailed insight information
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
#### JSON Output
|
|
183
|
+
```bash
|
|
184
|
+
cl feedback 2ea8f556-052b-4f5c-bf86-833780b3d00d --json
|
|
185
|
+
# Output: {"id":"...","title":"...","content":"..."}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Feedback Parameters
|
|
189
|
+
|
|
190
|
+
| Parameter | Type | Required | Description | Example |
|
|
191
|
+
|-----------|------|----------|-------------|---------|
|
|
192
|
+
| `id` | string | Yes* | Insight ID for detailed view | `2ea8f556-052b-4f5c-bf86-833780b3d00d` |
|
|
193
|
+
| `--page` | number | No | Page number for listing | `--page 2` |
|
|
194
|
+
| `--limit` | number | No | Items per page (max 100) | `--limit 20` |
|
|
195
|
+
| `--json` | flag | No | Output in JSON format | `--json` |
|
|
196
|
+
|
|
197
|
+
*Required only for detailed view
|
|
198
|
+
|
|
199
|
+
## Team Commands
|
|
200
|
+
|
|
201
|
+
### Update Team Website
|
|
202
|
+
|
|
203
|
+
#### Basic Update
|
|
204
|
+
```bash
|
|
205
|
+
cl team website update "https://example.com"
|
|
206
|
+
# Output: Team website updated successfully
|
|
207
|
+
# Website: https://example.com
|
|
208
|
+
# Updated: 2024-01-15T10:30:00Z
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### With Validation
|
|
212
|
+
```bash
|
|
213
|
+
cl team website update "https://mycompany.com"
|
|
214
|
+
# Output: Team website updated successfully
|
|
215
|
+
# Website: https://mycompany.com
|
|
216
|
+
# Updated: 2024-01-15T10:30:00Z
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Team Management
|
|
220
|
+
```bash
|
|
221
|
+
cl team
|
|
222
|
+
# Shows available team management commands
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Team Parameters
|
|
226
|
+
|
|
227
|
+
| Parameter | Type | Required | Description | Example |
|
|
228
|
+
|-----------|------|----------|-------------|---------|
|
|
229
|
+
| `website` | string | Yes | Team website URL (must include http:// or https://) | `"https://example.com"` |
|
|
230
|
+
|
|
231
|
+
### Team Error Handling
|
|
232
|
+
|
|
233
|
+
#### Invalid Website URL
|
|
234
|
+
```bash
|
|
235
|
+
cl team website update "invalid-url"
|
|
236
|
+
# Error: Invalid website URL format. Must include protocol (http:// or https://) and domain
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### Missing API Key
|
|
240
|
+
```bash
|
|
241
|
+
cl team website update "https://example.com"
|
|
242
|
+
# Error: API key not configured. Run: cl config set --api-key <key>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## General Commands
|
|
246
|
+
|
|
247
|
+
### Version
|
|
248
|
+
```bash
|
|
249
|
+
cl --version
|
|
250
|
+
# Output: 0.2.0
|
|
251
|
+
|
|
252
|
+
cl version
|
|
253
|
+
# Output: 0.2.0
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Help
|
|
257
|
+
```bash
|
|
258
|
+
cl --help
|
|
259
|
+
# Shows main help
|
|
260
|
+
|
|
261
|
+
cl help
|
|
262
|
+
# Shows main help
|
|
263
|
+
|
|
264
|
+
cl help input
|
|
265
|
+
# Shows input command help
|
|
266
|
+
|
|
267
|
+
cl help feedback
|
|
268
|
+
# Shows feedback command help
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Help Parameters
|
|
272
|
+
|
|
273
|
+
| Command | Description | Example |
|
|
274
|
+
|---------|-------------|---------|
|
|
275
|
+
| `cl --help` | Main help with all commands | `cl --help` |
|
|
276
|
+
| `cl help <command>` | Specific command help | `cl help input` |
|
|
277
|
+
|
|
278
|
+
## Error Handling
|
|
279
|
+
|
|
280
|
+
### Common Error Messages
|
|
281
|
+
|
|
282
|
+
#### No API Key
|
|
283
|
+
```bash
|
|
284
|
+
cl input "Test feedback"
|
|
285
|
+
# Error: 🔑 No API key configured!
|
|
286
|
+
#
|
|
287
|
+
# To get started:
|
|
288
|
+
# 1. Go to https://closedloop.sh
|
|
289
|
+
# 2. Sign up for a free account
|
|
290
|
+
# 3. Generate your API key
|
|
291
|
+
# 4. Run: cl config --set-api-key <your-key>
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
#### Invalid API Key
|
|
295
|
+
```bash
|
|
296
|
+
cl input "Test feedback"
|
|
297
|
+
# Error: ❌ Invalid API key. Get your free API key at https://closedloop.sh
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### Validation Error
|
|
301
|
+
```bash
|
|
302
|
+
cl input ""
|
|
303
|
+
# Error: ❌ Validation Error: Content cannot be empty
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
#### API Error
|
|
307
|
+
```bash
|
|
308
|
+
cl input "Test feedback"
|
|
309
|
+
# Error: ❌ API Error: 500 - Internal server error
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Error Codes
|
|
313
|
+
|
|
314
|
+
| Code | Description | Solution |
|
|
315
|
+
|------|-------------|----------|
|
|
316
|
+
| `NO_API_KEY` | No API key configured | Run `cl config set --api-key <key>` |
|
|
317
|
+
| `INVALID_API_KEY` | API key is invalid | Get new key from https://closedloop.sh |
|
|
318
|
+
| `VALIDATION_ERROR` | Input validation failed | Check input format and requirements |
|
|
319
|
+
| `API_ERROR` | Server error | Check internet connection, try again later |
|
|
320
|
+
| `RATE_LIMITED` | Too many requests | Wait and retry |
|
|
321
|
+
| `NOT_FOUND` | Resource not found | Check ID is correct |
|
|
322
|
+
|
|
323
|
+
## Examples
|
|
324
|
+
|
|
325
|
+
### Basic Workflow
|
|
326
|
+
```bash
|
|
327
|
+
# 1. Configure API key
|
|
328
|
+
cl config set --api-key your-api-key-here
|
|
329
|
+
|
|
330
|
+
# 2. Submit customer product feedback
|
|
331
|
+
cl input "The new dashboard is confusing and hard to navigate"
|
|
332
|
+
|
|
333
|
+
# 3. Wait for AI analysis
|
|
334
|
+
cl input "Customer complaint about performance" --wait
|
|
335
|
+
|
|
336
|
+
# 4. View AI-generated insights
|
|
337
|
+
cl feedback
|
|
338
|
+
|
|
339
|
+
# 5. Get detailed insight
|
|
340
|
+
cl feedback 2ea8f556-052b-4f5c-bf86-833780b3d00d
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Advanced Workflow
|
|
344
|
+
```bash
|
|
345
|
+
# 1. Submit with full metadata
|
|
346
|
+
cl input "Great product, love the new features!" \
|
|
347
|
+
--title "Positive Feedback" \
|
|
348
|
+
--customer "enterprise-123" \
|
|
349
|
+
--name "Jane Smith" \
|
|
350
|
+
--email "jane@example.com" \
|
|
351
|
+
--url "https://support.example.com/ticket/789"
|
|
352
|
+
|
|
353
|
+
# 2. List all inputs with pagination
|
|
354
|
+
cl input --page 1 --limit 20
|
|
355
|
+
|
|
356
|
+
# 3. Get JSON output for scripting
|
|
357
|
+
cl feedback --json | jq '.data[0].title'
|
|
358
|
+
|
|
359
|
+
# 4. View specific input details
|
|
360
|
+
cl input 74e3dd87-878f-41cf-8e5a-87527bbf7770 --json
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Scripting Examples
|
|
364
|
+
```bash
|
|
365
|
+
#!/bin/bash
|
|
366
|
+
# submit-feedback.sh
|
|
367
|
+
|
|
368
|
+
# Submit feedback and get ID
|
|
369
|
+
ID=$(cl input "$1" --json | jq -r '.id')
|
|
370
|
+
|
|
371
|
+
# Wait for processing
|
|
372
|
+
cl input "$ID" --wait
|
|
373
|
+
|
|
374
|
+
# Show results
|
|
375
|
+
cl feedback
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
#!/bin/bash
|
|
380
|
+
# get-insights.sh
|
|
381
|
+
|
|
382
|
+
# Get all insights in JSON format
|
|
383
|
+
cl feedback --json | jq '.data[] | {id: .id, title: .title, status: .status}'
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Output Formats
|
|
387
|
+
|
|
388
|
+
### Table Format (Default)
|
|
389
|
+
```
|
|
390
|
+
┌─────────────────────────────────────┬─────────────────────────────┬─────────────┬─────────────┐
|
|
391
|
+
│ ID │ Title │ Status │ Created │
|
|
392
|
+
├─────────────────────────────────────┼─────────────────────────────┼─────────────┼─────────────┤
|
|
393
|
+
│ 74e3dd87-878f-41cf-8e5a-87527bbf7770 │ Dashboard UX Issues │ completed │ 2024-01-15 │
|
|
394
|
+
│ 2ea8f556-052b-4f5c-bf86-833780b3d00d │ Performance Problems │ processing │ 2024-01-15 │
|
|
395
|
+
└─────────────────────────────────────┴─────────────────────────────┴─────────────┴─────────────┘
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### JSON Format
|
|
399
|
+
```json
|
|
400
|
+
{
|
|
401
|
+
"data": [
|
|
402
|
+
{
|
|
403
|
+
"id": "74e3dd87-878f-41cf-8e5a-87527bbf7770",
|
|
404
|
+
"title": "Dashboard UX Issues",
|
|
405
|
+
"content": "The new dashboard is confusing...",
|
|
406
|
+
"status": "completed",
|
|
407
|
+
"created_at": "2024-01-15T10:30:00Z"
|
|
408
|
+
}
|
|
409
|
+
],
|
|
410
|
+
"pagination": {
|
|
411
|
+
"page": 1,
|
|
412
|
+
"limit": 20,
|
|
413
|
+
"total": 1,
|
|
414
|
+
"pages": 1
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Best Practices
|
|
420
|
+
|
|
421
|
+
### 1. Use Descriptive Titles
|
|
422
|
+
```bash
|
|
423
|
+
# Good
|
|
424
|
+
cl input "The app crashes when uploading files" --title "File Upload Crash"
|
|
425
|
+
|
|
426
|
+
# Bad
|
|
427
|
+
cl input "App broken" --title "Issue"
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### 2. Include Customer Context
|
|
431
|
+
```bash
|
|
432
|
+
# Good
|
|
433
|
+
cl input "Feature request" --customer "enterprise-123" --name "John Doe"
|
|
434
|
+
|
|
435
|
+
# Bad
|
|
436
|
+
cl input "Feature request"
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### 3. Use JSON for Scripting
|
|
440
|
+
```bash
|
|
441
|
+
# Good
|
|
442
|
+
cl feedback --json | jq '.data[0].title'
|
|
443
|
+
|
|
444
|
+
# Bad
|
|
445
|
+
cl feedback | grep "Title"
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 4. Handle Errors Gracefully
|
|
449
|
+
```bash
|
|
450
|
+
#!/bin/bash
|
|
451
|
+
if ! cl input "$1" --wait; then
|
|
452
|
+
echo "Failed to submit feedback"
|
|
453
|
+
exit 1
|
|
454
|
+
fi
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### 5. Use Pagination for Large Datasets
|
|
458
|
+
```bash
|
|
459
|
+
# Good - increase limit for larger datasets
|
|
460
|
+
cl input --page 1 --limit 50
|
|
461
|
+
|
|
462
|
+
# Also good - use default pagination
|
|
463
|
+
cl input --page 2 # Shows 20 items per page (default)
|
|
464
|
+
|
|
465
|
+
# Bad - trying to show too many at once
|
|
466
|
+
cl input --limit 200 # Will be capped at 100 (max limit)
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
## Troubleshooting
|
|
470
|
+
|
|
471
|
+
### CLI Not Found
|
|
472
|
+
```bash
|
|
473
|
+
# Check if installed globally
|
|
474
|
+
npm list -g @closedloop-ai/cli
|
|
475
|
+
|
|
476
|
+
# Reinstall if needed
|
|
477
|
+
npm install -g @closedloop-ai/cli
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Permission Denied
|
|
481
|
+
```bash
|
|
482
|
+
# Fix npm permissions
|
|
483
|
+
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### API Key Not Working
|
|
487
|
+
```bash
|
|
488
|
+
# Check configuration
|
|
489
|
+
cl config
|
|
490
|
+
|
|
491
|
+
# Reset API key
|
|
492
|
+
cl config set --api-key your-new-key-here
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Slow Performance
|
|
496
|
+
```bash
|
|
497
|
+
# Check internet connection
|
|
498
|
+
ping mcp.closedloop.sh
|
|
499
|
+
|
|
500
|
+
# Try with smaller batches
|
|
501
|
+
cl input --limit 10
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Support
|
|
505
|
+
|
|
506
|
+
- **Documentation**: [https://docs.closedloop.sh](https://docs.closedloop.sh)
|
|
507
|
+
- **GitHub Issues**: [https://github.com/closed-loop-ai/closedloop-cli/issues](https://github.com/closed-loop-ai/closedloop-cli/issues)
|
|
508
|
+
- **Email**: support@closedloop.sh
|
package/package.json
CHANGED
|
@@ -1,42 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@closedloop-ai/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "ClosedLoop AI CLI - AI-powered customer product feedback analysis tool",
|
|
5
|
-
"main": "dist/cli.js",
|
|
6
5
|
"bin": {
|
|
7
|
-
"cl": "./dist/cli.js"
|
|
6
|
+
"cl": "./packages/cli/dist/cli.js"
|
|
8
7
|
},
|
|
9
8
|
"scripts": {
|
|
10
|
-
"build": "
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"inquirer": "^8.2.6",
|
|
21
|
-
"table": "^6.8.1"
|
|
22
|
-
},
|
|
23
|
-
"devDependencies": {
|
|
24
|
-
"@types/node": "^20.0.0",
|
|
25
|
-
"@types/inquirer": "^8.2.0",
|
|
26
|
-
"typescript": "^5.0.0",
|
|
27
|
-
"jest": "^29.0.0",
|
|
28
|
-
"ts-jest": "^29.0.0"
|
|
9
|
+
"build": "npm run build:cli",
|
|
10
|
+
"build:cli": "cd packages/cli && npm run build",
|
|
11
|
+
"test": "npm run test:cli",
|
|
12
|
+
"test:cli": "cd packages/cli && npm test",
|
|
13
|
+
"lint": "npm run lint:cli",
|
|
14
|
+
"lint:cli": "cd packages/cli && npm run lint",
|
|
15
|
+
"clean": "npm run clean:cli",
|
|
16
|
+
"clean:cli": "cd packages/cli && npm run clean",
|
|
17
|
+
"release": "npm run build && npm run test && npm publish",
|
|
18
|
+
"prepare": "npm run build"
|
|
29
19
|
},
|
|
30
20
|
"keywords": [
|
|
31
|
-
"closedloop",
|
|
32
21
|
"cli",
|
|
33
22
|
"command-line",
|
|
34
23
|
"ai",
|
|
35
24
|
"feedback",
|
|
36
25
|
"analysis",
|
|
26
|
+
"closedloop",
|
|
27
|
+
"typescript",
|
|
37
28
|
"customer-feedback",
|
|
38
|
-
"product-insights"
|
|
29
|
+
"product-insights",
|
|
30
|
+
"ai-analysis"
|
|
39
31
|
],
|
|
40
|
-
"author": "ClosedLoop AI",
|
|
41
|
-
"license": "MIT"
|
|
32
|
+
"author": "ClosedLoop AI <team@closedloop.sh>",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/closed-loop-ai/closedloop-cli.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/closed-loop-ai/closedloop-cli/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/closed-loop-ai/closedloop-cli#readme",
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=16.0.0"
|
|
44
|
+
},
|
|
45
|
+
"workspaces": [
|
|
46
|
+
"packages/cli"
|
|
47
|
+
],
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^20.0.0",
|
|
50
|
+
"typescript": "^5.0.0",
|
|
51
|
+
"jest": "^29.0.0",
|
|
52
|
+
"@types/jest": "^29.0.0",
|
|
53
|
+
"eslint": "^8.0.0",
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
55
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
56
|
+
"prettier": "^3.0.0"
|
|
57
|
+
},
|
|
58
|
+
"files": [
|
|
59
|
+
"packages/cli/dist/**/*",
|
|
60
|
+
"README.md",
|
|
61
|
+
"LICENSE",
|
|
62
|
+
"CONTRIBUTING.md",
|
|
63
|
+
"docs/**/*"
|
|
64
|
+
]
|
|
42
65
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.updateTeamWebsite = updateTeamWebsite;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
const constants_1 = require("../config/constants");
|
|
10
|
+
const errors_1 = require("../utils/errors");
|
|
11
|
+
const getClient = () => {
|
|
12
|
+
const apiKey = config_1.config.get('apiKey');
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
throw new errors_1.CliError('API key not configured. Run: cl config set --api-key <key>', errors_1.ERROR_CODES.NO_API_KEY);
|
|
15
|
+
}
|
|
16
|
+
return axios_1.default.create({
|
|
17
|
+
baseURL: constants_1.CONFIG.API_BASE_URL,
|
|
18
|
+
headers: {
|
|
19
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
},
|
|
22
|
+
timeout: 30000,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
async function updateTeamWebsite(website) {
|
|
26
|
+
// Validate website URL format
|
|
27
|
+
const websiteRegex = /^https?:\/\/.+\..+/;
|
|
28
|
+
if (!websiteRegex.test(website)) {
|
|
29
|
+
throw new Error('Invalid website URL format. Must include protocol (http:// or https://) and domain');
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const client = getClient();
|
|
33
|
+
const response = await client.post('/team/website', {
|
|
34
|
+
website
|
|
35
|
+
});
|
|
36
|
+
if (!response.data.success) {
|
|
37
|
+
throw new Error('Failed to update team website');
|
|
38
|
+
}
|
|
39
|
+
return response.data.data;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw (0, errors_1.handleApiError)(error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=team.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/api/team.ts"],"names":[],"mappings":";;;;;AA4BA,8CAqBC;AAjDD,kDAA0B;AAC1B,sCAAmC;AAEnC,mDAA6C;AAC7C,4CAAwE;AAOxE,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAQ,CAAC,4DAA4D,EAAE,oBAAW,CAAC,UAAU,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,kBAAM,CAAC,YAAY;QAC5B,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;QACD,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,8BAA8B;IAC9B,MAAM,YAAY,GAAG,oBAAoB,CAAC;IAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAA+B,eAAe,EAAE;YAChF,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -9,6 +9,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
9
9
|
const input_1 = require("./commands/input");
|
|
10
10
|
const feedback_1 = require("./commands/feedback");
|
|
11
11
|
const config_1 = require("./commands/config");
|
|
12
|
+
const team_1 = require("./commands/team");
|
|
12
13
|
const errors_1 = require("./utils/errors");
|
|
13
14
|
// Create the main program
|
|
14
15
|
const program = new commander_1.Command();
|
|
@@ -31,6 +32,9 @@ Commands:
|
|
|
31
32
|
feedback List AI-generated feedback
|
|
32
33
|
feedback <id> Show specific feedback details
|
|
33
34
|
|
|
35
|
+
team Manage team settings
|
|
36
|
+
team website update <url> Update team website
|
|
37
|
+
|
|
34
38
|
config Show current configuration
|
|
35
39
|
config set --api-key <key> Set API key
|
|
36
40
|
|
|
@@ -43,6 +47,7 @@ Examples:
|
|
|
43
47
|
$ cl input 74e3dd87-878f-41cf-8e5a-87527bbf7770
|
|
44
48
|
$ cl feedback
|
|
45
49
|
$ cl feedback 2ea8f556-052b-4f5c-bf86-833780b3d00d
|
|
50
|
+
$ cl team website update "https://example.com"
|
|
46
51
|
$ cl config set --api-key your-api-key-here
|
|
47
52
|
|
|
48
53
|
Pagination:
|
|
@@ -93,6 +98,8 @@ program
|
|
|
93
98
|
});
|
|
94
99
|
// Add config command
|
|
95
100
|
program.addCommand(config_1.configCommand);
|
|
101
|
+
// Add team command
|
|
102
|
+
program.addCommand(team_1.teamCommand);
|
|
96
103
|
// Add version command
|
|
97
104
|
program
|
|
98
105
|
.command('version')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|