@closedloop-ai/cli 0.2.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/dist/__tests__/cli.test.js +37 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/config.test.js +33 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/errors.test.js +109 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/setup.js +20 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/validation.test.js +124 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/api/auth.js +27 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/feedback.js +70 -0
- package/dist/api/feedback.js.map +1 -0
- package/dist/api/input.js +60 -0
- package/dist/api/input.js.map +1 -0
- package/dist/api/usage.js +49 -0
- package/dist/api/usage.js.map +1 -0
- package/dist/cli.js +156 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.js +186 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/feedback.js +234 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/input.js +370 -0
- package/dist/commands/input.js.map +1 -0
- package/dist/commands/list.js +81 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.js +93 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/submit.js +225 -0
- package/dist/commands/submit.js.map +1 -0
- package/dist/commands/usage.js +168 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config/constants.js +37 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.js +84 -0
- package/dist/config/index.js.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.js +55 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.js +70 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/validation.js +133 -0
- package/dist/utils/validation.js.map +1 -0
- package/jest.config.js +14 -0
- package/package.json +42 -0
- package/src/__tests__/cli.test.ts +44 -0
- package/src/__tests__/config.test.ts +38 -0
- package/src/__tests__/errors.test.ts +132 -0
- package/src/__tests__/setup.ts +21 -0
- package/src/__tests__/validation.test.ts +156 -0
- package/src/api/auth.ts +21 -0
- package/src/api/feedback.ts +64 -0
- package/src/api/input.ts +55 -0
- package/src/api/usage.ts +45 -0
- package/src/cli.ts +158 -0
- package/src/commands/config.ts +192 -0
- package/src/commands/feedback.ts +250 -0
- package/src/commands/input.ts +389 -0
- package/src/commands/list.ts +84 -0
- package/src/commands/status.ts +96 -0
- package/src/commands/submit.ts +214 -0
- package/src/config/constants.ts +36 -0
- package/src/config/index.ts +59 -0
- package/src/types/index.ts +119 -0
- package/src/utils/errors.ts +98 -0
- package/src/utils/validation.ts +166 -0
- package/tsconfig.json +25 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const input_1 = require("./commands/input");
|
|
10
|
+
const feedback_1 = require("./commands/feedback");
|
|
11
|
+
const config_1 = require("./commands/config");
|
|
12
|
+
const errors_1 = require("./utils/errors");
|
|
13
|
+
// Create the main program
|
|
14
|
+
const program = new commander_1.Command();
|
|
15
|
+
program
|
|
16
|
+
.name('cl')
|
|
17
|
+
.description('ClosedLoop AI CLI - AI-powered customer feedback analysis for product management')
|
|
18
|
+
.version('0.2.0')
|
|
19
|
+
.addHelpText('before', chalk_1.default.blue(`
|
|
20
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
21
|
+
║ ClosedLoop AI CLI v0.2.0 ║
|
|
22
|
+
║ AI-Powered Customer Feedback Analysis ║
|
|
23
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
24
|
+
`))
|
|
25
|
+
.addHelpText('after', chalk_1.default.black(`
|
|
26
|
+
Commands:
|
|
27
|
+
input [content] Submit customer input for AI analysis
|
|
28
|
+
input List all customer inputs
|
|
29
|
+
input <id> Show specific input details
|
|
30
|
+
|
|
31
|
+
feedback List AI-generated feedback
|
|
32
|
+
feedback <id> Show specific feedback details
|
|
33
|
+
|
|
34
|
+
config Show current configuration
|
|
35
|
+
config set --api-key <key> Set API key
|
|
36
|
+
|
|
37
|
+
version Show version information
|
|
38
|
+
help [command] Show help for a command
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
$ cl input "Dashboard is confusing"
|
|
42
|
+
$ cl input
|
|
43
|
+
$ cl input 74e3dd87-878f-41cf-8e5a-87527bbf7770
|
|
44
|
+
$ cl feedback
|
|
45
|
+
$ cl feedback 2ea8f556-052b-4f5c-bf86-833780b3d00d
|
|
46
|
+
$ cl config set --api-key your-api-key-here
|
|
47
|
+
|
|
48
|
+
Pagination:
|
|
49
|
+
$ cl input --page 2 --limit 10
|
|
50
|
+
$ cl feedback --page 2
|
|
51
|
+
|
|
52
|
+
Get API keys for free at https://closedloop.sh
|
|
53
|
+
`));
|
|
54
|
+
// Add input command
|
|
55
|
+
program
|
|
56
|
+
.command('input [content]')
|
|
57
|
+
.description('Submit customer input for AI analysis or list inputs')
|
|
58
|
+
.option('-t, --title <title>', 'Title for this input')
|
|
59
|
+
.option('-u, --url <url>', 'Source URL (support ticket, survey, etc.)')
|
|
60
|
+
.option('-c, --customer <id>', 'Customer identifier')
|
|
61
|
+
.option('-n, --name <name>', 'Name of person who provided the input')
|
|
62
|
+
.option('-e, --email <email>', 'Email of person who provided the input')
|
|
63
|
+
.option('--interactive', 'Fill in details step by step')
|
|
64
|
+
.option('-w, --wait', 'Wait until processing is completed')
|
|
65
|
+
.option('--json', 'Output in JSON format')
|
|
66
|
+
.option('--page <number>', 'Page number for list', '1')
|
|
67
|
+
.option('--limit <number>', 'Items per page for list', '20')
|
|
68
|
+
.option('--status <status>', 'Filter by status (processing, completed, failed)')
|
|
69
|
+
.option('--search <query>', 'Search in input content')
|
|
70
|
+
.action(async (content, options) => {
|
|
71
|
+
try {
|
|
72
|
+
await (0, input_1.handleInputCommand)(content, options);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
handleError(error, options);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Add feedback command
|
|
79
|
+
program
|
|
80
|
+
.command('feedback [id]')
|
|
81
|
+
.description('List AI-generated feedback or show specific feedback details')
|
|
82
|
+
.option('--json', 'Output in JSON format')
|
|
83
|
+
.option('--page <number>', 'Page number for list', '1')
|
|
84
|
+
.option('--limit <number>', 'Items per page for list', '20')
|
|
85
|
+
.option('--search <query>', 'Search feedback by content')
|
|
86
|
+
.action(async (id, options) => {
|
|
87
|
+
try {
|
|
88
|
+
await (0, feedback_1.handleFeedbackCommand)(id, options);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
handleError(error, options);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Add config command
|
|
95
|
+
program.addCommand(config_1.configCommand);
|
|
96
|
+
// Add version command
|
|
97
|
+
program
|
|
98
|
+
.command('version')
|
|
99
|
+
.description('Show version information')
|
|
100
|
+
.action(() => {
|
|
101
|
+
console.log(chalk_1.default.blue('ClosedLoop AI CLI v0.2.0'));
|
|
102
|
+
console.log(chalk_1.default.gray('AI-Powered Customer Feedback Analysis'));
|
|
103
|
+
console.log(chalk_1.default.gray('Get started: https://closedloop.sh'));
|
|
104
|
+
});
|
|
105
|
+
// Add help command
|
|
106
|
+
program
|
|
107
|
+
.command('help [command]')
|
|
108
|
+
.description('Show help for a command')
|
|
109
|
+
.action((command) => {
|
|
110
|
+
if (command) {
|
|
111
|
+
program.outputHelp();
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
program.outputHelp();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// Error handling function
|
|
118
|
+
function handleError(error, options) {
|
|
119
|
+
if (options.json) {
|
|
120
|
+
console.log(JSON.stringify({
|
|
121
|
+
success: false,
|
|
122
|
+
error: error.message,
|
|
123
|
+
code: error.code || 'UNKNOWN_ERROR',
|
|
124
|
+
details: error.response?.data || 'Unknown error occurred'
|
|
125
|
+
}, null, 2));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (error instanceof errors_1.CliError) {
|
|
129
|
+
console.error(chalk_1.default.red('❌ Error:'), error.message);
|
|
130
|
+
if (error.code === 'NO_API_KEY') {
|
|
131
|
+
console.log(chalk_1.default.black('\n💡 To fix:'));
|
|
132
|
+
console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
|
|
133
|
+
console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
const cliError = (0, errors_1.handleApiError)(error);
|
|
138
|
+
console.error(chalk_1.default.red('❌ Error:'), cliError.message);
|
|
139
|
+
console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
process.exit(error.exitCode || 1);
|
|
143
|
+
}
|
|
144
|
+
// Handle unknown commands
|
|
145
|
+
program.on('command:*', (operands) => {
|
|
146
|
+
console.error(chalk_1.default.red(`Unknown command: ${operands[0]}`));
|
|
147
|
+
console.log(chalk_1.default.gray('Run "cl --help" to see available commands'));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
});
|
|
150
|
+
// Parse command line arguments
|
|
151
|
+
program.parse();
|
|
152
|
+
// If no command provided, show help
|
|
153
|
+
if (!process.argv.slice(2).length) {
|
|
154
|
+
program.outputHelp();
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,4CAAsD;AACtD,kDAA4D;AAC5D,8CAAkD;AAClD,2CAA0D;AAG1D,0BAA0B;AAC1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,kFAAkF,CAAC;KAC/F,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,QAAQ,EAAE,eAAK,CAAC,IAAI,CAAC;;;;;CAKnC,CAAC,CAAC;KACA,WAAW,CAAC,OAAO,EAAE,eAAK,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnC,CAAC,CAAC,CAAC;AAEJ,oBAAoB;AACpB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;KACrD,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;KACpE,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;KACvD,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;KAC1D,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC3D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;KAC/E,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAuB,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,IAAA,0BAAkB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC3D,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,OAAuB,EAAE,EAAE;IAC5C,IAAI,CAAC;QACH,MAAM,IAAA,gCAAqB,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,qBAAqB;AACrB,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAElC,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEL,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,0BAA0B;AAC1B,SAAS,WAAW,CAAC,KAAU,EAAE,OAAuB;IACtD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,eAAe;YACnC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,wBAAwB;SAC1D,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,YAAY,iBAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,0BAA0B;AAC1B,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,oCAAoC;AACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
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.default = exports.configCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
const auth_1 = require("../api/auth");
|
|
12
|
+
const validation_1 = require("../utils/validation");
|
|
13
|
+
// Create config command
|
|
14
|
+
exports.configCommand = new commander_1.Command('config')
|
|
15
|
+
.description('Configure your API key and settings')
|
|
16
|
+
.option('--set-api-key <key>', 'Set your API key')
|
|
17
|
+
.option('--set-team <team>', 'Set your team (future feature)')
|
|
18
|
+
.option('--json', 'Output in JSON format')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
await handleConfig(options);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
handleError(error, options);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
exports.default = exports.configCommand;
|
|
28
|
+
// Create config subcommands
|
|
29
|
+
const configSetCommand = new commander_1.Command('set')
|
|
30
|
+
.description('Set configuration values')
|
|
31
|
+
.option('--api-key <key>', 'Set API key')
|
|
32
|
+
.option('--team <team>', 'Set team (future feature)')
|
|
33
|
+
.action(async (options) => {
|
|
34
|
+
try {
|
|
35
|
+
await handleConfigSet(options);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
handleError(error, options);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const configShowCommand = new commander_1.Command('show')
|
|
42
|
+
.description('Show current configuration')
|
|
43
|
+
.option('--json', 'Output in JSON format')
|
|
44
|
+
.action(async (options) => {
|
|
45
|
+
try {
|
|
46
|
+
await handleConfigShow(options);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
handleError(error, options);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Add subcommands to main config command
|
|
53
|
+
exports.configCommand.addCommand(configSetCommand);
|
|
54
|
+
exports.configCommand.addCommand(configShowCommand);
|
|
55
|
+
// Helper functions
|
|
56
|
+
async function handleConfig(options) {
|
|
57
|
+
const currentConfig = config_1.config.get();
|
|
58
|
+
if (options.setApiKey) {
|
|
59
|
+
await setApiKey(options.setApiKey, options);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (options.setTeam) {
|
|
63
|
+
console.log(chalk_1.default.yellow('⚠️ Team configuration is not yet implemented'));
|
|
64
|
+
console.log(chalk_1.default.black('This feature will be available in a future update.'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Show current config
|
|
68
|
+
await showConfig(currentConfig, options);
|
|
69
|
+
}
|
|
70
|
+
async function handleConfigSet(options) {
|
|
71
|
+
if (options.apiKey) {
|
|
72
|
+
await setApiKey(options.apiKey, options);
|
|
73
|
+
}
|
|
74
|
+
else if (options.team) {
|
|
75
|
+
console.log(chalk_1.default.yellow('⚠️ Team configuration is not yet implemented'));
|
|
76
|
+
console.log(chalk_1.default.black('This feature will be available in a future update.'));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk_1.default.red('❌ No configuration option specified'));
|
|
80
|
+
console.log(chalk_1.default.black('Use --api-key or --team to set values'));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function handleConfigShow(options) {
|
|
85
|
+
const currentConfig = config_1.config.get();
|
|
86
|
+
await showConfig(currentConfig, options);
|
|
87
|
+
}
|
|
88
|
+
async function setApiKey(apiKey, options) {
|
|
89
|
+
try {
|
|
90
|
+
// Validate API key format
|
|
91
|
+
const validatedApiKey = (0, validation_1.validateApiKey)(apiKey);
|
|
92
|
+
// Validate API key by making a test request
|
|
93
|
+
const spinner = (0, ora_1.default)('Validating API key...').start();
|
|
94
|
+
try {
|
|
95
|
+
await (0, auth_1.validateApiKey)(validatedApiKey);
|
|
96
|
+
spinner.succeed('API key validated successfully!');
|
|
97
|
+
// Save the API key
|
|
98
|
+
config_1.config.set('apiKey', validatedApiKey);
|
|
99
|
+
if (options.json) {
|
|
100
|
+
console.log(JSON.stringify({
|
|
101
|
+
success: true,
|
|
102
|
+
message: 'API key set successfully',
|
|
103
|
+
data: {
|
|
104
|
+
apiKey: validatedApiKey.substring(0, 8) + '...',
|
|
105
|
+
configFile: config_1.config.getConfigPath(),
|
|
106
|
+
configured: true
|
|
107
|
+
}
|
|
108
|
+
}, null, 2));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(chalk_1.default.green('✅ API key set successfully!'));
|
|
112
|
+
console.log(chalk_1.default.black(`Config file: ${config_1.config.getConfigPath()}`));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
spinner.fail('API key validation failed');
|
|
117
|
+
if (error.response?.status === 401) {
|
|
118
|
+
console.error(chalk_1.default.red('❌ Invalid API key'));
|
|
119
|
+
console.log(chalk_1.default.black('\n💡 To get a valid API key:'));
|
|
120
|
+
console.log(chalk_1.default.black(' 1. Visit: https://closedloop.sh'));
|
|
121
|
+
console.log(chalk_1.default.black(' 2. Sign up or log in'));
|
|
122
|
+
console.log(chalk_1.default.black(' 3. Generate an API key'));
|
|
123
|
+
console.log(chalk_1.default.black(' 4. Run: cl config set-api-key <your-key>'));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.error(chalk_1.default.red('❌ Validation Error:'), error.message);
|
|
127
|
+
console.log(chalk_1.default.black('\n💡 Check your internet connection and try again'));
|
|
128
|
+
}
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error(chalk_1.default.red('❌ Invalid API key. Get your free API key at https://closedloop.sh'));
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function showConfig(currentConfig, options) {
|
|
138
|
+
if (options.json) {
|
|
139
|
+
console.log(JSON.stringify({
|
|
140
|
+
success: true,
|
|
141
|
+
data: {
|
|
142
|
+
apiKey: currentConfig.apiKey ? currentConfig.apiKey.substring(0, 8) + '...' : null,
|
|
143
|
+
configFile: config_1.config.getConfigPath(),
|
|
144
|
+
configured: !!currentConfig.apiKey
|
|
145
|
+
}
|
|
146
|
+
}, null, 2));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.log(chalk_1.default.blue('\n⚙️ Configuration:'));
|
|
150
|
+
console.log(chalk_1.default.black('─'.repeat(40)));
|
|
151
|
+
if (currentConfig.apiKey) {
|
|
152
|
+
console.log(chalk_1.default.blue('API Key:'), chalk_1.default.green('✓ Configured'));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(chalk_1.default.blue('API Key:'), chalk_1.default.red('✗ Not configured'));
|
|
156
|
+
console.log(chalk_1.default.black('Run: cl config set-api-key <your-key>'));
|
|
157
|
+
}
|
|
158
|
+
console.log(chalk_1.default.blue('Config File:'), config_1.config.getConfigPath());
|
|
159
|
+
if (!currentConfig.apiKey) {
|
|
160
|
+
console.log(chalk_1.default.yellow('\n💡 Get started:'));
|
|
161
|
+
console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
|
|
162
|
+
console.log(chalk_1.default.black(' 2. Run: cl config set-api-key <your-key>'));
|
|
163
|
+
console.log(chalk_1.default.black(' 3. Submit your first input: cl input "Your feedback here"'));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function handleError(error, options) {
|
|
167
|
+
if (options.json) {
|
|
168
|
+
console.log(JSON.stringify({
|
|
169
|
+
success: false,
|
|
170
|
+
error: error.message,
|
|
171
|
+
details: error.response?.data || 'Unknown error occurred'
|
|
172
|
+
}, null, 2));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
|
|
176
|
+
console.error(chalk_1.default.red('❌ Connection Error:'), 'Cannot connect to ClosedLoop AI servers');
|
|
177
|
+
console.log(chalk_1.default.black('\n💡 Check your internet connection and try again'));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.error(chalk_1.default.red('❌ Error:'), error.message);
|
|
181
|
+
console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
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.handleFeedbackCommand = handleFeedbackCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const table_1 = require("table");
|
|
9
|
+
const feedback_1 = require("../api/feedback");
|
|
10
|
+
const validation_1 = require("../utils/validation");
|
|
11
|
+
// UUID regex pattern for detecting IDs
|
|
12
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
13
|
+
// Main feedback command handler
|
|
14
|
+
async function handleFeedbackCommand(id, options) {
|
|
15
|
+
// If ID provided, show specific feedback details
|
|
16
|
+
if (id) {
|
|
17
|
+
if (!(0, validation_1.validateUuid)(id)) {
|
|
18
|
+
console.log(chalk_1.default.yellow('💡 Invalid feedback ID format'));
|
|
19
|
+
console.log(chalk_1.default.black('Feedback ID should be a UUID like: 2ea8f556-052b-4f5c-bf86-833780b3d00d'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
return await showFeedback(id, options);
|
|
23
|
+
}
|
|
24
|
+
// If search query provided, search feedback
|
|
25
|
+
if (options.search) {
|
|
26
|
+
return await searchFeedback(options.search, options);
|
|
27
|
+
}
|
|
28
|
+
// Otherwise, list all feedback
|
|
29
|
+
return await listFeedback(options);
|
|
30
|
+
}
|
|
31
|
+
// Helper functions
|
|
32
|
+
async function listFeedback(options) {
|
|
33
|
+
const { page, limit } = (0, validation_1.validatePagination)(options.page, options.limit);
|
|
34
|
+
const status = options.status;
|
|
35
|
+
const search = options.search;
|
|
36
|
+
const result = await (0, feedback_1.listFeedbacks)({
|
|
37
|
+
page,
|
|
38
|
+
limit,
|
|
39
|
+
status,
|
|
40
|
+
search
|
|
41
|
+
});
|
|
42
|
+
if (options.json) {
|
|
43
|
+
console.log(JSON.stringify({ success: true, data: result }, null, 2));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const feedbacks = result.feedbacks || [];
|
|
47
|
+
if (feedbacks.length === 0) {
|
|
48
|
+
console.log(chalk_1.default.yellow('📝 No feedback found'));
|
|
49
|
+
if (search) {
|
|
50
|
+
console.log(chalk_1.default.gray(`Try a different search term or remove --search to see all feedback`));
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.log(chalk_1.default.blue('\n🎯 AI-Generated Feedback:'));
|
|
55
|
+
const tableData = [
|
|
56
|
+
[
|
|
57
|
+
chalk_1.default.bold('ID'),
|
|
58
|
+
chalk_1.default.bold('Title'),
|
|
59
|
+
chalk_1.default.bold('Severity'),
|
|
60
|
+
chalk_1.default.bold('Input ID'),
|
|
61
|
+
chalk_1.default.bold('Created')
|
|
62
|
+
]
|
|
63
|
+
];
|
|
64
|
+
feedbacks.forEach((feedback) => {
|
|
65
|
+
tableData.push([
|
|
66
|
+
feedback.id,
|
|
67
|
+
feedback.title || chalk_1.default.gray('null'),
|
|
68
|
+
feedback.severity || 'medium',
|
|
69
|
+
feedback.input_id || chalk_1.default.gray('null'),
|
|
70
|
+
feedback.timestamp ? new Date(feedback.timestamp).toLocaleString() : 'Unknown'
|
|
71
|
+
]);
|
|
72
|
+
});
|
|
73
|
+
console.log((0, table_1.table)(tableData, {
|
|
74
|
+
border: {
|
|
75
|
+
topBody: '─',
|
|
76
|
+
topJoin: '┬',
|
|
77
|
+
topLeft: '┌',
|
|
78
|
+
topRight: '┐',
|
|
79
|
+
bottomBody: '─',
|
|
80
|
+
bottomJoin: '┴',
|
|
81
|
+
bottomLeft: '└',
|
|
82
|
+
bottomRight: '┘',
|
|
83
|
+
bodyLeft: '│',
|
|
84
|
+
bodyRight: '│',
|
|
85
|
+
bodyJoin: '│',
|
|
86
|
+
joinBody: '─',
|
|
87
|
+
joinLeft: '├',
|
|
88
|
+
joinRight: '┤',
|
|
89
|
+
joinJoin: '┼'
|
|
90
|
+
}
|
|
91
|
+
}));
|
|
92
|
+
if (result.pagination) {
|
|
93
|
+
console.log(chalk_1.default.black(`\nPage ${result.pagination.page} of ${result.pagination.pages} (${result.pagination.total} total feedback)`));
|
|
94
|
+
if (result.pagination.page < result.pagination.pages) {
|
|
95
|
+
console.log(chalk_1.default.gray(`💡 Use --page ${result.pagination.page + 1} to see next page`));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function showFeedback(id, options) {
|
|
100
|
+
try {
|
|
101
|
+
const result = await (0, feedback_1.getFeedbackDetail)(id);
|
|
102
|
+
if (options.json) {
|
|
103
|
+
console.log(JSON.stringify({ success: true, data: result }, null, 2));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk_1.default.blue('\n🎯 Feedback Details:'));
|
|
107
|
+
console.log(chalk_1.default.black('─'.repeat(50)));
|
|
108
|
+
console.log(chalk_1.default.blue('ID:'), result.id);
|
|
109
|
+
console.log(chalk_1.default.blue('Title:'), result.title || chalk_1.default.gray('null'));
|
|
110
|
+
console.log(chalk_1.default.blue('Clarity:'), result.clarity || chalk_1.default.gray('null'));
|
|
111
|
+
console.log(chalk_1.default.blue('Deal Blocker:'), result.deal_blocker ? chalk_1.default.red('Yes') : chalk_1.default.green('No'));
|
|
112
|
+
console.log(chalk_1.default.blue('Pain Point:'), result.pain_point || chalk_1.default.gray('null'));
|
|
113
|
+
console.log(chalk_1.default.blue('Workaround:'), result.workaround || chalk_1.default.gray('null'));
|
|
114
|
+
console.log(chalk_1.default.blue('Competitor Gap:'), result.competitor_gap || chalk_1.default.gray('null'));
|
|
115
|
+
console.log(chalk_1.default.blue('Willingness to Pay:'), result.willingness_to_pay || chalk_1.default.gray('null'));
|
|
116
|
+
console.log(chalk_1.default.blue('Use Case:'), result.use_case || chalk_1.default.gray('null'));
|
|
117
|
+
console.log(chalk_1.default.blue('Feature Area:'), result.feature_area || chalk_1.default.gray('null'));
|
|
118
|
+
console.log(chalk_1.default.blue('Source URL:'), result.source_url || chalk_1.default.gray('null'));
|
|
119
|
+
console.log(chalk_1.default.blue('Created:'), result.timestamp ? new Date(result.timestamp).toLocaleString() : 'Unknown');
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (options.json) {
|
|
123
|
+
console.log(JSON.stringify({
|
|
124
|
+
success: false,
|
|
125
|
+
error: error.message,
|
|
126
|
+
details: error.response?.data || 'Unknown error occurred'
|
|
127
|
+
}, null, 2));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
if (error.response?.status === 404) {
|
|
131
|
+
console.error(chalk_1.default.red('❌ Feedback not found'));
|
|
132
|
+
console.log(chalk_1.default.black('The feedback ID you provided does not exist or is not accessible.'));
|
|
133
|
+
}
|
|
134
|
+
else if (error.response?.status === 401) {
|
|
135
|
+
console.error(chalk_1.default.red('❌ Authentication Error:'), 'Invalid API key');
|
|
136
|
+
console.log(chalk_1.default.black('\n💡 To fix:'));
|
|
137
|
+
console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
|
|
138
|
+
console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.error(chalk_1.default.red('❌ Error:'), error.message);
|
|
142
|
+
console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function searchFeedback(query, options) {
|
|
149
|
+
const page = parseInt(options.page) || 1;
|
|
150
|
+
const limit = parseInt(options.limit) || 20;
|
|
151
|
+
const result = await (0, feedback_1.listFeedbacks)({
|
|
152
|
+
page,
|
|
153
|
+
limit,
|
|
154
|
+
search: query
|
|
155
|
+
});
|
|
156
|
+
if (options.json) {
|
|
157
|
+
console.log(JSON.stringify({ success: true, data: result }, null, 2));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const feedbacks = result.feedbacks || [];
|
|
161
|
+
if (feedbacks.length === 0) {
|
|
162
|
+
console.log(chalk_1.default.yellow(`📝 No feedback found for "${query}"`));
|
|
163
|
+
console.log(chalk_1.default.gray('Try a different search term or remove --search to see all feedback'));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
console.log(chalk_1.default.blue(`\n🔍 Search Results for "${query}":`));
|
|
167
|
+
const tableData = [
|
|
168
|
+
[
|
|
169
|
+
chalk_1.default.bold('ID'),
|
|
170
|
+
chalk_1.default.bold('Title'),
|
|
171
|
+
chalk_1.default.bold('Severity'),
|
|
172
|
+
chalk_1.default.bold('Input ID'),
|
|
173
|
+
chalk_1.default.bold('Created')
|
|
174
|
+
]
|
|
175
|
+
];
|
|
176
|
+
feedbacks.forEach((feedback) => {
|
|
177
|
+
tableData.push([
|
|
178
|
+
feedback.id,
|
|
179
|
+
feedback.title || chalk_1.default.gray('null'),
|
|
180
|
+
feedback.severity || 'medium',
|
|
181
|
+
feedback.input_id || chalk_1.default.gray('null'),
|
|
182
|
+
feedback.timestamp ? new Date(feedback.timestamp).toLocaleString() : 'Unknown'
|
|
183
|
+
]);
|
|
184
|
+
});
|
|
185
|
+
console.log((0, table_1.table)(tableData, {
|
|
186
|
+
border: {
|
|
187
|
+
topBody: '─',
|
|
188
|
+
topJoin: '┬',
|
|
189
|
+
topLeft: '┌',
|
|
190
|
+
topRight: '┐',
|
|
191
|
+
bottomBody: '─',
|
|
192
|
+
bottomJoin: '┴',
|
|
193
|
+
bottomLeft: '└',
|
|
194
|
+
bottomRight: '┘',
|
|
195
|
+
bodyLeft: '│',
|
|
196
|
+
bodyRight: '│',
|
|
197
|
+
bodyJoin: '│',
|
|
198
|
+
joinBody: '─',
|
|
199
|
+
joinLeft: '├',
|
|
200
|
+
joinRight: '┤',
|
|
201
|
+
joinJoin: '┼'
|
|
202
|
+
}
|
|
203
|
+
}));
|
|
204
|
+
if (result.pagination) {
|
|
205
|
+
console.log(chalk_1.default.black(`Page ${result.pagination.page} of ${result.pagination.pages} (${result.pagination.total} total results)`));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function handleError(error, options) {
|
|
209
|
+
if (options.json) {
|
|
210
|
+
console.log(JSON.stringify({
|
|
211
|
+
success: false,
|
|
212
|
+
error: error.message,
|
|
213
|
+
details: error.response?.data || 'Unknown error occurred'
|
|
214
|
+
}, null, 2));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
if (error.response?.status === 404) {
|
|
218
|
+
console.error(chalk_1.default.red('❌ Not found'));
|
|
219
|
+
console.log(chalk_1.default.black('The requested resource does not exist or is not accessible.'));
|
|
220
|
+
}
|
|
221
|
+
else if (error.response?.status === 401) {
|
|
222
|
+
console.error(chalk_1.default.red('❌ Authentication Error:'), 'Invalid API key');
|
|
223
|
+
console.log(chalk_1.default.black('\n💡 To fix:'));
|
|
224
|
+
console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
|
|
225
|
+
console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.error(chalk_1.default.red('❌ Error:'), error.message);
|
|
229
|
+
console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
|