@closedloop-ai/cli 0.2.4 → 0.3.1

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.
Files changed (71) hide show
  1. package/README.md +176 -270
  2. package/dist/THIRD_PARTY_NOTICES.txt +24 -0
  3. package/dist/closedloop.js +156 -0
  4. package/package.json +31 -62
  5. package/CONTRIBUTING.md +0 -437
  6. package/LICENSE +0 -21
  7. package/docs/CLI_COMMANDS.md +0 -522
  8. package/packages/cli/dist/__tests__/api.test.js +0 -151
  9. package/packages/cli/dist/__tests__/api.test.js.map +0 -1
  10. package/packages/cli/dist/__tests__/cli.test.js +0 -37
  11. package/packages/cli/dist/__tests__/cli.test.js.map +0 -1
  12. package/packages/cli/dist/__tests__/config.test.js +0 -33
  13. package/packages/cli/dist/__tests__/config.test.js.map +0 -1
  14. package/packages/cli/dist/__tests__/errors.test.js +0 -109
  15. package/packages/cli/dist/__tests__/errors.test.js.map +0 -1
  16. package/packages/cli/dist/__tests__/performance.test.js +0 -221
  17. package/packages/cli/dist/__tests__/performance.test.js.map +0 -1
  18. package/packages/cli/dist/__tests__/setup.js +0 -50
  19. package/packages/cli/dist/__tests__/setup.js.map +0 -1
  20. package/packages/cli/dist/__tests__/team-simple.test.js +0 -38
  21. package/packages/cli/dist/__tests__/team-simple.test.js.map +0 -1
  22. package/packages/cli/dist/__tests__/test-factories.js +0 -148
  23. package/packages/cli/dist/__tests__/test-factories.js.map +0 -1
  24. package/packages/cli/dist/__tests__/validation.test.js +0 -124
  25. package/packages/cli/dist/__tests__/validation.test.js.map +0 -1
  26. package/packages/cli/dist/api/auth.js +0 -27
  27. package/packages/cli/dist/api/auth.js.map +0 -1
  28. package/packages/cli/dist/api/feedback.js +0 -70
  29. package/packages/cli/dist/api/feedback.js.map +0 -1
  30. package/packages/cli/dist/api/ingest.js +0 -60
  31. package/packages/cli/dist/api/ingest.js.map +0 -1
  32. package/packages/cli/dist/api/input.js +0 -60
  33. package/packages/cli/dist/api/input.js.map +0 -1
  34. package/packages/cli/dist/api/team.js +0 -59
  35. package/packages/cli/dist/api/team.js.map +0 -1
  36. package/packages/cli/dist/api/usage.js +0 -49
  37. package/packages/cli/dist/api/usage.js.map +0 -1
  38. package/packages/cli/dist/cli.js +0 -201
  39. package/packages/cli/dist/cli.js.map +0 -1
  40. package/packages/cli/dist/commands/config.js +0 -186
  41. package/packages/cli/dist/commands/config.js.map +0 -1
  42. package/packages/cli/dist/commands/feedback.js +0 -234
  43. package/packages/cli/dist/commands/feedback.js.map +0 -1
  44. package/packages/cli/dist/commands/ingest.js +0 -391
  45. package/packages/cli/dist/commands/ingest.js.map +0 -1
  46. package/packages/cli/dist/commands/input.js +0 -370
  47. package/packages/cli/dist/commands/input.js.map +0 -1
  48. package/packages/cli/dist/commands/insight.js +0 -234
  49. package/packages/cli/dist/commands/insight.js.map +0 -1
  50. package/packages/cli/dist/commands/list.js +0 -81
  51. package/packages/cli/dist/commands/list.js.map +0 -1
  52. package/packages/cli/dist/commands/status.js +0 -93
  53. package/packages/cli/dist/commands/status.js.map +0 -1
  54. package/packages/cli/dist/commands/submit.js +0 -225
  55. package/packages/cli/dist/commands/submit.js.map +0 -1
  56. package/packages/cli/dist/commands/team.js +0 -82
  57. package/packages/cli/dist/commands/team.js.map +0 -1
  58. package/packages/cli/dist/commands/usage.js +0 -168
  59. package/packages/cli/dist/commands/usage.js.map +0 -1
  60. package/packages/cli/dist/config/constants.js +0 -38
  61. package/packages/cli/dist/config/constants.js.map +0 -1
  62. package/packages/cli/dist/config/index.js +0 -84
  63. package/packages/cli/dist/config/index.js.map +0 -1
  64. package/packages/cli/dist/types/index.js +0 -3
  65. package/packages/cli/dist/types/index.js.map +0 -1
  66. package/packages/cli/dist/utils/config.js +0 -55
  67. package/packages/cli/dist/utils/config.js.map +0 -1
  68. package/packages/cli/dist/utils/errors.js +0 -70
  69. package/packages/cli/dist/utils/errors.js.map +0 -1
  70. package/packages/cli/dist/utils/validation.js +0 -133
  71. package/packages/cli/dist/utils/validation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/api/usage.ts"],"names":[],"mappings":";;;;;AAwBA,8BAUC;AAED,wCAQC;AA5CD,kDAA0B;AAC1B,sCAAmC;AAEnC,mDAAuD;AACvD,4CAAwE;AAExE,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,oBAAQ,CAAC,UAAU,EAAE,oBAAW,CAAC,UAAU,CAAC,CAAC;IAClE,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;YAClC,YAAY,EAAE,kBAAM,CAAC,UAAU;SAChC;QACD,OAAO,EAAE,kBAAM,CAAC,UAAU;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC;AAEK,KAAK,UAAU,SAAS,CAAC,OAAe,CAAC,EAAE,QAAgB,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,EAAU;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -1,201 +0,0 @@
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 ingest_1 = require("./commands/ingest");
10
- const insight_1 = require("./commands/insight");
11
- const config_1 = require("./commands/config");
12
- const team_1 = require("./commands/team");
13
- const errors_1 = require("./utils/errors");
14
- const constants_1 = require("./config/constants");
15
- // Create the main program
16
- const program = new commander_1.Command();
17
- program
18
- .name('cl')
19
- .description('ClosedLoop AI CLI - AI-powered customer feedback analysis for product management')
20
- .version(constants_1.VERSION)
21
- .addHelpText('before', chalk_1.default.blue(`
22
- ╔══════════════════════════════════════════════════════════════════════════════╗
23
- ║ ClosedLoop AI CLI v${constants_1.VERSION} ║
24
- ║ AI-Powered Customer Feedback Analysis ║
25
- ╚══════════════════════════════════════════════════════════════════════════════╝
26
- `))
27
- .addHelpText('after', chalk_1.default.black(`
28
- Commands:
29
- ingest [content] Ingest customer feedback for AI analysis
30
- --customer <id> Customer identifier
31
- --name <name> Reporter name
32
- --email <email> Reporter email
33
- --title <title> Title for this input
34
- --url <url> Source URL (support ticket, survey, etc.)
35
- --file <path> Read content from file
36
- --wait Wait for processing to complete
37
- --interactive Fill in details step by step
38
- ingest List all ingested feedback
39
- ingest <id> Show specific ingested feedback details
40
-
41
- insight List AI-generated insights
42
- insight <id> Show specific insight details
43
-
44
- team Manage team settings
45
- team website update <url> Update team website
46
-
47
- config Show current configuration
48
- config set --api-key <key> Set API key
49
-
50
- version Show version information
51
- help [command] Show help for a command
52
-
53
- Examples:
54
- $ cl ingest "Dashboard is confusing"
55
- $ cl ingest "App crashes" --customer "user-123" --wait
56
- $ cl ingest --file feedback.txt --customer "user-456"
57
- $ cl ingest --interactive
58
- $ cl ingest
59
- $ cl ingest 74e3dd87-878f-41cf-8e5a-87527bbf7770
60
- $ cl insight
61
- $ cl insight 2ea8f556-052b-4f5c-bf86-833780b3d00d
62
- $ cl team website update "https://example.com"
63
- $ cl config set --api-key your-api-key-here
64
-
65
- Pagination:
66
- $ cl ingest --page 2 --limit 10
67
- $ cl insight --page 2
68
-
69
- Get API keys for free at https://closedloop.sh
70
- `));
71
- // Add ingest command
72
- program
73
- .command('ingest [content]')
74
- .description('Ingest customer feedback for AI analysis or list ingested feedback')
75
- .option('-t, --title <title>', 'Title for this input')
76
- .option('-u, --url <url>', 'Source URL (support ticket, survey, etc.)')
77
- .option('-c, --customer <id>', 'Customer identifier')
78
- .option('-n, --name <name>', 'Name of person who provided the input')
79
- .option('-e, --email <email>', 'Email of person who provided the input')
80
- .option('-f, --file <path>', 'Read content from file')
81
- .option('--interactive', 'Fill in details step by step')
82
- .option('-w, --wait', 'Wait until processing is completed')
83
- .option('--json', 'Output in JSON format')
84
- .option('--page <number>', 'Page number for list', '1')
85
- .option('--limit <number>', 'Items per page for list', '20')
86
- .option('--status <status>', 'Filter by status (processing, completed, failed)')
87
- .option('--search <query>', 'Search in input content')
88
- .action(async (content, options) => {
89
- try {
90
- await (0, ingest_1.handleIngestCommand)(content, options);
91
- }
92
- catch (error) {
93
- handleError(error, options);
94
- }
95
- });
96
- // Add insight command
97
- program
98
- .command('insight [id]')
99
- .description('List AI-generated insights or show specific insight details')
100
- .option('--json', 'Output in JSON format')
101
- .option('--page <number>', 'Page number for list', '1')
102
- .option('--limit <number>', 'Items per page for list', '20')
103
- .option('--search <query>', 'Search insights by content')
104
- .action(async (id, options) => {
105
- try {
106
- await (0, insight_1.handleInsightCommand)(id, options);
107
- }
108
- catch (error) {
109
- handleError(error, options);
110
- }
111
- });
112
- // Add config command
113
- program.addCommand(config_1.configCommand);
114
- // Add team command
115
- program.addCommand(team_1.teamCommand);
116
- // Add backward compatibility alias for input command
117
- program
118
- .command('input [content]')
119
- .description('Alias for ingest command (deprecated)')
120
- .option('-t, --title <title>', 'Title for this input')
121
- .option('-u, --url <url>', 'Source URL (support ticket, survey, etc.)')
122
- .option('-c, --customer <id>', 'Customer identifier')
123
- .option('-n, --name <name>', 'Name of person who provided the input')
124
- .option('-e, --email <email>', 'Email of person who provided the input')
125
- .option('--interactive', 'Fill in details step by step')
126
- .option('-w, --wait', 'Wait until processing is completed')
127
- .option('--json', 'Output in JSON format')
128
- .option('--page <number>', 'Page number for list', '1')
129
- .option('--limit <number>', 'Items per page for list', '20')
130
- .option('--status <status>', 'Filter by status (processing, completed, failed)')
131
- .option('--search <query>', 'Search in input content')
132
- .action(async (content, options) => {
133
- console.log(chalk_1.default.yellow('⚠️ "input" is deprecated. Use "ingest" instead.'));
134
- try {
135
- await (0, ingest_1.handleIngestCommand)(content, options);
136
- }
137
- catch (error) {
138
- handleError(error, options);
139
- }
140
- });
141
- // Add version command
142
- program
143
- .command('version')
144
- .description('Show version information')
145
- .action(() => {
146
- console.log(chalk_1.default.blue(`ClosedLoop AI CLI v${constants_1.VERSION}`));
147
- console.log(chalk_1.default.gray('AI-Powered Customer Feedback Analysis'));
148
- console.log(chalk_1.default.gray('Get started: https://closedloop.sh'));
149
- });
150
- // Add help command
151
- program
152
- .command('help [command]')
153
- .description('Show help for a command')
154
- .action((command) => {
155
- if (command) {
156
- program.outputHelp();
157
- }
158
- else {
159
- program.outputHelp();
160
- }
161
- });
162
- // Error handling function
163
- function handleError(error, options) {
164
- if (options.json) {
165
- console.log(JSON.stringify({
166
- success: false,
167
- error: error.message,
168
- code: error.code || 'UNKNOWN_ERROR',
169
- details: error.response?.data || 'Unknown error occurred'
170
- }, null, 2));
171
- }
172
- else {
173
- if (error instanceof errors_1.CliError) {
174
- console.error(chalk_1.default.red('❌ Error:'), error.message);
175
- if (error.code === 'NO_API_KEY') {
176
- console.log(chalk_1.default.black('\n💡 To fix:'));
177
- console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
178
- console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
179
- }
180
- }
181
- else {
182
- const cliError = (0, errors_1.handleApiError)(error);
183
- console.error(chalk_1.default.red('❌ Error:'), cliError.message);
184
- console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
185
- }
186
- }
187
- process.exit(error.exitCode || 1);
188
- }
189
- // Handle unknown commands
190
- program.on('command:*', (operands) => {
191
- console.error(chalk_1.default.red(`Unknown command: ${operands[0]}`));
192
- console.log(chalk_1.default.gray('Run "cl --help" to see available commands'));
193
- process.exit(1);
194
- });
195
- // Parse command line arguments
196
- program.parse();
197
- // If no command provided, show help
198
- if (!process.argv.slice(2).length) {
199
- program.outputHelp();
200
- }
201
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,186 +0,0 @@
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. Ingest your first feedback: cl ingest "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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1,234 +0,0 @@
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.handleInsightCommand = handleInsightCommand;
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 insight command handler
14
- async function handleInsightCommand(id, options) {
15
- // If ID provided, show specific insight details
16
- if (id) {
17
- if (!(0, validation_1.validateUuid)(id)) {
18
- console.log(chalk_1.default.yellow('💡 Invalid insight ID format'));
19
- console.log(chalk_1.default.black('Insight ID should be a UUID like: 2ea8f556-052b-4f5c-bf86-833780b3d00d'));
20
- return;
21
- }
22
- return await showInsight(id, options);
23
- }
24
- // If search query provided, search insights
25
- if (options.search) {
26
- return await searchInsight(options.search, options);
27
- }
28
- // Otherwise, list all insights
29
- return await listInsight(options);
30
- }
31
- // Helper functions
32
- async function listInsight(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 insights found'));
49
- if (search) {
50
- console.log(chalk_1.default.gray(`Try a different search term or remove --search to see all insights`));
51
- }
52
- return;
53
- }
54
- console.log(chalk_1.default.blue('\n🎯 AI-Generated Insights:'));
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 insights)`));
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 showInsight(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🎯 Insight 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('❌ Insight not found'));
132
- console.log(chalk_1.default.black('The insight 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 searchInsight(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 insights found for "${query}"`));
163
- console.log(chalk_1.default.gray('Try a different search term or remove --search to see all insights'));
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